Passer au contenu

Comment résoudre les problèmes liés à la déconnexion d'un agent Amazon ECS ?

Lecture de 8 minute(s)
0

Mes instances de conteneur pour Amazon Elastic Container Service (Amazon ECS) sont déconnectées.

Brève description

Il est normal que votre agent de conteneur Amazon ECS se déconnecte et se reconnecte plusieurs fois par heure dans le cadre de son fonctionnement normal. Ces événements de changement ne sont pas préoccupants. Les événements de connexion qui ne durent que quelques minutes peuvent ne pas indiquer de problèmes avec l'agent de conteneur ou votre instance de conteneur.

Toutefois, si l'agent de conteneur reste déconnecté pendant plus longtemps, l'instance de conteneur ne peut pas fonctionner dans le cadre de votre cluster Amazon ECS. Ce problème peut être dû à l'une des raisons suivantes :

  • Des problèmes de réseau empêchent la communication entre l'instance et Amazon ECS.
  • L'agent de conteneur ne dispose pas des autorisations Gestion des identités et des accès AWS (AWS IAM) requises pour communiquer avec les points de terminaison Amazon ECS.
  • L'hôte ou le démon Docker à l'intérieur de l'instance de conteneur présente des problèmes.
  • Il existe un conflit de ressources dans l'hôte sous-jacent.

Remarque : Il est recommandé d'utiliser la dernière version de l'agent de conteneur Amazon ECS.

Résolution

Remarque : La résolution suivante s'applique aux AMI Amazon Linux 2 optimisées pour Amazon ECS.

Vous pouvez utiliser des clés SSH pour vous connecter à vos instances Amazon EC2. Si les clés SSH ne sont pas générées, vous pouvez utiliser Session Manager, une fonctionnalité d'AWS Systems Manager, pour vous connecter à votre instance. Par défaut, l'agent Systems Manager est installé sur les AMI Amazon Linux 2 et sur les AMI de base optimisées pour Amazon Linux 2 ECS.

Vérifier que l'agent de conteneur s'exécute sur l'instance de conteneur

Pour vérifier l'état et la connectivité de l'agent de conteneur Amazon ECS, exécutez l'une des commandes suivantes sur votre instance de conteneur :

$ sudo systemctl status ecs            
$ sudo docker ps -f name=ecs-agent

La sortie indique qu'elle est active (en cours d'exécution) et ressemble à ce qui suit :

ecs.service - Amazon Elastic Container Service - container agent   Loaded: loaded (/usr/lib/systemd/system/ecs.service; enabled; vendor preset: disabled)
   Active: active (running) since Tue 2022-02-15 15:51:09 UTC; 37min ago
     Docs: https://aws.amazon.com/documentation/ecs/
  Process: 30039 ExecStopPost=/usr/libexec/amazon-ecs-init post-stop (code=exited, status=0/SUCCESS)
  Process: 29987 ExecStop=/usr/libexec/amazon-ecs-init stop (code=exited, status=0/SUCCESS)
  Process: 30077 ExecStartPre=/usr/libexec/amazon-ecs-init pre-start (code=exited, status=0/SUCCESS)
 Main PID: 30123 (amazon-ecs-init)
    Tasks: 5
   Memory: 3.7M
   CGroup: /system.slice/ecs.service
           └─30123 /usr/libexec/amazon-ecs-init start

CONTAINER ID   IMAGE                                            COMMAND    CREATED      STATUS                PORTS     NAMES
eb1dc8d4ab3b   amazon/amazon-ecs-agent:latest   "/agent"        3 days ago   Up 3 days (healthy)                        ecs-agent

Si le problème est dû à la déconnexion d'un agent, exécutez la commande suivante pour redémarrer l'agent ECS :

$ sudo systemctl restart ecs

Remarque : Aucune sortie n'est renvoyée après avoir exécuté les commandes précédentes.

Pour vérifier que l'agent est en cours d'exécution, exécutez la commande suivante :

sudo systemctl status ecs

Vérifier que le service Docker s'exécute sur l'instance de conteneur

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

sudo systemctl status docker

La sortie indique qu'elle est active (en cours d'exécution) et ressemble à ce qui suit :

docker.service - Docker Application Container Engine   Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
   Active: active (running) since Fri 2022-02-11 17:42:32 UTC; 3 days ago
     Docs: https://docs.docker.com
  Process: 4307 ExecStartPre=/usr/libexec/docker/docker-setup-runtimes.sh (code=exited, status=0/SUCCESS)
  Process: 4296 ExecStartPre=/bin/mkdir -p /run/docker (code=exited, status=0/SUCCESS)
 Main PID: 4315 (dockerd)
    Tasks: 24
   Memory: 360.5M
   CGroup: /system.slice/docker.service
           ├─4315 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --default-ulimit nofile=32768:65536
           ├─6010 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 80 -container-ip 172.17.0.2 -container-port 80
           └─6016 /usr/bin/docker-proxy -proto tcp -host-ip :: -host-port 80 -container-ip 172.17.0.2 -container-port 80

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

sudo systemctl restart docker

Remarque : Aucune sortie n'est renvoyée après avoir exécuté les commandes précédentes.

