使用 Terraform,我尽最大努力找出如何创建 1 个 ECS 集群并在其下运行多个服务。所以基本上我有 2 个不同的容器我想用这个 1 个 ECS 集群运行。
我该怎么做呢?我见过很多例子,但通常是 1 个服务和 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}")}"
}
所以可以说我想添加一个节点应用程序服务,它看起来如何?并让它们都在同一个集群上运行
谢谢!
您只需创建另一个aws_ecs_service和aws_ecs_task_definition资源。
如果您希望它在同一个集群上运行,只需在集群参数中指定相同的集群 ID 。
所以它看起来像这样
还有另一种在 ECS 上运行多个容器的方法。
您可以将 Nginx 和 MongoDB 放在同一个实例和同一个任务/服务下。
它看起来像这样
第一种方法的优点是您可以独立扩展和管理每个容器。
第二种方法的优点是容器将放置在同一个 EC2 实例上,可以链接但不能独立扩展。当您将所需的计数设置为 N 时,您将获得 N 个“webapp”(因此 Nginx 和 MongoDB 实例)。使用第一种方法,您可以拥有 N 个 Nginx 和 X 个 MongoDB。
希望这可以帮助。
注意: Terraform 代码尚未经过测试。
@babababa 为了确保容器实例(实际的 AWS 主机)加入正确的集群,最佳实践是使用用户数据脚本让它们在创建实例时加入集群。这将避免您必须手动编辑 ECS 代理配置。
user data
因此,无论您正在创建构成 ECS 集群的实际 EC2 实例(手动、自动扩展组或通过 Terraform),您都应该为这些实例添加类似于以下内容的内容:是的,我想我后来发现了问题所在。我必须编辑
/etc/ecs/ecs.config
文件并设置集群名称,以便实例注册到集群,然后使用不同的任务定义在实例上运行服务。我之前面临的问题是实例最终在一个
default
集群中并且无法让我的服务在它们上运行,因为任务定义是由我想要的集群而不是default
集群设置的所以解决我的问题的问题是
/etc/ecs/ecs.config
适当地编辑