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

Date de la dernière mise à jour : 21/03/2022

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

Brève description

Votre agent de conteneur Amazon ECS peut se déconnecter et se reconnecter plusieurs fois par heure dans le cadre de son fonctionnement normal. Ces événements de modification sont un phénomène normal et ne doivent pas vous inquiéter. 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 dans l'état déconnecté pendant une période plus longue, l'instance de conteneur ne peut pas fonctionner dans le cadre de votre cluster Amazon ECS. Ce problème peut être dû aux raisons suivantes :

  • Des problèmes réseaux 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 démon Docker dans l'instance de conteneur.
  • Il existe un conflit de ressources dans l'hôte sous-jacent.

Solution

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

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

Vérifier que l'agent de conteneur est en cours d'exécution 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 spécifie 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û à un agent déconnecté, redémarrez l'agent ECS en exécutant la commande suivante :

$ sudo systemctl restart ecs

Remarque : aucune sortie ne s'affiche après l'exécution de ces commandes.

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 est en cours d'exécution sur l'instance de conteneur

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 spécifie 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 le redémarrer :

sudo systemctl restart docker

Remarque : la commande ne renvoie aucune sortie.

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

sudo systemctl status docker

Examiner les fichiers journaux de l'agent de conteneur et de 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.

Recherchez les mots-clés dans les fichiers journaux suivants, tels que « error » (erreur), « warning » (avertissement) ou « agent transition state » (état de transition de l'agent) :

  • Consultez les derniers journaux de l'agent de conteneur Amazon ECS dans /var/log/ecs/ecs-agent.log Remarque : vous pouvez afficher le journal en rotation en filtrant sur /var/log/ecs/ecs-agent-log.timestamp
  • Affichez le journal d'initialisation d'Amazon ECS dans /var/log/ecs/ecs-init.log
  • Consultez les journaux d'exécution des données utilisateur dans /var/log/cloud-init.log
  • Afficher les journaux du démon Docker avec la commande sudo journalctl -u docker

Remarque : vous pouvez opter pour l'utilisation du collecteur de journaux Amazon ECS pour collecter les journaux généraux du système d'exploitation, les journaux Docker et les journaux d'agent de conteneur pour 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 à l'aide de SSH ou du gestionnaire de session.

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

Le résultat doit être similaire à ce qui suit :

{
  "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'informations d'identification spécifiques avec l'agent de conteneur, exécutez une commande similaire à la suivante pour vérifier le journal de l'agent de conteneur pour une liste de journaux ECS :

Assurez-vous de remplacer YYYY-MM-DD-** par l'horodatage correspondant.

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

Remarque : le journal de l'agent de conteneur fait l'objet d'une rotation toutes les heures. Le suffixe change automatiquement pour refléter la date et l'heure actuelles. Mettez à jour la commande pour inclure la plage de dates et l'ID de journal pour le moment où le problème s'est produit.

Vérifiez que votre instance de conteneur dispose de suffisamment de ressources pour exécuter l'agent ECS

Si vos tâches ont une utilisation élevée de la mémoire/du processeur, votre instance de conteneur peut ne pas disposer de suffisamment de ressources pour exécuter l'agent ECS.

L'agent de conteneur Amazon ECS utilise la fonction Docker ReadMemInfo() 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 choisir de 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, afin que les conteneurs de votre tâche ne se disputent pas le même espace mémoire. Pour plus d'informations, consultez Gestion de la mémoire des instances de conteneur.

Vérifiez que la variable d'environnement ECS_CLUSTER possède le bon nom de cluster

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 se connecter au cluster. Vérifiez le contenu du fichier /etc/ecs/ecs.config pour vérifier ce paramètre.

cat /etc/ecs/ecs.config

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

Assurez-vous que les listes de contrôle d'accès réseau et le groupe de sécurité utilisés par l'instance de conteneur autorisent les connexions sortantes sur le port 443 (HTTPS) pour se connecter aux points de terminaison ECS.

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

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

-ou-

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

Voici quelques-unes des bonnes pratiques à garder à l'esprit :


Cet article vous a-t-il été utile ?


Avez-vous besoin d'aide pour une question technique ou de facturation ?