TERRAFORM como faço para ter 1 cluster ecs com 2 ou mais definições de serviços / tarefas ecs?

1

Usando o Terraform, eu tentei o máximo para descobrir como criar 1 cluster do ECS e ter vários serviços rodando sob ele. Então, basicamente eu tenho 2 containers diferentes que eu quero rodar com este cluster 1 ECS.

Como faço isso? Eu tenho visto muitos exemplos, mas geralmente 1 serviço com 1 cluster ECS

Então, a partir desse link, eu tenho um modelo link

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

Então, digamos que eu queira adicionar um serviço de aplicativo de nó a isso, como ele será? E faça com que ambos corram no mesmo cluster

Obrigado!

    
por uberrebu 09.04.2017 / 09:06

3 respostas

1

Você simplesmente cria outros recursos aws_ecs_service e aws_ecs_task_definition .

Se você quiser que ele seja executado no mesmo cluster, apenas especifique o mesmo ID de cluster no parâmetro cluster .

Então, seria algo parecido com isto

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

Existe outra maneira de executar vários contêineres no ECS.

Você pode colocar tanto o Nginx quanto o MongoDB na mesma instância e sob a mesma Tarefa / Serviço.

Ficaria assim

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

A vantagem do primeiro método é que você pode dimensionar e gerenciar cada contêiner de forma independente.

A vantagem do segundo método é que os contêineres serão colocados na mesma instância do EC2 e podem ser ligado mas não pode ser dimensionado de forma independente. Quando você definir a contagem desejada como N, você receberá o número N de "webapp" (para as instâncias Nginx e MongoDB). Com o primeiro método, você pode ter um número N de Nginx e um número X de MongoDB.

Espero que isso ajude.

NOTA : o código do Terraform não foi testado.

    
por 10.04.2017 / 12:09
1

@babababa Para garantir que as instâncias do contêiner (os hosts reais da AWS) ingressem no cluster adequado, a melhor prática é usar um script de dados do usuário para fazê-los ingressar no cluster na criação da instância. Isso evitará que você tenha que editar manualmente a configuração do agente do ECS.

Assim, no entanto, você está criando as instâncias EC2 reais que formam o cluster do ECS (manualmente, grupo de dimensionamento automático ou por meio do Terraform), você deve adicionar algo semelhante ao seguinte ao user data para essas instâncias:

#!/bin/bash
echo ECS_CLUSTER=your_cluster_name >> /etc/ecs/ecs.config
    
por 19.04.2017 / 16:40
0

Sim, acho que depois descobri qual era o problema. Eu tive que editar o arquivo /etc/ecs/ecs.config e definir o nome do cluster para que as instâncias se registrassem no cluster e, em seguida, os serviços fossem executados nas instâncias usando as diferentes definições de tarefa.

O problema que eu estava enfrentando antes era que as instâncias estavam acabando em um cluster default e nenhuma maneira de executar meus serviços nelas, pois as definições de tarefa são definidas pelo cluster que eu queria e não o default cluster

Então, o problema para resolver meu problema foi editar o /etc/ecs/ecs.config apropriadamente

    
por 10.04.2017 / 21:49