Назад | Перейти на главную страницу

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}")}"
}

Итак, допустим, я хочу добавить службу приложения узла к тому, как это будет выглядеть? И пусть они оба работают в одном кластере

Спасибо!

@babababa Чтобы убедиться, что экземпляры контейнеров (фактические хосты AWS) присоединяются к соответствующему кластеру, лучше всего использовать сценарий пользовательских данных, чтобы они присоединялись к кластеру при создании экземпляра. Это избавит вас от необходимости вручную редактировать конфигурацию агента ECS.

Поэтому, несмотря на то, что вы создаете фактические экземпляры EC2, которые образуют кластер ECS (вручную, с помощью группы автоматического масштабирования или через Terraform), вы должны добавить что-то похожее на следующее в user data для этих случаев:

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

Вы просто создаете другой 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 не тестировался.

Да, думаю, позже я узнал, в чем проблема. Мне пришлось отредактировать /etc/ecs/ecs.config файл и задайте имя кластера, чтобы экземпляры регистрировались в кластере, а затем службы запускались на экземплярах с использованием различных определений задач.

Проблема, с которой я столкнулся раньше, заключалась в том, что экземпляры заканчивались default кластер, и нет возможности запустить на них мои службы, поскольку определения задач задаются кластером, который я хотел, а не default кластер

Итак, проблема для решения моей проблемы заключалась в редактировании /etc/ecs/ecs.config соответственно