Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services aws ECS,ECS实例未注册到ALB目标组_Amazon Web Services_Amazon Ecs_Amazon Elb - Fatal编程技术网

Amazon web services aws ECS,ECS实例未注册到ALB目标组

Amazon web services aws ECS,ECS实例未注册到ALB目标组,amazon-web-services,amazon-ecs,amazon-elb,Amazon Web Services,Amazon Ecs,Amazon Elb,我创建了ECS服务,运行了1个ECS实例,可以看到该实例注册为负载均衡器的目标 现在我触发一个自动缩放组(通过增加所需的实例数)来启动一个新实例 实例已启动并添加到ECS集群。(我可以在ECS实例页签上看到) 但实例未添加到ALB目标。(我希望在下图中看到2个实例,但我只看到1个) 我可以编辑AutoScalingGroup的目标组,如下所示 然后我看到了以下内容 但是健康检查失败了。似乎无法连接到80端口。 尽管我在实例的安全组中为公众打开了端口80。(另外,ecs服务创建的实例使用动态

我创建了ECS服务,运行了1个ECS实例,可以看到该实例注册为负载均衡器的目标

现在我触发一个自动缩放组(通过增加所需的实例数)来启动一个新实例

实例已启动并添加到ECS集群。(我可以在ECS实例页签上看到) 但实例未添加到ALB目标。(我希望在下图中看到2个实例,但我只看到1个)

我可以编辑AutoScalingGroup的目标组,如下所示

然后我看到了以下内容

但是健康检查失败了。似乎无法连接到80端口。 尽管我在实例的安全组中为公众打开了端口80。(另外,ecs服务创建的实例使用动态端口映射,但ALS创建的实例不使用)

所以AutoScalingGroup可以启动新实例,但我的负载平衡器从不向新实例提供流量

我确实试过了,它显示我可以通过类似于
curl-vhttp://${IPADDR}/health
的方式将端口80从主机连接到docker容器

所以一定是主机端口80出了问题(负载平衡器无法连接到它)。 但安全组设置也没有错误,因为工作实例和非工作实例使用相同的SG

  • 编辑
因为我使用了动态映射,所以我的Web服务器运行在某个随机端口上。 如您所见,ecs服务启动的实例已通过随机端口注册到目标组。

但是,ALB启动的实例已使用端口80将自身注册到目标组。

您似乎知道根本原因,即端口80未通过运行状况检查,这就是它从未添加到ALB的原因。这是你可以尝试的

首先,检查您的服务是否正在侦听新主机上的端口80。您可以使用netcat之类的命令

nv -v localhost 80

一旦您知道服务正在侦听,允许ALB连接到主机的建议方法是为您的实例添加安全组入站规则,以允许来自端口80上ALB安全组的流量。如果实例不健康,则不会将其添加到目标组。所以你需要先解决健康检查问题

从第一个实例开始,映射的端口是
32769
,因此我假设如果这是同一个目标组,并且是同一个应用程序,那么新实例中的端口应该是
32769

当您卷曲IP端点时
curl-I-v http://${IPADDR}/health。
是http状态代码是
200
,如果是
200
,则应该是健康的,如果不是
200
,则更新后端http状态代码,或者您可以更新健康检查http状态代码

我假设您在这两个实例中都在运行ECS,所以ECS会针对每个ECS服务创建目标组,您是否在AS组中运行一些需要目标组的混合服务?如果您正在运行dynamic port,请删除流量端口的运行状况检查路径

现在,如果我们看看502坏网关的官方可能原因

动态端口映射是Amazon弹性容器服务(Amazon ECS)中容器实例的一项功能。

使用应用程序负载平衡器的动态端口映射使其更容易 在Amazon ECS上的同一Amazon ECS服务上运行多个任务 集群

使用经典的负载平衡器,您必须静态映射端口号 在容器实例上。经典的负载平衡器不允许您 在同一实例上运行任务的多个副本,因为 港口冲突。应用程序负载平衡器使用动态端口映射 因此,您可以在同一个服务器上从单个服务运行多个任务 容器实例

您创建的目标组将无法使用动态端口,您必须将目标组与ECS服务绑定

HTTP 502:坏网关 可能原因:

  • 负载平衡器在尝试建立连接时从目标接收到TCP RST

  • 负载平衡器在尝试建立连接时收到来自目标的意外响应,例如“ICMP目标不可访问(主机不可访问)”。检查是否允许从负载平衡器子网到目标端口上的目标的通信量

  • 当负载平衡器对目标有未完成的请求时,目标关闭了与TCP RST或TCP FIN的连接。检查目标的保持活动持续时间是否短于负载平衡器的空闲超时值

  • 目标响应格式错误或包含无效的HTTP标头

  • 负载平衡器在连接到目标时遇到SSL握手错误或SSL握手超时(10秒)

  • 由已取消注册的目标处理的请求经过的取消注册延迟期。增加延迟时间,以便完成冗长的操作。


如果我要在一个容器中运行多个任务,ALB不应该使用动态端口吗?为什么使用80?不太可能,您可以在单个端口上从ALB执行基于路径的路由。因此,您可以代理不同端口上的不同应用程序,前提是它们具有不同的web上下文路径。我使用的动态映射如中所述,这就是为什么它不是80。我认为问题在于ALB正在为其创建的实例尝试端口80。。但是ECS容器需要动态端口。请转到服务->任务检查动态端口并使用该端口更新任务定义,或者只允许来自LB的所有流量。默认情况下,它不使用80,似乎是您创建的目标组,而不是通过服务集成创建的。所以你有两个手动更新端口,或者在ecs部分注册目标,或者删除动态端口。你有没有像我一样深入了解这个问题