TERRAFORM Как у меня 1 кластер ECS с 2 или более определений службы / задачи ECS?
Используя 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}")}"
}
Допустим, я хочу добавить службу приложения узла к этому, как это будет выглядеть? И пусть они оба работают в одном кластере
Спасибо!
3 ответа
Вы просто создаете другие ресурсы aws_ecs_service и aws_ecs_task_definition.
Если вы хотите, чтобы он работал в том же кластере, просто укажите тот же идентификатор кластера в параметре кластера.
Так это будет выглядеть примерно так
# 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}")}"
}
Преимущество первого метода заключается в том, что вы можете масштабировать и управлять каждым контейнером независимо.
Преимущество второго метода заключается в том, что контейнеры будут размещены в одном и том же экземпляре EC2 и могут быть связаны, но не могут масштабироваться независимо. Когда вы установите желаемое количество в N, вы получите N "webapp" (т.е. экземпляры Nginx и MongoDB). При первом способе вы можете иметь N номеров Nginx и X номеров MongoDB.
Надеюсь это поможет.
ПРИМЕЧАНИЕ. Код Terraform не был протестирован.
@babababa Чтобы убедиться, что экземпляры контейнеров (фактические хосты AWS) присоединяются к соответствующему кластеру, рекомендуется использовать сценарий пользовательских данных, чтобы они присоединялись к кластеру при создании экземпляра. Это избавит вас от необходимости вручную редактировать конфигурацию агента ECS.
Поэтому, несмотря на то, что вы создаете фактические экземпляры EC2, которые формируют кластер ECS (вручную, с помощью группы автоматического масштабирования или с помощью 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
надлежащим образом