Erreur AWS ECS lors de l'exécution de la tâche: aucune instance de conteneur n'a été trouvée dans votre cluster

115

J'essaie de déployer une dockerimage de conteneur à l' AWSaide ECS, mais l'instance EC2 n'est pas en cours de création. J'ai parcouru Internet à la recherche d'une explication sur les raisons pour lesquelles je reçois l'erreur suivante:

"Une erreur client (InvalidParameterException) s'est produite lors de l'appel de l'opération RunTask: aucune instance de conteneur n'a été trouvée dans votre cluster."

Voici mes étapes:

1. Poussé une image docker D'Ubuntu vers mon dépôt Amazon ECS.

2. A enregistré une définition de tâche ECS:

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

3. A exécuté la tâche:

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

Pourtant, cela échoue.

Voici ma tâche:

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

J'ai également essayé d'utiliser la console de gestion pour configurer un cluster et des services, mais j'obtiens la même erreur. Comment configurer le cluster pour avoir des instances ec2 et quel type d'instances de conteneur dois-je utiliser? Je pensais que tout ce processus était de créer les instances EC2 pour commencer !!

cosbor11
la source
J'ai l'impression d'avoir vu cela lorsque je suis allé rapidement entre les étapes de création d'un cluster et d'exécution d'une tâche.
Ben Creasy

Réponses:

158

J'ai compris cela après quelques heures d'enquête supplémentaires. Amazon, si vous écoutez, vous devez l'indiquer quelque part dans votre console de gestion lors de la création d'un cluster ou de l'ajout d'instances au cluster:

"Avant de pouvoir ajouter des instances ECS à un cluster, vous devez d'abord accéder à la console de gestion EC2 et créer des ecs-optimizedinstances avec un rôle IAM auquel la AmazonEC2ContainerServiceforEC2Rolestratégie est attachée"

Voici la rigmarole:

1. Accédez à votre tableau de bord EC2 et cliquez sur le Launch Instancebouton.

2. Sous Community AMIs, Rechercher ecs-optimizedet sélectionnez celui qui correspond le mieux aux besoins de votre projet. Tout fonctionnera. Cliquez sur Suivant.

3. Lorsque vous arrivez à Configurer les détails de l'instance, cliquez sur create new IAM role linket créez un nouveau rôle appelé ecsInstanceRole.

4. Associez la AmazonEC2ContainerServiceforEC2Rolestratégie à ce rôle.

5. Ensuite, terminez la configuration de votre instance ECS.
REMARQUE: Si vous créez un serveur Web, vous souhaiterez créer un securityGroup pour autoriser l'accès au port 80.

Après quelques minutes, lorsque l'instance est initialisée et en cours d'exécution, vous pouvez actualiser l'onglet Instances ECS que vous essayez également d'ajouter des instances.

cosbor11
la source
10
La sélection de l'ami suggéré qui était spécifié pour la région donnée a résolu mon problème. Pour découvrir l'ami, vous devez sélectionner cette url docs.aws.amazon.com/AmazonECS/latest/developerguide/…
sanath_p
1
vous ne voyez pas AmazonEC2ContainerServiceforEC2Role, y a-t-il des changements depuis votre dernier message?
BlueDolphin
1
@BlueDolphin J'ai pu trouver cette stratégie lorsque j'ai créé un nouveau rôle dans IAM.
cyrf
6
Il convient de noter maintenant (avril 2018) si vous utilisez actuellement Beta Fargate ( aws.amazon.com/fargate ) pour éviter tout ce type de tracas, vous aimerez peut-être que je viens de sélectionner EC2comme type de lancement lorsque vous avez cette erreur ...
déclinaison le
10
Et, lors de la création EC2, ne pas oublier d'ajouter #!/bin/bash echo ECS_CLUSTER=your_cluster_name >> /etc/ecs/ecs.configà Advanced Details -> User datasi vous avez votre propre, non cluster par défaut. Sinon, l'instance EC2 nouvellement créée créera un cluster par défaut.
Jakub Czaplicki
40

Actuellement, l'interface Web Amazon AWS peut créer automatiquement des instances avec l'AMI et le nom corrects afin de s'enregistrer sur le cluster approprié.

Même si toutes les instances ont été créées par Amazon avec les paramètres corrects, mes instances ne s'enregistreraient pas. Sur les forums Amazon AWS, j'ai trouvé un indice. Il s'avère que vos clusters ont besoin d'un accès Internet et si votre VPC privé ne dispose pas de passerelle Internet, les clusters ne pourront pas se connecter.

Le correctif

Dans le tableau de bord VPC, vous devez créer une nouvelle passerelle Internet et la connecter au VPC utilisé par le cluster. Une fois connecté, vous devez mettre à jour (ou créer) la table de routage pour le VPC et l'ajouter en dernière ligne

0.0.0.0/0 igw-24b16740  

Où igw-24b16740 est le nom de votre passerelle Internet fraîchement créée.

