Errore di AWS ECS durante l'esecuzione dell'attività: nessuna istanza di container trovata nel cluster


115

Sto provando a distribuire dockerun'immagine del contenitore da AWSutilizzare ECS, ma l'istanza EC2 non viene creata. Ho setacciato Internet alla ricerca di una spiegazione sul motivo per cui ricevo il seguente errore:

"Si è verificato un errore client (InvalidParameterException) durante la chiamata all'operazione RunTask: nessuna istanza di contenitore trovata nel cluster."

Ecco i miei passi:

1. Ho eseguito il push di un'immagine docker DA Ubuntu al mio repository Amazon ECS.

2. Registrazione di una definizione dell'attività ECS:

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

3. Ho eseguito l'attività:

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

Tuttavia, fallisce.

Ecco il mio compito:

{
  "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
    }
  ]
}

Ho anche provato a utilizzare la console di gestione per configurare un cluster e servizi, ma ottengo lo stesso errore. Come si configura il cluster per avere istanze ec2 e che tipo di istanze di container devo utilizzare? Ho pensato che l'intero processo fosse quello di creare le istanze EC2 per cominciare !!


Mi sembra di averlo visto quando sono andato veloce tra le fasi di creazione di un cluster e l'esecuzione di un'attività.
Ben Creasy

Risposte:


158

L'ho capito dopo qualche altra ora di indagini. Amazon, se stai ascoltando, dovresti dichiararlo da qualche parte nella tua console di gestione quando crei un cluster o aggiungi istanze al cluster:

"Prima di poter aggiungere istanze ECS a un cluster, devi prima accedere alla console di gestione EC2 e creare ecs-optimizedistanze con un ruolo IAM a cui è AmazonEC2ContainerServiceforEC2Roleallegata la policy"

Ecco la trafila:

1. Vai alla dashboard di EC2 e fai clic sul Launch Instancepulsante.

2. In Community AMIs, Cerca ecs-optimizede seleziona quello che meglio si adatta alle esigenze del tuo progetto. Qualsiasi funzionerà. Fare clic su Avanti.

3. Quando si arriva a Configura i dettagli dell'istanza, fare clic su create new IAM role linke creare un nuovo ruolo chiamato ecsInstanceRole.

4. Associare la AmazonEC2ContainerServiceforEC2Rolepolitica a quel ruolo.

5. Quindi, completare la configurazione dell'istanza ECS.
NOTA: se stai creando un server web, vorrai creare un securityGroup per consentire l'accesso alla porta 80.

Dopo alcuni minuti, quando l'istanza è inizializzata e in esecuzione, puoi aggiornare la scheda Istanze ECS che stai tentando di aggiungere anche tu.


10
La selezione dell'ami suggerito che era specificato per la regione data ha risolto il mio problema. Per scoprire l'ami dovresti selezionare controlla questo URL docs.aws.amazon.com/AmazonECS/latest/developerguide/…
sanath_p

1
non vedendo AmazonEC2ContainerServiceforEC2Role, c'è qualche cambiamento dal tuo ultimo post?
BlueDolphin

1
@BlueDolphin Sono stato in grado di trovare quella policy quando ho creato un nuovo ruolo in IAM.
cyrf

6
Vale la pena notare ora (aprile 2018) se stai utilizzando l'attuale Beta Fargate ( aws.amazon.com/fargate ) per evitare tutto questo tipo di problemi, potresti come se avessi selezionato EC2come tipo di lancio quando hai ricevuto questo errore ...
declinazione

10
E, durante la creazione di EC2, non dimenticate di aggiungere #!/bin/bash echo ECS_CLUSTER=your_cluster_name >> /etc/ecs/ecs.configin Advanced Details -> User datase avete il vostro gruppo, non di default. In caso contrario, l'istanza EC2 appena creata creerà il cluster predefinito.
Jakub Czaplicki

40

Attualmente, l'interfaccia web di Amazon AWS può creare automaticamente istanze con l'AMI e il nome corretti in modo che si registrino nel cluster corretto.

Anche se tutte le istanze sono state create da Amazon con le impostazioni corrette, le mie istanze non venivano registrate. Sul forum di Amazon AWS ho trovato un indizio. Si scopre che i tuoi cluster richiedono l'accesso a Internet e se il tuo VPC privato non dispone di un gateway Internet, i cluster non saranno in grado di connettersi.

La correzione

Nella dashboard VPC dovresti creare un nuovo Internet Gateway e connetterlo al VPC utilizzato dal cluster. Una volta collegato, è necessario aggiornare (o creare) la tabella di instradamento per il VPC e aggiungerla come ultima riga

0.0.0.0/0 igw-24b16740  

Dove igw-24b16740 è il nome del tuo gateway Internet appena creato.


Questo è menzionato in docs.aws.amazon.com/AWSEC2/latest/UserGuide/… [EC2-VPC] Controlla la tabella di route per la sottorete. È necessaria una route che invii tutto il traffico destinato al di fuori del VPC al gateway Internet per il VPC.
Justin M. Keyes

