如何让使用 Amazon EC2 启动类型的 Amazon ECS 任务通过应用程序负载均衡器运行状况检查?
我想对在我的 Amazon Elastic Compute Cloud (Amazon EC2) 实例上运行的 Amazon Elastic Container Service (Amazon ECS) 任务进行应用程序负载均衡器运行状况检查时遇到的问题进行故障排除并解决。
简短描述
如果您的 Amazon ECS 任务未通过负载均衡器运行状况检查,您会收到来自 Amazon ECS 服务事件消息的以下错误消息之一:
- "(service AWS-service) (port 8080) is unhealthy in (target-group arn:aws:elasticloadbalancing:us-east-1:111111111111:targetgroup/aws-targetgroup/123456789) due to (reason Health checks failed with these codes: [502 or 504]) or (request timeout)"
- "(service AWS-Service) (port 8080) is unhealthy in target-group tf-20190411170 due to (reason Health checks failed)"
- "(service AWS-Service) (instance i-1234567890abcdefg) (port 443) is unhealthy in (target-group arn:aws:elasticloadbalancing:us-east-1:111111111111:targetgroup/aws-targetgroup/123456789) due to (reason Health checks failed)"
您可能会从 Amazon ECS 任务控制台收到以下错误:
"Task failed ELB health checks in (target-group arn:aws:elasticloadbalancing:us-east-1:111111111111:targetgroup/aws-targetgroup/123456789)"
有关容器运行状况检查失败的问题,请参阅如何对 Amazon ECS 任务的容器运行状况检查失败问题进行故障排除?
要确定您的 Amazon ECS 任务停止的原因,请参阅查看 Amazon ECS 已停止任务错误和为什么我的 Amazon ECS 任务停止了?
解决方法
**注意:**如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI。
配置不同的安全组
最佳做法是配置不同的安全组,以允许负载均衡器与容器实例或任务弹性网络接口之间的所有流量。您还可以将容器实例配置为接受任务指定端口上的流量。
在您的配置中,检查以下设置:
- 与负载均衡器关联的安全组允许出站流量通过注册端口流向容器实例或任务网络接口。此外,允许出站流量通过运行状况检查端口流向容器实例。
- 允许来自与您的负载均衡器关联的安全组的入站流量通过任务主机端口范围。
为您的负载均衡器启用可用区
当为负载均衡器配置可用区时,弹性负载均衡会在可用区中创建一个负载均衡器节点。如果在可用区中注册了目标但未启用可用区,则注册的目标不会接收流量。有关详细信息,请参阅可用区和负载均衡器节点。
要确定为您的负载均衡器配置的可用区,请完成以下步骤:
- 打开 Amazon EC2 控制台。
- 在导航窗格中的 Load Balancing(负载均衡)下,选择 Load balancers(负载均衡器)。
- 选择用于 Amazon ECS 服务的负载均衡器。
- 在 Description(描述)选项卡上,您可以查看可用区。
或者,运行 AWS CLI 命令 describe-load-balancers:
aws elbv2 describe-load-balancers --load-balancer-arns EXAMPLE-ALB-ARN --query 'LoadBalancers[*].AvailabilityZones[].{Subnet:SubnetId}'
**注意:**请将 EXAMPLE-ALB-ARN 替换为您的应用程序负载均衡器的 ARN。
要确定为您的容器实例配置的可用区,请完成以下步骤:
- 打开 Amazon EC2 控制台。
- 在导航窗格中的 Auto Scaling(自动扩缩)下,选择 Auto Scaling groups(自动扩缩组)。
- 选择与您的集群关联的容器实例自动扩缩组。
- 在 Details(详细信息)选项卡的 Network(网络)下,验证该可用区是否与负载均衡器的可用区相匹配。
或者,运行 AWS CLI 命令 describe-auto-scaling-groups:
aws autoscaling describe-auto-scaling-groups --auto-scaling-group-names EXAMPLE-ASG-NAME --query 'AutoScalingGroups[*].{Subnets:VPCZoneIdentifier}' --output text
注意: 请将 EXAMPLE-ASG-NAME 替换为您的自动扩缩组的名称。
要修改集群的可用区,请完成以下步骤:
- 打开 AWS CloudFormation 控制台。
- 选择您的集群的 CloudFormation 堆栈。
- 更新堆栈。
- 在 Specify stack details page(指定堆栈详细信息页面)下,更新您的 Subnet IDs(子网 ID)配置。
要确定为您的任务配置的可用区,请完成以下步骤:
-
打开 Amazon ECS 控制台。
-
在导航窗格中,选择 Clusters(集群),然后选择包含您服务的集群。
-
在集群页面的 Services(服务)选项卡的 Service Name(服务名称)列中,选择要查看的服务。
-
选择 Configuration and Networking(配置和联网)选项卡。
-
在 Network configuration(网络配置)下,查看已配置的子网。
-
打开 Amazon Virtual Private Cloud (Amazon VPC) 控制台,查看在 ECS 控制台中不可用的其他信息。
-
运行 describe-services 命令,以验证您的子网的可用区是否与负载均衡器的可用区相匹配:
aws ecs describe-services --cluster EXAMPLE-CLUSTER-NAME --service EXAMPLE-SERVICE-NAME --query 'services[*].deployments[].networkConfiguration[].awsvpcConfiguration.{Subnets:subnets}'**注意:**请将 EXAMPLE-CLUSTER-NAME 替换为您的集群名称,并将 EXAMPLE-SERVICE-NAME 替换为您的服务名称。
您无法使用 Amazon ECS 控制台来更改 Amazon ECS 服务的子网配置。请改为运行 AWS CLI 命令 update-service。
配置您的网络 ACL 以允许子网间的流量
负载均衡器的子网与容器实例或任务网络接口的子网可能不同。
要允许子网之间的流量,请使用以下网络访问控制列表(网络 ACL)配置:
- 与负载均衡器子网关联的网络 ACL 必须允许临时端口 (1024-65535) 和侦听器端口上的入站流量。
- 该网络 ACL 还必须允许运行状况检查端口和临时端口上的出站流量。
- 与容器实例或 awsvpc 模式下的任务网络接口的子网关联的网络 ACL 必须允许运行状况检查端口上的入站流量。
- 该网络 ACL 必须允许临时端口上的出站流量。
有关网络 ACL 的详细信息,请参阅使用网络访问控制列表控制子网流量。
检查目标组的运行状况检查设置
要检查是否为目标组正确配置了运行状况检查设置,请完成以下步骤:
- 打开 Amazon EC2 控制台。
- 在导航窗格中的 Load balancing(负载均衡)下,选择 Target groups(目标组)。
- 选择您的目标组。
**重要说明:**请使用新的目标组。由于 Amazon ECS 会自动在目标组中注册和注销 ECS 任务,因此请不要手动向目标组添加目标。 - 在 Health checks(运行状况检查)选项卡上,执行以下操作:
检查是否正确配置了 Port(端口)和 Path(路径)字段。
**注意:**如果未正确配置这些字段,Amazon ECS 可能会因运行状况检查失败而要求您的负载均衡器取消注册任务。
对于 Port(端口),选择 traffic port(流量端口)。
**注意:**如果选择 Override(覆盖),请确认该端口与任务主机端口相匹配。
对于 Timeout(超时),请确保响应超时值正确无误。
**注意:**如果此值低于响应所需的时间,运行状况检查将失败。
检查 ECS 容器中应用程序的状态和配置
确认应用程序能够响应负载均衡器运行状况检查
请执行以下操作:
- 检查是否为目标组正确配置了 ping 端口和运行状况检查路径。
- 监控 Amazon ECS 服务的 CPU 和内存利用率指标。如果应用程序运行缓慢或超时,请增加任务资源配额、横向扩展服务、优化应用程序或使用更大的实例类型。
- 设置最小运行状况检查宽限期,以便服务计划程序在启动任务后的预定义时间段内忽略运行状况检查。
**注意:**Amazon ECS 任务可能需要较长的运行状况检查宽限期才能注册应用程序负载均衡器。 - 检查您的应用程序日志中是否有应用程序错误。有关详细信息,请参阅将 Amazon ECS 日志发送到 CloudWatch。
确认应用程序返回正确的状态代码
当负载均衡器向运行状况检查路径发送 HTTP GET 请求时,ECS 容器中的应用程序将返回默认状态代码 200 OK。如果收到非 HTTP 错误消息,则表明应用程序未侦听 HTTP 流量。您收到的 HTTP 状态代码可能与您在 Matcher 设置中指定的状态代码不同。如果您收到其他状态代码,则表明应用程序正在侦听 HTTP 流量,但没有为运行状况良好的目标返回状态代码。
**注意:**如果使用应用程序负载均衡器,可以将 Matcher 设置更新为除 200 以外的某个状态代码。有关详细信息,请参阅应用程序负载均衡器目标组的运行状况检查。
要确认 ECS 容器中的应用程序返回正确的状态代码,请完成以下步骤:
-
使用 SSH、会话管理器(AWS Systems Manager 的一项功能)或 EC2 Instance Connect 连接到您的容器实例。
-
(可选)根据您的操作系统 (OS) 运行以下命令以安装 curl。
Amazon Linux 和其他基于 RPM 的发行版:sudo yum -y install curl基于 Debian 的系统,例如 Ubuntu:
sudo apt-get install curl -
运行以下命令以获取容器 ID:
docker ps**注意:**本地侦听器的端口会显示在序列末尾 PORTS 下的命令输出中。
-
如果使用的是 BRIDGE 网络模式,请运行 docker inspect 命令来获取容器的 IP 地址:
IPADDR=$(docker inspect --format='{{.NetworkSettings.IPAddress}}' 112233445566)**注意:**容器的 IP 地址保存在 IPADDR 中。请将 112233445566 替换为 docker ps 命令输出中的容器 ID 编号。如果使用的是 awsvpc,请使用分配给任务网络接口的任务 IP 地址。如果使用的是 HOST 网络模式,请使用用于公开任务的主机容器实例的 IP 地址。
-
要获取状态代码,请运行包含 IPADDR 和本地侦听器端口的 curl 命令:
curl -I http://${IPADDR}:8080/health**注意:**在上述命令示例中,请将 8080 替换为您的侦听器端口。
检查容器实例的状态
如果您从 Amazon ECS 服务事件中收到以下事件消息,请检查您的容器实例的状态:
"(service AWS-Service) (instance i-1234567890abcdefg) (port 443) is unhealthy in (target-group arn:aws:elasticloadbalancing:us-east-1:111111111111:targetgroup/aws-targetgroup/123456789) due to (reason Health checks failed)"
在 Amazon EC2 控制台上检查容器实例的状态。如果实例未通过系统状态检查,请停止并启动您的实例。
暂时激活应用程序负载均衡器访问日志
暂时激活应用程序负载均衡器访问日志,以检查以下问题:
- 确定应用程序负载均衡器是否向正确的路径或端口发送运行状况检查,以及目标是否正确响应。
- 分析目标返回的 HTTP 状态代码,以识别应用程序级别的问题,例如路由配置错误或服务器端错误。
- 检查运行状况检查是否到达目标,以确定是否存在与网络相关的问题。
- 确定响应时间是否超过配置的运行状况检查超时值。
对其他原因进行故障排除
如果上述解决方法无法解决您的问题,请参阅对 Amazon ECS 中的服务负载均衡器进行故障排除。
相关信息
- 语言
- 中文 (简体)

