Используя 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}")}"
}
Итак, допустим, я хочу добавить службу приложения узла, как это будет выглядеть? И пусть они оба работают в одном кластере
Спасибо!
Вы просто создаете другие ресурсы 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 не тестировался.
@babababa Чтобы убедиться, что экземпляры контейнера (фактические хосты AWS) присоединяются к правильному кластеру, лучше всего использовать сценарий пользовательских данных, чтобы заставить их присоединиться к кластеру на экземпляре. создание. Это избавит вас от необходимости вручную редактировать конфигурацию агента ECS.
Таким образом, несмотря на то, что вы создаете фактические экземпляры EC2, которые формируют кластер ECS (вручную, с помощью группы автоматического масштабирования или через Terraform), вам следует добавить что-то похожее на следующие данные к пользовательским данным
для этих экземпляров:
#!/bin/bash
echo ECS_CLUSTER=your_cluster_name >> /etc/ecs/ecs.config
Да, думаю, позже я выяснил, в чем проблема.
Мне пришлось отредактировать файл /etc/ecs/ecs.config
и установить имя кластера так, чтобы экземпляры регистрировались в кластере, а затем службы запускались на экземплярах с использованием различных определений задач.
Проблема, с которой я столкнулся раньше, заключалась в том, что экземпляры заканчивались в кластере по умолчанию
, и у меня не было возможности запустить на них мои службы, поскольку определения задач устанавливаются желаемым кластером, а не кластер по умолчанию
Таким образом, проблема для решения моей проблемы заключалась в изменении /etc/ecs/ecs.config
соответствующим образом