Erro AWS ECS ao executar a tarefa: nenhuma instância de contêiner foi encontrada em seu cluster

115

Estou tentando implantar uma dockerimagem de contêiner para AWSusar ECS, mas a instância EC2 não está sendo criada. Eu vasculhei a internet em busca de uma explicação de por que estou recebendo o seguinte erro:

"Ocorreu um erro de cliente (InvalidParameterException) ao chamar a operação RunTask: Nenhuma instância de contêiner foi encontrada em seu cluster."

Aqui estão meus passos:

1. Enviei uma imagem docker do Ubuntu para meu repositório Amazon ECS.

2. Registrou uma definição de tarefa ECS:

aws ecs register-task-definition --cli-input-json file://path/to/my-task.json 

3. Executou a tarefa:

aws ecs run-task --task-definition my-task

Ainda assim, ele falha.

Aqui está minha tarefa:

{
  "family": "my-task",
  "containerDefinitions": [
    {
        "environment": [],
        "name": "my-container",
        "image": "my-namespace/my-image",
        "cpu": 10,
        "memory": 500,
        "portMappings": [
            {
                "containerPort": 8080,
                "hostPort": 80
            }
        ],
        "entryPoint": [
            "java",
            "-jar",
            "my-jar.jar"
        ],
        "essential": true
    }
  ]
}

Também tentei usar o console de gerenciamento para configurar um cluster e serviços, mas recebo o mesmo erro. Como faço para configurar o cluster para ter instâncias ec2 e que tipo de instâncias de contêiner devo usar? Para começar, pensei que todo esse processo fosse criar as instâncias do EC2 !!

cosbor11
fonte
Sinto que vi isso quando fui rápido entre as etapas de criação de um cluster e a execução de uma tarefa.
Ben Creasy de

Respostas:

158

Eu descobri isso depois de mais algumas horas de investigação. Amazon, se você estiver ouvindo, deve declarar isso em algum lugar em seu console de gerenciamento ao criar um cluster ou adicionar instâncias ao cluster:

"Antes de adicionar instâncias ECS a um cluster, você deve primeiro ir para o console de gerenciamento do EC2 e criar ecs-optimizedinstâncias com uma função IAM que tem a AmazonEC2ContainerServiceforEC2Rolepolítica anexada"

Aqui está o truque:

1. Vá para o Painel do EC2 e clique no Launch Instancebotão.

2. Em Community AMIs, Pesquise ecs-optimizede selecione aquele que melhor se adapta às necessidades do seu projeto. Qualquer um vai funcionar. Clique próximo.

3. Quando você chegar a Configurar Detalhes da Instância, clique em create new IAM role linke crie uma nova função chamada ecsInstanceRole.

4. Anexe a AmazonEC2ContainerServiceforEC2Rolepolítica a essa função.

5. Em seguida, conclua a configuração de sua instância ECS.
NOTA: Se você estiver criando um servidor da web, deverá criar um securityGroup para permitir o acesso à porta 80.

Depois de alguns minutos, quando a instância for inicializada e em execução, você poderá atualizar a guia Instâncias do ECS que está tentando adicionar também.

cosbor11
fonte
10
Selecionar o ami sugerido que foi especificado para a região dada resolveu meu problema. Para descobrir o ami, você deve selecionar este url docs.aws.amazon.com/AmazonECS/latest/developerguide/…
sanath_p
1
não vendo AmazonEC2ContainerServiceforEC2Role, houve alguma alteração desde sua última postagem?
BlueDolphin de
1
@BlueDolphin Consegui encontrar essa política quando criei uma nova função no IAM.
cyrf
6
É importante notar agora (abril de 2018) se você estiver usando o Beta Fargate atual ( aws.amazon.com/fargate ) para evitar todo esse tipo de aborrecimento, talvez você queira que eu apenas tenha selecionado EC2como o tipo de inicialização quando recebeu este erro ...
declinação de
10
E, ao criar EC2, não se esqueça de #!/bin/bash echo ECS_CLUSTER=your_cluster_name >> /etc/ecs/ecs.confignos Advanced Details -> User datase você tiver seu próprio cluster padrão, não. Caso contrário, a instância EC2 recém-criada criará o cluster padrão.
Jakub Czaplicki
40

Atualmente, a interface da web do Amazon AWS pode criar instâncias automaticamente com o AMI correto e o nome correto para que seja registrado no cluster correto.

Mesmo que todas as instâncias tenham sido criadas pela Amazon com as configurações corretas, minhas instâncias não eram registradas. Nos fóruns da Amazon AWS , encontrei uma pista. Acontece que seus clusters precisam de acesso à Internet e, se seu VPC privado não tiver um gateway de Internet, os clusters não poderão se conectar.

O conserto

No painel VPC, você deve criar um novo gateway de Internet e conectá-lo ao VPC usado pelo cluster. Depois de anexado, você deve atualizar (ou criar) a tabela de rota para o VPC e adicionar como última linha

0.0.0.0/0 igw-24b16740  

Onde igw-24b16740 é o nome do seu gateway de Internet recém-criado.

