Usando o Terraform, tentei ao máximo descobrir como criar 1 cluster ECS e ter vários serviços em execução nele. Então, basicamente, tenho 2 contêineres diferentes que desejo executar com este 1 cluster ECS.
Como eu faço isso? Já vi muitos exemplos, mas geralmente 1 serviço com 1 cluster ECS
Então, a partir deste link, obtive um modelo 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}")}"
}
Então, digamos que eu queira adicionar um serviço de aplicativo de nó a isso, como ficará? E faça com que ambos sejam executados no mesmo cluster
Obrigado!
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 do cluster no parâmetro do cluster.
Então ficaria algo assim
Existe outra maneira de executar vários contêineres no ECS.
Você pode colocar o Nginx e o MongoDB na mesma instância e sob a mesma tarefa/serviço.
Seria assim
A vantagem do primeiro método é que você pode dimensionar e gerenciar cada contêiner independentemente.
A vantagem do segundo método é que os contêineres serão colocados na mesma instância do EC2 e podem ser vinculados , mas não podem ser dimensionados independentemente. Ao definir a contagem desejada como N, você obterá o número N de "webapp" (portanto, instâncias do Nginx e do MongoDB). Com o primeiro método, você pode ter um número N de Nginx e um número X de MongoDB.
Espero que isto ajude.
NOTA : O código do Terraform não foi testado.
@babababa Para garantir que as instâncias de 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 ECS.
Portanto, independentemente de como você esteja criando as instâncias reais do EC2 que formam o cluster do ECS (manualmente, grupo de dimensionamento automático ou por meio do Terraform), você deve adicionar algo semelhante ao seguinte
user data
para essas instâncias:Sim, acho que mais tarde descobri qual era o problema. Tive que editar o
/etc/ecs/ecs.config
arquivo e definir o nome do cluster para que as instâncias fossem registradas no cluster e, em seguida, os serviços fossem executados nas instâncias usando as diferentes definições de tarefas.O problema que eu enfrentava antes era que as instâncias estavam terminando em um
default
cluster e não havia como executar meus serviços nelas, pois as definições de tarefas são definidas pelo cluster que eu queria e não pelodefault
clusterEntão a questão para resolver o meu problema foi editar o arquivo
/etc/ecs/ecs.config
apropriadamente