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 надлежащим образом

Другие вопросы по тегам