TERRAFORM我如何拥有2个或更多的ECS服务/任务定义的ECS集群?

使用Terraform,我已经尝试了解如何创build1个ECS群集,并在其下运行多个服务。 所以基本上我有2个不同的容器,我想运行这个1个ECS集群。

我该怎么做呢? 我看过很多例子,但通常有1个ECS集群的服务

所以从这个链接我有一个模板https://www.terraform.io/docs/providers/aws/d/ecs_task_definition.html

# Simply specify the family to find the latest ACTIVE revision in that family. data "aws_ecs_task_definition" "mongo" { task_definition = "${aws_ecs_task_definition.mongo.family}" } resource "aws_ecs_cluster" "foo" { name = "foo" } resource "aws_ecs_task_definition" "mongo" { family = "mongodb" container_definitions = <<DEFINITION [ { "cpu": 128, "environment": [{ "name": "SECRET", "value": "KEY" }], "essential": true, "image": "mongo:latest", "memory": 128, "memoryReservation": 64, "name": "mongodb" } ] DEFINITION } resource "aws_ecs_service" "mongo" { name = "mongo" cluster = "${aws_ecs_cluster.foo.id}" desired_count = 2 # Track the latest ACTIVE revision task_definition = "${aws_ecs_task_definition.mongo.family}:${max("${aws_ecs_task_definition.mongo.revision}", "${data.aws_ecs_task_definition.mongo.revision}")}" } 

所以我们可以说我想添加一个节点应用程序服务,它将如何看? 让他们都在同一个集群上运行

谢谢!

您只需创build另一个aws_ecs_serviceaws_ecs_task_definition资源。

如果您希望它在同一个群集上运行,只需在群集参数中指定相同的群集ID即可。

所以它看起来像这样

 # Simply specify the family to find the latest ACTIVE revision in that family. data "aws_ecs_task_definition" "mongo" { task_definition = "${aws_ecs_task_definition.mongo.family}" } data "aws_ecs_task_definition" "nginx" { task_definition = "${aws_ecs_task_definition.nginx.family}" } resource "aws_ecs_cluster" "foo" { name = "foo" } # ====================== TASKS =================== resource "aws_ecs_task_definition" "mongo" { family = "mongodb" container_definitions = <<DEFINITION [ { "cpu": 128, "environment": [{ "name": "SECRET", "value": "KEY" }], "essential": true, "image": "mongo:latest", "memory": 128, "memoryReservation": 64, "name": "mongodb" } ] DEFINITION } resource "aws_ecs_task_definition" "nginx" { family = "nginx" container_definitions = <<DEFINITION [ { "cpu": 128, "environment": [{ "name": "SECRET", "value": "KEY" }], "essential": true, "image": "nginx:latest", "memory": 128, "memoryReservation": 64, "name": "nginx" } ] DEFINITION } # ====================== SERVICES =================== resource "aws_ecs_service" "mongo" { name = "mongo" cluster = "${aws_ecs_cluster.foo.id}" desired_count = 2 # Track the latest ACTIVE revision task_definition = "${aws_ecs_task_definition.mongo.family}:${max("${aws_ecs_task_definition.mongo.revision}", "${data.aws_ecs_task_definition.mongo.revision}")}" } resource "aws_ecs_service" "nginx" { name = "nginx" cluster = "${aws_ecs_cluster.foo.id}" desired_count = 2 # Track the latest ACTIVE revision task_definition = "${aws_ecs_task_definition.nginx.family}:${max("${aws_ecs_task_definition.nginx.revision}", "${data.aws_ecs_task_definition.nginx.revision}")}" } 

还有另一种在ECS上运行多个容器的方法。

您可以将Nginx和MongoDB放在同一个实例上,并在同一个任务/服务下。

看起来像这样

 # Simply specify the family to find the latest ACTIVE revision in that family. data "aws_ecs_task_definition" "webapp" { task_definition = "${aws_ecs_task_definition.webapp.family}" } resource "aws_ecs_cluster" "foo" { name = "foo" } # ====================== TASKS =================== resource "aws_ecs_task_definition" "webapp" { family = "webapp" container_definitions = <<DEFINITION [ { "cpu": 128, "environment": [{ "name": "SECRET", "value": "KEY" }], "essential": true, "image": "nginx:latest", "memory": 128, "memoryReservation": 64, "name": "nginx" }, { "cpu": 128, "environment": [{ "name": "SECRET", "value": "KEY" }], "essential": true, "image": "mongo:latest", "memory": 128, "memoryReservation": 64, "name": "mongodb" } ] DEFINITION } # ====================== SERVICES =================== resource "aws_ecs_service" "webapp" { name = "webapp" cluster = "${aws_ecs_cluster.foo.id}" desired_count = 1 # Track the latest ACTIVE revision task_definition = "${aws_ecs_task_definition.webapp.family}:${max("${aws_ecs_task_definition.webapp.revision}", "${data.aws_ecs_task_definition.webapp.revision}")}" } 

第一种方法的优点是可以独立扩展和pipe理每个容器。

第二种方法的优点是容器将被放置在相同的EC2实例上,并且可以被链接但是不能被独立地缩放。 当您将所需的计数设置为N时,您将获得N个“webapp”(所以Nginx和MongoDB实例都是这样)。 用第一种方法你可以有N个Nginx和X个MongoDB。

希望这可以帮助。

:Terraform代码尚未经过testing。

@babababa为了确保容器实例(实际的AWS主机)join正确的集群,最好的做法是使用用户数据脚本在创build实例时join集群。 这将避免您必须手动编辑ECS代理configuration。

因此,无论您是创buildECS集群的实际EC2实例(手动,自动缩放组还是通过Terraform),都应该为这些实例的user data添加类似于以下内容的内容:

 #!/bin/bash echo ECS_CLUSTER=your_cluster_name >> /etc/ecs/ecs.config 

是的,我想我后来发现问题是什么。 我必须编辑/etc/ecs/ecs.config文件并设置集群名称,以便实例向集群注册,然后使用不同任务定义在实例上运行服务。

我之前遇到的问题是,实例最终在default集群中,无法让我的服务在其上运行,因为任务定义是由我想要的集群设置的,而不是default集群

所以解决我的问题的问题是适当地编辑/etc/ecs/ecs.config