Используя 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
соответственно