Pourquoi les instances de conteneur Amazon ECS avec des images AMI Amazon Linux 2 sont-elles déconnectées ?

Date de la dernière mise à jour : 12/09/2019

Les instances de conteneur pour Amazon Elastic Container Service (Amazon ECS) sont déconnectées. Comment résoudre ce problème ?

Brève description

Votre agent de conteneur Amazon ECS peut se connecter et se reconnecter plusieurs fois par heure. Ces événements de modification sont normaux et ne doivent pas vous inquiéter.

Toutefois, si l'agent de conteneur reste déconnecté, il est possible que l'instance de conteneur cesse de fonctionner dans le cadre de votre cluster ECS. L'agent est déconnecté lorsque agentConnected renvoie la valeur false. Le problème peut avoir les origines suivantes :

  • Il existe des problèmes de mise en réseau qui empêchent la communication entre l'instance et Amazon ECS.
  • L'agent de conteneur n'a pas les autorisations AWS Identity and Access Management (IAM) nécessaires pour communiquer avec les points de terminaison Amazon ECS
  • Il existe des problèmes liés à l'hôte ou au service Docker dans l'instance de conteneur.

Procédez comme suit pour identifier la cause de la déconnexion.

Remarque : la solution suivante s'applique aux images AMI Amazon Linux 2 optimisées pour Amazon ECS. Pour une solution qui s'applique aux images AMI Amazon Linux 1 optimisées pour Amazon ECS, consultez Pourquoi mes instances de conteneur Amazon ECS avec des images AMI Amazon Linux 1 sont-elles déconnectées ?

Solution

Vérifier que le service Docker est en cours d'exécution sur l'instance de conteneur

1.    Pour vérifier que le service Docker est en cours d'exécution sur l'instance de conteneur affectée, exécutez la commande suivante :

sudo systemctl status docker

La sortie de la commande doit être semblable à celle ci-dessous :

  docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
   Active: active (running) since Fri 2019-06-28 03:23:52 UTC; 1 day 12h ago
     Docs: https://docs.docker.com
  Process: 5519 ExecStartPre=/usr/libexec/docker/docker-setup-runtimes.sh (code=exited, status=0/SUCCESS)
  Process: 5509 ExecStartPre=/bin/mkdir -p /run/docker (code=exited, status=0/SUCCESS)
 Main PID: 5531 (dockerd)
    Tasks: 60
   Memory: 55.4M
   CGroup: /system.slice/docker.service
           ├─5531 /usr/bin/dockerd --default-ulimit nofile=1024:4096
           ├─5570 docker-containerd --config /var/run/docker/containerd/containerd.toml
           ├─5782 docker-containerd-shim -namespace moby -workdir /var/lib/docker/containerd/...
           ├─6006 docker-containerd-shim -namespace moby -workdir /var/lib/docker/containerd/...
           └─6284 docker-containerd-shim -namespace moby -workdir /var/lib/docker/containerd/...

Si le service Docker est inactif, exécutez la commande suivante pour le redémarrer :

sudo systemctl restart docker

Remarque : la commande ne doit renvoyer aucune donnée, mais vous pouvez exécuter la commande sudo systemctl status docker pour vérifier que le service Docker est démarré.

2.    Pour démarrer l'agent de conteneur, exécutez la commande suivante :

sudo systemctl start ecs

Vérifier que l'agent de conteneur est en cours d'exécution sur l'instance de conteneur

Pour vérifier que l'agent de conteneur est en cours d'exécution sur l'instance de conteneur affectée, exécutez la commande suivante :

sudo systemctl status ecs

La sortie de la commande doit être semblable à celle ci-dessous :