P_W999
la source
Ceci est mentionné sur docs.aws.amazon.com/AWSEC2/latest/UserGuide /
Justin M. Keyes
2
Merci pour l'indice! J'avais attribué un groupe de sécurité à mes instances qui bloquait tout le trafic sortant à l'exception du trafic vers mon équilibreur de charge. J'ai changé cela pour autoriser tout le trafic sortant, mais restreindre le trafic entrant uniquement à partir de l'équilibreur de charge, et les instances sont ensuite apparues dans mon cluster EC2.
Mikepote
1
J'aimerais pouvoir voter votre réponse plus d'une fois. Cela a résolu mon problème exact "Aucune instance de conteneur n'a été trouvée dans votre cluster." et la réponse originale votée plus n'avait rien à voir avec votre solution actuelle. Merci encore.
alexkb
En plus d'associer la passerelle à votre VPC, vous devrez peut-être acheminer le trafic Internet à travers celle-ci pour le sous-réseau spécifique qui héberge vos instances ECS. - par exemple aws ec2 associate-route-table --subnet-id $SUBNET_ID --route-table-id $ROUTE_TABLE_ID- puis-je suggérer d'ajouter ceci à la réponse?
Greg
Je pense qu'il vaut la peine de mentionner qu'au moment où vous ajoutez une route pour 0.0.0..0 / 0 pointant vers un IGW, le sous-réseau n'est plus un sous-réseau privé. Du point de vue de la sécurité du réseau, il est préférable de créer une route pointant vers une passerelle NAT.
Henrik Pingel
18

J'ai rencontré ce problème lors de l'utilisation de Fargate. Je l'ai corrigé lorsque je l'ai défini explicitementlaunchType="FARGATE" lors de l'appel run_task.

Milan Cermak
la source
1
Avec la CLI, j'ai ajouté--launch-type FARGATE
shlomiLan
11

Autres vérifications suggérées

  1. La sélection de l'AMI suggérée spécifiée pour la région donnée a résolu mon problème.

    Pour connaître l'AMI, cochez Lancement d'une instance de conteneur Amazon ECS .

  2. Par défaut, toutes les instances ec2 sont ajoutées au cluster par défaut. Le nom du cluster compte donc également.

Voir le point 10 sur Lancement d'une instance de conteneur Amazon ECS .

Plus d'informations disponibles dans ce fil .

sanath_p
la source
3

Juste au cas où quelqu'un d'autre serait bloqué avec ce problème comme je l'étais ... J'ai tout essayé ici et je n'ai pas travaillé pour moi.

En plus de ce qui a été dit ici, le rôle d'instance EC2, comme commenté ici , ne fonctionnait dans mon cas que si je configurais toujours l'instance EC2 avec des informations simples. En utilisant les données utilisateur, un script initial comme celui-ci:

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

L'information du nom de cluster ECS associé créé dans ce fichier de configuration ecs a résolu mon problème. Sans cette configuration, le journal de l'agent ECS sur l'instance EC2 montrait une erreur qui n'était pas possible de se connecter à l'ECS, ce qui fait que j'ai l'instance EC2 visible par le cluster ECS.

Après cela, je pourrais obtenir l'instance EC2 disponible pour mon cluster EC2: entrez la description de l'image ici

La documentation AWS dit que cette partie est facultative, mais dans mon cas, cela ne fonctionnait pas sans cette configuration «facultative».

Ualter Jr.
la source
2

Si vous avez rencontré ce problème après la création du cluster

Accédez à l'instance ECS dans la liste des instances EC2 et vérifiez le rôle IAM que vous avez attribué à l'instance. Vous pouvez facilement identifier les instances avec le nom de l'instance commençant parECS Instance

entrez la description de l'image ici

Après cela, cliquez sur le rôle IAM et il vous dirigera vers la console IAM. Sélectionnez la AmazonEC2ContainerServiceforEC2Rolestratégie dans la liste des stratégies d'autorisation et enregistrez le rôle.

Vos instances seront disponibles dans le cluster peu de temps après leur enregistrement.

sandaru.ny
la source
1

Le vrai problème est le manque de permission. Tant que vous créez et attribuez un rôle IAM avec l'autorisation AmazonEC2ContainerServiceforEC2Role, le problème disparaît.

Ben
la source
0

Une autre cause possible que j'ai rencontrée était la mise à jour de mon AMI de cluster ECS vers une AMI "Amazon Linux 2" au lieu d'une "AMI Amazon Linux", ce qui a empêché mon script de lancement EC2 user_data.

skeller88
la source
0

Lorsque cela se produit, vous devez examiner les éléments suivants:

  1. Vos instances EC2 doivent avoir un rôle auquel est AmazonEC2ContainerServiceforEC2Roleattachée une stratégie gérée
  2. Vos instances EC2 doivent exécuter une image AMI qui est ecs-optimized (vous pouvez le vérifier dans le tableau de bord EC2)
  3. Les sous-réseaux privés de votre VPC n'ont pas d'adresse IP publique attribuée, OU vous n'avez pas de point de terminaison de VPC d'interface configuré, OU vous n'avez pas de passerelle NAT configurée

La plupart du temps, ce problème apparaît en raison du VPC mal configuré. Selon la documentation :

QUOTE: Si vous n'avez pas configuré de point de terminaison VPC d'interface et que vos instances de conteneur n'ont pas d'adresse IP publique, elles doivent utiliser la traduction d'adresses réseau (NAT) pour fournir cet accès.

  • Pour créer un point de terminaison VPC: suivez la documentation ici
  • Pour créer une passerelle NAT: suivez la documentation ici

Voici les raisons pour lesquelles vous ne voyez pas les instances EC2 répertoriées dans le tableau de bord ECS.

Un coup de feu
la source