我正在使用Terraform使用ECS在AWS云上设置容器集群,并遇到映射负载均衡器以将流量定向到群集上运行的多个容器的问题.
为了简化,我假设我正在运行一个带有两个容器的服务/任务:webrequester监听5600,restserver监听5000.我需要流量请求/ api/*转到端口5000上的restserver,默认流量转到webrequester on 5600.无论我正在运行的容器主机实例数是多少,这都应该有效.
我最好的理解是我需要创建一个aws_alb_target_group_attachment
进行此关联并将其target_id设置为Container ID.它是否正确?如果是这样,我如何在Terraform中获取容器ID?我已经创建了一个集群,服务,任务,应用程序负载均衡器,以及让它们运行所需的所有实体,但我无法弄清楚哪些(如果有的话)可以让我访问容器ID.
以下是我认为Terraform脚本的密切关系:
resource "aws_ecs_cluster" "main" { name = "jsapps-am${var.am_number}${var.cluster_iteration}" } resource "aws_alb_target_group" "https_default" { name = "https-default-tg" port = 443 protocol = "HTTPS" vpc_id = "${var.vpc_id}" } resource "aws_alb" "main" { name = "af-${var.am_number}${var.cluster_iteration}-alb" subnets = ["${var.vpc_subnets}"] security_groups = ["${aws_security_group.lb_sg.id}"] } resource "aws_alb_listener" "front_end" { load_balancer_arn = "${aws_alb.main.id}" port = "443" protocol = "HTTPS" ssl_policy = "ELBSecurityPolicy-2015-05" certificate_arn = "${var.https_certificate_arn}" default_action { target_group_arn = "${aws_alb_target_group.https_default.id}" type = "forward" } } data "template_file" "task_definition" { template = "${file("${path.module}/task-definition.json")}" vars { image_url = "${var.task_url}" container_name = "webrequester" port_num = "${var.webrequester_port}" } } resource "aws_ecs_task_definition" "jsapps" { family = "jsapps_taskdef" container_definitions = "${data.template_file.task_definition.rendered}" } resource "aws_ecs_service" "jsapps" { name = "jsapps-svc" cluster = "${aws_ecs_cluster.main.id}" task_definition = "${aws_ecs_task_definition.jsapps.arn}" desired_count = 1 iam_role = "${aws_iam_role.ecs_service.name}" load_balancer { target_group_arn = "${aws_alb_target_group.https_default.id}" container_name = "webrequester" container_port = "${var.webrequester_port}" } depends_on = [ "aws_iam_role_policy.ecs_service", "aws_alb_listener.front_end", ] }
Bram.. 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服务(在运行时)处理,当你设置负载平衡器连接.
在首选设置中,您可以将动态主机端口附加到在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服务(在运行时)处理,当你设置负载平衡器连接.