J'essaie de déployer une image de conteneur docker
vers AWS
à l'aide de ECS
, mais l'instance EC2 n'est pas en cours de création. J'ai parcouru Internet et cherché 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 de menu fixe FROM Ubuntu dans mon référentiel Amazon ECS.
2. 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 consistait à créer les instances EC2 pour commencer !!
Je l'ai compris après quelques heures supplémentaires d'investigation. 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 à EC2 Management Console et créer des instances
ecs-optimized
avec un rôle IAM auquel la stratégieAmazonEC2ContainerServiceforEC2Role
est attachée"
Voici le rigmarole:
1. Accédez à votre EC2 Dashboard et cliquez sur le bouton Launch Instance
.
2. Sous Community AMIs
, recherchez ecs-optimized
et sélectionnez celui qui répond le mieux aux besoins de votre projet. Tout fonctionnera. Cliquez sur Suivant.
3. Lorsque vous avez configuré Configurer les détails de l'instance, cliquez sur le create new IAM role link
et créez un nouveau rôle appelé ecsInstanceRole
.
4. Associez la stratégie AmazonEC2ContainerServiceforEC2Role
à ce rôle.
5. Ensuite, terminez la configuration de votre instance ECS.
NOTE: Si vous créez un serveur Web, vous souhaiterez créer un groupe de sécurité 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.
Actuellement, l'interface Web d'Amazon AWS peut créer automatiquement des instances avec la bonne AMI et le bon nom, afin de pouvoir s'enregistrer dans le bon cluster.
Même si toutes les instances ont été créées par Amazon avec les paramètres corrects, mes instances ne sont pas enregistrées. 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 d'une 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 ajouter la dernière ligne.
0.0.0.0/0 igw-24b16740
Où igw-24b16740 est le nom de votre passerelle Internet fraîchement créée.
Autres vérifications suggérées
1) Le choix de l’AMI suggéré qui a été spécifié pour la région donnée a résolu mon problème. Pour connaître l’AMI - vérifiez cette adresse http://docs.aws.Amazon.com/AmazonECS/latest/developerguide/launch_container_instance.html
2) Par défaut, toutes les instances ec2 sont ajoutées au cluster par défaut. Le nom du cluster a donc également son importance.
Voir le point 10 ici http://docs.aws.Amazon.com/AmazonECS/latest/developerguide/launch_container_instance.html
Plus d'informations disponibles dans cette discussion https://forums.aws.Amazon.com/thread.jspa?threadID=189513
Juste au cas où quelqu'un d'autre serait bloqué par ce problème car j'étais ... J'ai tout essayé ici et cela n'a pas fonctionné pour moi.
Outre ce qui a été dit ici, le rôle de l'instance EC2 a été commenté ici , dans mon cas, il n'a fonctionné que si je configurais encore 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
Informer le nom du 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 de l'instance EC2 affichait une erreur impossible à se connecter au système ECS. Pour ce faire, l'instance EC2 est visible par le cluster ECS.
Après cela, je pourrais obtenir l’instance EC2 disponible pour mon cluster EC2:
La documentation AWS indiquait que cette partie est facultative, mais dans mon cas, cela ne fonctionnait pas sans cette configuration "facultative".
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.
J'ai rencontré ce problème lors de l'utilisation de Fargate. Je l'ai corrigé lorsque je explicitement défini launchType="FARGATE"
lorsque j'ai appelé run_task
.
Si vous rencontrez ce problème après la création du cluster
Recherchez l'instance ECS dans la liste d'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 par ECS Instance
Après cela, cliquez sur le rôle IAM et il vous dirigera vers la console IAM. Sélectionnez la stratégie AmazonEC2ContainerServiceforEC2Role
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 son enregistrement.
Une autre cause possible que j'ai rencontrée est 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é le script de lancement de l'utilisateur EC2 EC2 de fonctionner.