ecs.service - Amazon Elastic Container Service - container agent
   Loaded: loaded (/usr/lib/systemd/system/ecs.service; enabled; vendor preset: disabled)
   Active: active (running) since Sat 2019-06-29 15:45:57 UTC; 4min 5s ago
     Docs: https://aws.amazon.com/documentation/ecs/
  Process: 18896 ExecStopPost=/usr/libexec/amazon-ecs-init post-stop (code=exited, status=0/SUCCESS)
  Process: 18818 ExecStop=/usr/libexec/amazon-ecs-init stop (code=exited, status=0/SUCCESS)
  Process: 19422 ExecStartPre=/usr/libexec/amazon-ecs-init pre-start (code=exited, status=0/SUCCESS)
 Main PID: 19455 (amazon-ecs-init)
    Tasks: 7
   Memory: 2.7M
   CGroup: /system.slice/ecs.service
           └─19455 /usr/libexec/amazon-ecs-init start

Si la sortie de la commande n'indique pas que le service est actif, exécutez la commande suivante pour le redémarrer :

sudo systemctl restart ecs

Remarque : la commande ne doit renvoyer aucune donnée, mais vous pouvez exécuter la commande sudo systemctl status ecs pour vérifier que l'agent de conteneur est démarré.

Examiner les fichiers journaux de l'agent de conteneur et Docker

Si vos instances de conteneur sont toujours déconnectées, consultez les fichiers journaux de l'hôte du conteneur pour l'agent de conteneur et Docker.

Pour générer les fichiers journaux de l'agent de conteneur et de Docker, exécutez les commandes suivantes :

 sudo journalctl -u ecs
 sudo journalctl -u docker

Remarque : pour collecter les informations des journaux à partir de l'instance de conteneur, exécutez le collecteur de journaux Amazon ECS.

Vérifier que le profil d'instance IAM possède les autorisations nécessaires

Si l'agent de conteneur est toujours déconnecté, vérifiez que le profil d'instance IAM associé à l'instance de conteneur dispose des autorisations IAM nécessaires.

1.    Connectez-vous à l'instance en utilisant SSH.

2.    Pour afficher les métadonnées de l'instance dans le profil d'instance associé à l'instance, exécutez la commande suivante :

curl http://169.254.169.254/latest/meta-data/iam/info

La sortie de la commande doit être semblable à celle ci-dessous :

{
  "Code" : "Success",
  "LastUpdated" : "2019-06-29T15:47:03Z",
  "InstanceProfileArn" : "arn:aws:iam::1122334455:instance-profile/ecsInstanceRole",
  "InstanceProfileId" : "AIPAJ5WF3LZVY7PLUHV72"
}

3.    Vérifiez que le rôle IAM contient les autorisations appropriées pour vos instances de conteneur.

4.    Pour vérifier des erreurs d'informations d'identification spécifiques avec l'agent de conteneur, exécutez la commande suivante pour vérifier le journal de l'agent de conteneur ECS pour obtenir une liste de journaux ECS :

cat /var/log/ecs/ecs-agent.log.YYYY-MM-DD-**

Remarque : le journal de l'agent de conteneur change toutes les heures, et le suffixe change automatiquement pour refléter la date et l'heure actuelles. Modifiez la commande pour inclure la plage de dates et l'ID de journal correspondant au moment où le problème s'est produit.

Si l'agent de conteneur ne dispose pas des informations d'identification nécessaires, les journaux contiennent une erreur similaire à celle ci-dessous :

2019-06-29T16:10:09Z [ERROR] Unable to register as a container instance with ECS: AccessDeniedException: User: arn:aws:sts::1122334455:assumed-role/ecsInstanceRole/i-0052b2e858b1891ef is not authorized to perform: ecs:RegisterContainerInstance on resource: arn:aws:ecs:us-east-1:1122334455:cluster/exampleCluster
    status code: 400, request id: 0b73e260-5088-4688-a425-6f35f1ef440f
2019-06-29T16:10:09Z [ERROR] Error re-registering: AccessDeniedException: User: arn:aws:sts::1122334455:assumed-role/ecsInstanceRole/i-0052b2e858b1891ef is not authorized to perform: ecs:RegisterContainerInstance on resource: arn:aws:ecs:us-east-1:1122334455:cluster/exampleCluster
    status code: 400, request id: 0b73e260-5088-4688-a425-6f35f1ef440f