我使用Terraform使用ECS在AWS云上设置容器集群,并遇到映射负载均衡器以将流量定向到群集上运行的多个容器的问题。
为了简化,我假设我正在运行一个带有两个容器的服务/任务:webrequester监听5600,restserver监听5000.我需要流量请求/ api / *转到端口5000上的restserver和默认流量在5600上转到webrequester。无论我运行的容器主机实例的数量如何,这都应该有效。
我最好的理解是我需要创建一个Neon
来建立这种关联,并将其target_id设置为Container ID。它是否正确?如果是这样,我如何在Terraform中获取容器ID?我已经创建了一个集群,服务,任务,应用程序负载均衡器以及所有必需的实体来让它们运行,但我无法弄清楚哪些(如果有的话)会让我访问容器ID
以下是我认为Terraform脚本的密切关系部分:
aws_alb_target_group_attachment
答案 0 :(得分:8)
在首选设置中,您可以将动态主机端口附加到在ECS容器实例上运行的容器。原因很简单:您希望能够灵活地运行在单个实例上公开相同端口的多个容器。如果使用静态主机端口进行绑定,则不起作用(因为端口已被占用)。在蓝色/绿色部署的情况下,这将阻碍。
您可以通过在任务定义中仅定义 容器端口来实现此目的。所以这部分是你需要的所有端口映射:
"portMappings": [
{
"containerPort": ${service_port}
}
]
您的ALB当然需要知道要使用哪个端口,因为此端口是随机分配的。通过Docker,您无法预先配置此功能。这就是您使用目标组从您的负载均衡器发送流量的原因。如果正确设置load_balancer
aws_ecs_service
部分,则ECS代理将在启动新容器时注册容器实例+(动态)端口。
因此......在您的ALB设置中,您不必关心容器正在侦听的端口,您只关心需要向哪些目标组发送流量。要执行此操作,请添加aws_alb_listener
,其中包含默认规则和额外规则(指定了/ api / *路径)。对于这两个规则,您可以指定正确的目标组和type="forward"
,并完成作业。
总结:您不需要aws_alb_target_group_attachment
,因为在您设置负载均衡器连接时,这些由ECS服务(在运行时)处理。
答案 1 :(得分:0)
您可以尝试使用docker provisioner与docker host一起工作,大声思考。
另外,您是否检查过负载均衡器内幕集群?它应该将流量负载平衡到容器集。