P_W999
fonte
Isso é mencionado em docs.aws.amazon.com/AWSEC2/latest/UserGuide/… [EC2-VPC] Verifique a tabela de rotas para a sub-rede. Você precisa de uma rota que envie todo o tráfego destinado fora do VPC para o gateway da Internet para o VPC.
Justin M. Keyes
2
Obrigado pela pista! Eu havia atribuído um grupo de segurança às minhas instâncias que bloqueava todo o tráfego de saída, exceto o tráfego para meu balanceador de carga. Mudei isso para permitir todo o tráfego de saída, mas restringir o tráfego de entrada apenas do balanceador de carga, e as instâncias então apareceram no meu cluster EC2.
Mikepote
1
Eu gostaria de poder votar em sua resposta mais de uma vez. Isso corrigiu meu problema exato "Nenhuma instância de contêiner foi encontrada em seu cluster." e a resposta original votou mais não teve nada a ver com sua solução real. Obrigado novamente.
alexkb
Além de associar o gateway ao seu VPC, pode ser necessário rotear o tráfego da Internet por meio dele para a sub-rede específica que hospeda suas instâncias do ECS. - por exemplo aws ec2 associate-route-table --subnet-id $SUBNET_ID --route-table-id $ROUTE_TABLE_ID- posso sugerir adicionar isso à resposta?
Greg,
Acho que vale a pena mencionar que, no momento em que você adiciona uma rota para 0.0.0..0 / 0 apontando para um IGW, a sub-rede não é mais uma sub-rede privada. De uma perspectiva de segurança de rede, é melhor criar uma rota apontando para um gateway NAT.
Henrik Pingel de
18

Eu tive esse problema ao usar o Fargate. Consertei quando defini explicitamentelaunchType="FARGATE" ao chamar run_task.

Milan Cermak
fonte
1
Com a CLI eu adicionei--launch-type FARGATE
shlomiLan
11

Outras verificações sugeridas

  1. Selecionar o AMI sugerido que foi especificado para a região determinada resolveu meu problema.

    Para descobrir o AMI - marque Launching a Amazon ECS Container Instance .

  2. Por padrão, todas as instâncias ec2 são adicionadas ao cluster padrão. Portanto, o nome do cluster também é importante.

Consulte o ponto 10 em Launching an Amazon ECS Container Instance .

Mais informações disponíveis neste tópico .

sanath_p
fonte
3

Para o caso de outra pessoa estar bloqueada com este problema como eu ... Já tentei de tudo aqui e não funcionou.

Além do que foi falado aqui em relação ao Papel da Instância EC2, como comentei aqui , no meu caso só funcionou se eu ainda configurasse a Instância EC2 com informações simples. Usando os dados do usuário, um script inicial como este:

#!/bin/bash
cat <<'EOF' >> /etc/ecs/ecs.config
ECS_CLUSTER=quarkus-ec2
EOF

Informar o nome do cluster ECS relacionado criado neste arquivo de configuração do ecs resolveu meu problema. Sem essa configuração, o log do agente do ECS na instância do EC2 estava mostrando um erro que não era possível se conectar ao ECS, fazendo isso eu tenho a instância do EC2 visível para o cluster do ECS.

Depois de fazer isso, poderia obter a instância EC2 disponível para meu cluster EC2: insira a descrição da imagem aqui

A documentação da AWS disse que esta parte é opcional, mas no meu caso, não funcionou sem esta configuração "opcional".

Ualter Jr.
fonte
2

Se você se deparou com esse problema depois de criar o cluster

Vá para a instância ECS na lista de instâncias EC2 e verifique a função IAM que você atribuiu à instância. Você pode identificar as instâncias facilmente com o nome da instância que começa comECS Instance

insira a descrição da imagem aqui

Depois disso, clique na função IAM e ele o direcionará para o console do IAM. Selecione a AmazonEC2ContainerServiceforEC2Rolepolítica na lista de políticas de permissão e salve a função.

Suas instâncias estarão disponíveis no cluster logo após salvá-lo.

sandaru.ny
fonte
1

O verdadeiro problema é a falta de permissão. Contanto que você crie e atribua uma função IAM com permissão AmazonEC2ContainerServiceforEC2Role, o problema desaparece.

Ben
fonte
0

Outra possível causa que encontrei foi a atualização de meu cluster AMI ECS para um "Amazon Linux 2" AMI em vez de um "Amazon Linux AMI", o que fez com que meu script de inicialização user_data EC2 não funcionasse.

Skeller88
fonte
0

Quando isso acontecer, você precisa observar o seguinte:

  1. Suas instâncias EC2 devem ter uma função com AmazonEC2ContainerServiceforEC2Rolepolítica gerenciada anexada a ela
  2. Suas instâncias EC2 devem estar executando a imagem AMI ecs-optimized(você pode verificar isso no painel EC2)
  3. As sub-redes privadas do seu VPC não têm IPs públicos atribuídos OU você não tem um ponto de extremidade VPC de interface configurado OU não tem um gateway NAT configurado

Na maioria das vezes, esse problema aparece devido ao VPC configurado incorretamente. De acordo com a documentação :

CITAÇÃO: Se você não tiver um ponto de extremidade VPC de interface configurado e suas instâncias de contêiner não tiverem endereços IP públicos, eles devem usar a conversão de endereço de rede (NAT) para fornecer esse acesso.

  • Para criar um endpoint VPC: Siga a documentação aqui
  • Para criar um gateway NAT: Siga a documentação aqui

Esses são os motivos pelos quais você não vê as instâncias do EC2 listadas no painel do ECS.

Um tiro
fonte