TERRAFORM, как мне получить 1 кластер ecs с 2 или более определениями служб / задач ecs?

Используя Terraform, я изо всех сил пытался узнать, как создать 1 кластер ECS и запустить несколько сервисов под ним. Итак, в основном у меня есть 2 разных контейнера, которые я хочу запустить с этим 1 кластером ECS.

Как мне это сделать? Итак, в основном у меня есть 2 разных контейнера, которые я хочу запустить с этим 1 ECS ...

Используя Terraform, я изо всех сил пытался узнать, как создать 1 кластер ECS и запустить несколько сервисов под ним. Итак, в основном у меня есть 2 разных контейнера, которые я хочу запустить с этим 1 кластером ECS.

Как мне это сделать? Итак, в основном у меня есть 2 разных контейнера, которые я хочу запустить с этим 1 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}")}"
}

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

Спасибо!

1
задан 9 April 2017 в 10:06
3 ответа

Вы просто создаете другие ресурсы aws_ecs_service и aws_ecs_task_definition .

Если вы хотите, чтобы он работал в одном кластере, просто укажите тот же идентификатор кластера в параметре cluster .

Это будет выглядеть примерно так

# 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 не тестировался.

1
ответ дан 3 December 2019 в 20:25

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

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

#!/bin/bash
echo ECS_CLUSTER=your_cluster_name >> /etc/ecs/ecs.config
1
ответ дан 3 December 2019 в 20:25

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

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

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

0
ответ дан 3 December 2019 в 20:25

Теги

Похожие вопросы