2
Grazie per l'indizio! Avevo assegnato un gruppo di sicurezza alle mie istanze che bloccava tutto il traffico in uscita ad eccezione del traffico al mio bilanciatore del carico. Ho cambiato questo per consentire tutto il traffico in uscita ma limitare il traffico in entrata solo dal bilanciamento del carico e le istanze sono quindi apparse nel mio cluster EC2.
Mikepote

1
Vorrei poter votare la tua risposta più di una volta. Questo ha risolto il mio problema esatto "Nessuna istanza di contenitore è stata trovata nel tuo cluster". e la risposta originale votata di più non aveva nulla a che fare con la tua soluzione attuale. Grazie ancora.
alexkb

Oltre ad associare il gateway al VPC, potrebbe essere necessario instradare il traffico Internet attraverso di esso per la sottorete specifica che ospita le istanze ECS. - ad esempio aws ec2 associate-route-table --subnet-id $SUBNET_ID --route-table-id $ROUTE_TABLE_ID- posso suggerire di aggiungere questo alla risposta?
Greg

Penso che valga la pena ricordare che nel momento in cui aggiungi una route per 0.0.0..0 / 0 che punta a un IGW, la sottorete non è più una sottorete privata. Dal punto di vista della sicurezza della rete è meglio creare un percorso che punta a un gateway NAT.
Henrik Pingel

18

Ho riscontrato questo problema durante l'utilizzo di Fargate. L'ho risolto quando l'ho definito esplicitamentelaunchType="FARGATE" durante la chiamata run_task.


1
Con la CLI ho aggiunto--launch-type FARGATE
shlomiLan


3

Nel caso qualcun altro sia bloccato con questo problema come me ... Ho provato di tutto qui e non ha funzionato per me.

Oltre a ciò che è stato detto qui riguarda il ruolo dell'istanza EC2, come commentato qui , nel mio caso ha funzionato solo se ho ancora configurato l'istanza EC2 con semplici informazioni. Utilizzando i dati utente uno script iniziale come questo:

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

Informare il nome del cluster ECS correlato creato in questo file di configurazione ecs, ha risolto il mio problema. Senza questa configurazione, il registro dell'agente ECS nell'istanza EC2 mostrava un errore che non era possibile connettersi a ECS, così facendo l'istanza EC2 è visibile al cluster ECS.

Dopo aver fatto ciò, potrei ottenere l'istanza EC2 disponibile per il mio cluster EC2: inserisci qui la descrizione dell'immagine

La documentazione AWS diceva che questa parte è facoltativa, ma nel mio caso non funzionava senza questa configurazione "opzionale".


2

Se hai riscontrato questo problema dopo aver creato il cluster

Vai all'istanza ECS nell'elenco delle istanze EC2 e controlla il ruolo IAM che hai assegnato all'istanza. È possibile identificare facilmente le istanze con il nome dell'istanza che inizia conECS Instance

inserisci qui la descrizione dell'immagine

Dopodiché, fai clic sul ruolo IAM e ti indirizzerà alla console IAM. Seleziona la AmazonEC2ContainerServiceforEC2Rolepolicy dall'elenco delle policy di autorizzazione e salva il ruolo.

Le tue istanze saranno disponibili nel cluster subito dopo il salvataggio.


1

Il vero problema è la mancanza di autorizzazione. Finché crei e assegni un ruolo IAM con l'autorizzazione AmazonEC2ContainerServiceforEC2Role, il problema scompare.


0

Un'altra possibile causa in cui mi sono imbattuto è stata l'aggiornamento dell'AMI del mio cluster ECS a un'AMI "Amazon Linux 2" invece di una "Amazon Linux AMI", che ha causato il mancato funzionamento dello script di avvio user_data di EC2.


0

Quando ciò accade, è necessario prestare attenzione a quanto segue:

  1. Le tue istanze EC2 dovrebbero avere un ruolo con una AmazonEC2ContainerServiceforEC2Rolepolicy gestita associata
  2. Le tue istanze EC2 dovrebbero eseguire l'immagine AMI che è ecs-optimized (puoi verificarlo nella dashboard di EC2)
  3. Le sottoreti private del tuo VPC non hanno IP pubblici assegnati, OPPURE non hai un endpoint VPC di interfaccia configurato, OPPURE non hai configurato il gateway NAT

Il più delle volte, questo problema si verifica a causa del VPC configurato in modo errato. Secondo la documentazione :

PREVENTIVO: se non disponi di un endpoint VPC di interfaccia configurato e le istanze del contenitore non hanno indirizzi IP pubblici, devono utilizzare la traduzione degli indirizzi di rete (NAT) per fornire questo accesso.

  • Per creare un endpoint VPC: segui la documentazione qui
  • Per creare un gateway NAT: seguire la documentazione qui

Questi sono i motivi per cui non vedi le istanze EC2 elencate nel dashboard ECS.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.