Pour vérifier que le service Docker a redémarré, exécutez la commande suivante :

sudo systemctl status docker

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

Si votre instance de conteneur est toujours déconnectée, consultez les fichiers journaux sur l'hôte du conteneur pour l'agent de conteneur et Docker.

Consultez les fichiers journaux suivants pour les mots-clés, tels que "error", "warn" ou "agent transition state" :

  • Consulter les derniers journaux de l'agent de conteneur Amazon ECS à l'adresse /var/log/ecs/ecs-agent.log
    Remarque :
    Vous pouvez consulter le journal renouvelé en filtrant sur /var/log/ecs/ecs-agent-log.timestamp
  • Consultez le journal d’initialisation Amazon ECS dans le fichier /var/log/ecs/ecs-init.log.
  • Consulter les journaux d'exécution des données utilisateur sur /var/log/cloud-init.log
  • Afficher les journaux du démon Docker à l'aide de la commande sudo journalctl -u docker

Si vous utilisez Linux, vous pouvez également vérifier le code de sortie pour plus d'informations sur le conteneur d'agent arrêté. Pour en savoir plus, consultez la page exitcodes sur le site Web de GitHub.

Pour obtenir le code de sortie, exécutez la commande suivante :

docker inspect your container ID

Remplacez votre ID de conteneur par l'ID du conteneur arrêté.

Remarque : Vous pouvez utiliser le collecteur de journaux Amazon ECS pour collecter les journaux généraux du système d'exploitation, les journaux Docker et les journaux de l’agent de conteneur Amazon ECS.

Vérifier que le profil d'instance IAM dispose des 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. Utilisez SSH ou Session Manager pour vous connecter à l'instance.

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

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

    Vous obtiendrez une sortie de ce type :

    {
      "Code" : "Success",
      "LastUpdated" : "2022-02-16T22:42:17Z",
      "InstanceProfileArn" : "arn:aws:iam::1122334455:instance-profile/ecsInstanceRole",
      "InstanceProfileId" : "AIPA4VIZXOFF55F72XIZN"
    }
  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'identification spécifiques, exécutez une commande similaire à la suivante pour rechercher la liste des journaux ECS dans le journal de l'agent de conteneur :

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

    Remplacez YYYY-MM-DD-## par l'horodatage pertinent.

Remarque : Le journal de l’agent de conteneur est renouvelé toutes les heures. Le suffixe change automatiquement pour refléter la date et l'heure courantes. Mettez à jour la commande pour inclure la plage de dates et l'ID de journal correspondant à la date à laquelle le problème s'est produit.

Vérifier que votre instance de conteneur dispose d’une quantité suffisante de ressources pour exécuter l'agent ECS

Si vos tâches nécessitent une utilisation élevée de la mémoire/du processeur, il est possible que votre instance de conteneur ne dispose pas d’une quantité suffisante de ressources pour exécuter l'agent ECS.

L'agent de conteneur Amazon ECS utilise la fonction ReadMemInfo() de Docker pour interroger la quantité de mémoire disponible pour le système d'exploitation.

Exécutez la commande suivante sur votre instance de conteneur pour afficher la mémoire totale reconnue par le système d'exploitation :

free -b

Exemple de sortie pour une instance t2.large exécutant l'AMI Amazon Linux optimisée pour Amazon ECS :

                          total        used         free                   shared     buff/cache    available
Mem:                    8361193472   298577920     7325388800              405504      737226752    7844274176
Swap:                     0              0           0

Vous pouvez, si vous le souhaitez, réserver de la mémoire pour l'agent de conteneur Amazon ECS et d'autres processus système critiques sur vos instances de conteneur. La réservation de cette mémoire permet de s'assurer que les conteneurs de votre tâche ne se disputent pas la même mémoire. Pour plus d'informations, consultez la section Réservation de la mémoire d'une instance de conteneur Amazon ECS Linux.

Vérifier que le nom de cluster de la variable d'environnement ECS_CLUSTER est correct

Si le paramètre de configuration de l'agent de conteneur Amazon ECS ECS_CLUSTER a un nom de cluster incorrect, l'instance de conteneur ne peut pas rejoindre le cluster. Pour vérifier le contenu du fichier /etc/ecs/ecs.config afin de vérifier ce paramètre, exécutez la commande suivante :

cat /etc/ecs/ecs.config

Vérifier que l'agent ECS peut communiquer avec les points de terminaison ECS

Pour se connecter aux points de terminaison ECS, les listes de contrôle d'accès au réseau et le groupe de sécurité de l'instance de conteneur doivent autoriser les connexions sortantes sur le port 443 (HTTPS).

Pour vérifier les connexions sortantes aux points de terminaison ECS (ACS/TCS), exécutez l'une des commandes suivantes sur votre instance de conteneur :

sudo yum install telnet -y$ telnet ecs.region.amazonaws.com 443

-ou-

$ curl https://ecs.region.amazonaws.com

Examinez les bonnes pratiques suivantes :

Informations connexes

Résolution de problèmes liés à Amazon ECS

Créer le rôle d'instance de conteneur

Consultation des journaux des agents de conteneur Amazon ECS

AWS OFFICIELA mis à jour il y a un an