将多个容器映射到 Terraform 中的应用程序负载均衡器



我正在使用 Terraform 在 ECS 的 AWS 云上设置容器集群,但在映射负载均衡器以将流量定向到集群上运行的多个容器时遇到问题。

为了简化起见,假设我正在运行一个包含两个容器的服务/任务:webrequester 侦听 5600 和 restserver 侦听 5000。我需要请求/api/* 的流量转到端口 5000 上的 restserver,需要默认流量转到端口 5600 上的 webrequester。无论我运行的容器主机实例数量如何,这都应该有效。

我最好的理解是,我需要创建一个aws_alb_target_group_attachment来进行此关联,并将其target_id设置为容器 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",
]
}

在首选设置中,您可以将动态主机端口附加到在 ECS 容器实例上运行的容器。原因很简单:您希望能够灵活地运行多个容器,这些容器在单个实例上公开相同的端口。如果使用静态主机端口绑定到,这将不起作用(因为端口已被占用)。在蓝/绿部署的情况下,这会妨碍。

为此,您可以在任务定义中定义容器端口。所以这部分是你需要的所有端口映射:

"portMappings": [
{
"containerPort": ${service_port}
}
]

您的 ALB 当然需要知道要使用哪个端口,并且由于此端口是由 Docker "随机"分配的,因此您无法预先配置它。这就是您使用目标组从负载均衡器向其发送流量的原因。如果您正确设置了aws_ecs_serviceload_balancer部分,则 ECS 代理将在启动新容器时注册容器实例 + (动态)端口。

所以......在你的ALB设置中,你不关心容器正在侦听的端口,你只关心你需要将流量发送到哪些目标组。为此,请添加具有默认规则和额外规则(指定/api/* 路径)的aws_alb_listener。对于这两个规则,您指定正确的目标组和type="forward",作业就完成了。

总而言之:您不需要aws_alb_target_group_attachment,因为当您设置负载均衡器连接时,这些由 ECS 服务(在运行时)处理。

你可以尝试 docker provisioning 与 docker 主机一起工作,大声思考。

另外,是否已检查负载均衡器预览体验成员群集?它应该将流量负载平衡到一组容器。

相关内容

最新更新