View a markdown version of this page

Surveillance des conteneurs Amazon ECS avec ECS Exec - Amazon Elastic Container Service

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Surveillance des conteneurs Amazon ECS avec ECS Exec

Avec Amazon ECS Exec, vous pouvez interagir directement avec les conteneurs sans avoir besoin d'interagir avec le système d'exploitation du conteneur hôte, d'ouvrir des ports entrants ou de gérer les clés SSH au préalable. Vous pouvez utiliser ECS Exec pour exécuter des commandes dans ou obtenir un shell vers un conteneur s'exécutant sur une instance Amazon EC2 ou sur AWS Fargate. Cela facilite la collecte des informations de diagnostic et la résolution rapide des erreurs. Par exemple, dans le cadre d'un développement, vous pouvez utiliser ECS Exec pour interagir facilement avec différents processus dans vos conteneurs et dépanner vos applications. Et dans les scénarios de production, vous pouvez l’utiliser pour obtenir un accès d’urgence à vos conteneurs afin de déboguer les problèmes.

Vous pouvez exécuter des commandes dans un conteneur Linux ou Windows en cours d'exécution à l'aide d'ECS Exec depuis l'API Amazon ECS, AWS Command Line Interface (AWS CLI), AWS SDK, ou AWS Interface de ligne de commande Copilote. Pour plus de détails sur l'utilisation d'ECS Exec, ainsi qu'une présentation vidéo, utilisez AWS Interface de ligne de commande Copilot, consultez le Copilote GitHub documentation.

Vous pouvez également utiliser ECS Exec pour appliquer des politiques de contrôle d’accès plus strictes. En activant cette fonction de manière sélective, vous pouvez contrôler qui peut exécuter des commandes et sur quelles tâches. Avec un journal de chaque commande et de leur sortie, vous pouvez utiliser ECS Exec pour voir quelles tâches ont été exécutées et vous pouvez utiliser CloudTrail pour vérifier qui a accédé à un conteneur.

Considérations

Tenez compte des éléments suivants lorsque vous utilisez ECS Exec :

  • ECS Exec risque de ne pas fonctionner comme prévu s’il est exécuté sur des systèmes d’exploitation non pris en charge par Systems Manager. Pour plus d’informations sur les systèmes d’exploitation pris en charge, consultez la section Types de systèmes d’exploitation dans le Guide de l’utilisateur AWS Systems Manager .

  • ECS Exec est pris en charge pour les tâches exécutées sur l'infrastructure suivante :

    • Conteneurs Linux sur Amazon EC2 sur n'importe quel Amazon ECS-optimized AMI, y compris Bottlerocket

    • Conteneurs Linux et Windows sur des instances externes (Amazon ECS Anywhere)

    • Conteneurs Linux et Windows sur AWS Fargate

    • Conteneurs Windows sur Amazon EC2 sur les appareils Windows Amazon suivants ECS-optimized AMI (avec la version Container Agent) 1.56 ou plus tard) :

      • Amazon ECS-optimized AMI complète pour Windows Server 2022

      • Amazon ECS-optimized AMI principale pour Windows Server 2022

      • Amazon ECS-optimized AMI complète pour Windows Server 2019

      • Amazon ECS-optimized AMI principale pour Windows Server 2019

      • Amazon ECS-optimized AMI principale Windows Server 20H2

  • Si vous avez configuré un proxy HTTP pour votre tâche, définissez la variable d’environnement NO_PROXY sur "NO_PROXY=169.254.169.254,169.254.170.2" afin de contourner le proxy pour les métadonnées de l’instance EC2 et le trafic des rôles IAM. Si vous ne configurez pas la variable d’environnement NO_PROXY, des échecs peuvent survenir lors de la récupération des métadonnées de l’instance ou des informations d’identification du rôle IAM à partir du point de terminaison des métadonnées du conteneur. La définition de la variable d’environnement NO_PROXY comme recommandé filtre les métadonnées et le trafic IAM afin que les requêtes 169.254.169.254 and 169.254.170.2 ne passent pas par le proxy HTTP.

  • ECS Exec et Amazon VPC

    • Si vous utilisez l'interface des points de terminaison Amazon VPC avec Amazon ECS, vous devez créer l'interface des points de terminaison Amazon VPC pour le Gestionnaire de sessions Systems Manager (ssmmessages). Pour plus d'informations sur les points de terminaison VPC de Systems Manager, consultez Utiliser AWS PrivateLink pour configurer un point de terminaison VPC pour Session Manager dans le AWS Systems Manager Guide de l'utilisateur.

    • Si vous utilisez une interface entre les points de terminaison Amazon VPC et Amazon ECS, et que vous utilisez AWS KMS key pour le chiffrement, vous devez créer l'interface Amazon VPC endpoint pour AWS KMS key. Pour plus d'informations, consultez Configuration à AWS KMS key via un point de terminaison de VPC dans le Guide du développeur AWS Key Management Service .

    • Lorsque vous avez des tâches exécutées sur des instances Amazon EC2, utilisez le mode réseau awsvpc. Si vous n’avez pas accès à Internet (par exemple, si vous n’êtes pas configuré pour utiliser une passerelle NAT), vous devez créer les points de terminaison Amazon VPC d’interface pour le Gestionnaire de session Systems Manager (ssmmessages). Pour plus d'informations sur les considérations relatives au mode réseau awsvpc, veuillez consulter Considérations (langue française non garantie). Pour plus d'informations sur les points de terminaison VPC de Systems Manager, consultez Utiliser AWS PrivateLink pour configurer un point de terminaison VPC pour Session Manager dans le AWS Systems Manager Guide de l'utilisateur.

  • Amazon ECS Exec n'est pas pris en charge pour les tâches exécutées dans IPv6-only configuration. Pour plus d'informations sur l'exécution de tâches dans un IPv6-only configuration, voir Options de mise en réseau des tâches Amazon ECS pour Fargate et Options de mise en réseau des tâches Amazon ECS pour EC2.

  • ECS Exec et SSM

    • Votre tâche nécessite un rôle IAM doté des autorisations requises pour SSM Session Manager. Pour les tâches sur Amazon EC2, si aucun rôle de tâche n'est configuré, le rôle d'instance de l'instance Amazon EC2 sous-jacente est utilisé à la place. Pour plus d’informations, consultez Autorisations ECS Exec.

    • Lorsqu'un utilisateur exécute des commandes sur un conteneur à l'aide d'ECS Exec, ces commandes sont exécutées en tant qu'utilisateur root. Le SSM Agent et ses processus enfants s'exécutent en tant qu'utilisateur racine même lorsque vous spécifiez un ID d'utilisateur pour le conteneur.

    • L’agent SSM exige qu’il soit possible d’écrire dans le système de fichiers du conteneur pour créer les répertoires et fichiers requis. Par conséquent, il n'est pas possible de rendre le système de fichiers racine en lecture seule à l'aide du paramètre de définition de tâche readonlyRootFilesystem ou de toute autre méthode.

    • Il est possible de démarrer des sessions SSM en dehors de l'action execute-command, mais les sessions ne sont pas journalisées et sont comptabilisées afin de vérifier qu'elles ne dépassent pas la limite de session. Nous vous recommandons de limiter cet accès en refusant l'action ssm:start-session à l'aide d'une stratégie IAM. Pour plus d’informations, consultez Limitation de l'accès à l'action StartSession.

  • Les fonctionnalités suivantes s’exécutent en tant que conteneur sidecar. Par conséquent, vous devez spécifier le nom du conteneur sur lequel exécuter la commande.

    • Surveillance d’exécution

    • Connexion au service

  • Les utilisateurs peuvent exécuter toutes les commandes qui sont disponibles dans le contexte de conteneur. Les actions suivantes peuvent entraîner des processus orphelins et zombies : arrêt du processus principal du conteneur, arrêt de l'agent de commande et suppression des dépendances. Pour nettoyer les processus zombie, nous vous recommandons d'ajouter l'indicateur initProcessEnabled à votre définition de tâche.

  • ECS Exec utilise une partie de l’UC et de la mémoire. Vous devez en tenir compte lorsque vous spécifiez les allocations de ressources CPU et mémoire dans votre définition de tâche.

  • Vous devez utiliser AWS CLI version 1.22.3 ou plus tard ou AWS CLI version 2.3.6 ou plus tard. Pour plus d'informations sur la mise à jour du AWS CLI, voir Installation ou mise à jour de la dernière version du AWS CLI dans le AWS Command Line Interface Guide de l'utilisateur version 2.

  • Vous ne pouvez avoir qu'une seule session ECS Exec par espace de noms d'ID de processus (PID). Si vous partagez un espace de noms PID dans une tâche, vous ne pouvez démarrer des sessions ECS Exec que dans un seul conteneur.

  • La session ECS Exec a une valeur de délai d'inactivité de 20 minutes. Cette valeur ne peut pas être modifiée.

  • Vous ne pouvez pas activer ECS Exec pour les tâches existantes. Vous ne pouvez l'activer que pour les nouvelles tâches.

  • Vous ne pouvez pas utiliser ECS Exec lorsque vous utilisez run-task pour lancer une tâche sur un cluster qui utilise la mise à l’échelle gérée avec placement asynchrone (lancement d’une tâche sans instance).

  • Vous ne pouvez pas exécuter ECS Exec sur des conteneurs Microsoft Nano Server.

Architecture

ECS Exec utilise AWS Systems Manager (SSM) Session Manager pour établir une connexion avec le conteneur en cours d'exécution et utilise Gestion des identités et des accès AWS politiques (IAM) pour contrôler l'accès aux commandes en cours d'exécution dans un conteneur en cours d'exécution. Ceci est rendu possible par le montage lié des fichiers binaires du SSM Agent nécessaires dans le conteneur. L'Amazon ECS ou AWS Fargate l'agent est chargé de démarrer l'agent principal SSM à l'intérieur du conteneur à côté du code de votre application. Pour plus d'informations, consultez Systems Manager Session Manager.

Vous pouvez vérifier quel utilisateur a accédé au conteneur à l'aide du ExecuteCommand événement en AWS CloudTrail et enregistrez chaque commande (et son résultat) sur Amazon S3 ou Amazon CloudWatch Journaux. Pour chiffrer les données entre le client local et le conteneur à l'aide de votre propre clé de chiffrement, vous devez fournir le AWS Key Management Service (AWS KMS) clé.

Configuration d’ECS Exec

Pour utiliser ECS Exec, vous devez d’abord activer la fonctionnalité pour vos tâches et services. Vous pouvez ensuite exécuter des commandes dans vos conteneurs.

Modifications facultatives de la définition de tâche

Si vous définissez le paramètre de définition de tâche initProcessEnabled sur true, le processus init démarre à l’intérieur du conteneur. Cela supprime tous les processus enfants de l’agent SSM zombie trouvés. Voici un exemple.

{ "taskRoleArn": "ecsTaskRole", "networkMode": "awsvpc", "requiresCompatibilities": [ "EC2", "FARGATE" ], "executionRoleArn": "ecsTaskExecutionRole", "memory": ".5 gb", "cpu": ".25 vcpu", "containerDefinitions": [ { "name": "amazon-linux", "image": "amazonlinux:latest", "essential": true, "command": ["sleep","3600"], "linuxParameters": { "initProcessEnabled": true } } ], "family": "ecs-exec-task" }

Activation d'ECS Exec pour vos tâches et services

Vous pouvez activer la fonction ECS Exec pour vos services et vos tâches autonomes en spécifiant --enable-execute-command drapeau lors de l'utilisation de l'un des indicateurs suivants AWS CLI commandes : create-service, update-service, start-task, ou run-task.

Par exemple, si vous exécutez la commande suivante, la fonctionnalité ECS Exec est activée pour un service nouvellement créé. Pour plus d'informations sur la création de services, consultez create-service.

aws ecs create-service \ --cluster cluster-name \ --task-definition task-definition-name \ --enable-execute-command \ --service-name service-name \ --launch-type FARGATE \ --network-configuration "awsvpcConfiguration={subnets=[subnet-12344321],securityGroups=[sg-12344321],assignPublicIp=ENABLED}" \ --desired-count 1

Après avoir activé ECS Exec pour une tâche, vous pouvez exécuter la commande suivante pour confirmer que la tâche est prête à être utilisée. Si la propriété lastStatus de ExecuteCommandAgent est répertoriée comme RUNNING et que la propriété enableExecuteCommand est définie sur true, alors votre tâche est prête.

aws ecs describe-tasks \ --cluster cluster-name \ --tasks task-id

L'extrait de sortie suivant est un exemple de ce que vous pouvez voir.

{ "tasks": [ { ... "containers": [ { ... "managedAgents": [ { "lastStartedAt": "2021-03-01T14:49:44.574000-06:00", "name": "ExecuteCommandAgent", "lastStatus": "RUNNING" } ] } ], ... "enableExecuteCommand": true, ... } ] }

Exécution de commandes avec ECS Exec

Journalisation à l’aide d’ECS Exec

Vous pouvez configurer la journalisation des sessions ECS Exec afin de capturer les commandes et leur sortie à des fins d’audit et de résolution des problèmes.

Activation de la journalisation et de l’audit dans vos tâches et services

Important

Pour plus d'informations sur CloudWatch tarification, voir CloudWatch Tarification. Amazon ECS propose également des métriques de surveillance sans coûts supplémentaires. Pour plus d’informations, consultez Surveillez Amazon ECS à l'aide CloudWatch.

Amazon ECS fournit une configuration par défaut pour les commandes de journalisation exécutées à l’aide d’ECS Exec. Par défaut, les journaux sont envoyés à CloudWatch Journaux à l'aide du awslogs pilote de journal configuré dans votre définition de tâche. Si vous souhaitez fournir une configuration personnalisée, AWS CLI prend en charge un --configuration drapeau pour les deux create-cluster et update-cluster commandes. L'image du conteneur nécessite script et cat à installer afin que les journaux de commandes soient chargés correctement sur Amazon S3 ou CloudWatch Journaux. Pour de plus amples informations sur la création de clusters, consultez create-cluster.

Note

Cette configuration ne gère que la journalisation de la session execute-command. Cela n'affecte pas la journalisation de votre application.

L'exemple suivant crée un cluster, puis enregistre la sortie dans votre CloudWatch Journaux LogGroup nommé cloudwatch-log-group-name et votre compartiment Amazon S3 nommé s3-bucket-name.

Vous devez utiliser un AWS KMS clé gérée par le client pour chiffrer le groupe de journaux lorsque vous définissez CloudWatchEncryptionEnabled option pour true. Pour plus d'informations sur le chiffrement du groupe de journaux, consultez Chiffrez les données du journal dans CloudWatch Journaux utilisant AWS Key Management Service, dans le Amazon CloudWatch Logs Guide de l'utilisateur.

aws ecs create-cluster \ --cluster-name cluster-name \ --configuration executeCommandConfiguration="{ \ kmsKeyId=string, \ logging=OVERRIDE, \ logConfiguration={ \ cloudWatchLogGroupName=cloudwatch-log-group-name, \ cloudWatchEncryptionEnabled=true, \ s3BucketName=s3-bucket-name, \ s3EncryptionEnabled=true, \ s3KeyPrefix=demo \ } \ }"

La propriété logging détermine le comportement de la capacité de journalisation d'ECS Exec :

  • NONE : la journalisation est désactivée.

  • DEFAULT : les journaux sont envoyés au pilote awslogs configuré. Si le pilote n’est pas configuré, aucun journal n’est enregistré.

  • OVERRIDE: les journaux sont envoyés à l'Amazon fourni CloudWatch Journaux LogGroup, un compartiment Amazon S3, ou les deux.

Autorisations IAM requises pour Amazon CloudWatch Journaux pour Amazon S3 Logging

Pour activer la journalisation, le rôle de tâche Amazon ECS référencé dans votre définition de tâche doit disposer d'autorisations supplémentaires. Ces autorisations supplémentaires peuvent être ajoutées en tant que stratégie au rôle de tâche. Ils sont différents selon que vous dirigez ou non vos journaux vers Amazon CloudWatch Logs pour Amazon S3.

Amazon CloudWatch Logs

L'exemple de politique suivant ajoute l'Amazon requis CloudWatch Enregistre les autorisations.

{ "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "logs:DescribeLogGroups" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "logs:CreateLogStream", "logs:DescribeLogStreams", "logs:PutLogEvents" ], "Resource": "arn:aws:logs:us-east-1:111122223333:log-group:/aws/ecs/cloudwatch-log-group-name:*" } ] }
Amazon S3

L'exemple suivant de stratégie ajoute les autorisations Amazon S3 requises.

{ "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetBucketLocation" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "s3:GetEncryptionConfiguration" ], "Resource": "arn:aws:s3:::s3-bucket-name" }, { "Effect": "Allow", "Action": [ "s3:PutObject" ], "Resource": "arn:aws:s3:::s3-bucket-name/*" } ] }

Autorisations IAM requises pour le chiffrement à l'aide des vôtres AWS KMS key (clé KMS)

Par défaut, les données transférées entre votre client local et le conteneur utilisent le cryptage TLS 1.2 qui AWS fournit. Pour chiffrer davantage les données à l'aide de votre propre clé KMS, vous devez créer une clé KMS et ajouter l'autorisation kms:Decrypt à votre rôle IAM de tâche. Votre conteneur utilise cette autorisation pour déchiffrer les données. Pour plus d'informations sur la création d'une clé KMS, consultez Création de clés.

Vous ajoutez la politique en ligne suivante à votre rôle IAM de tâche qui nécessite les autorisations AWS KMS . Pour plus d’informations, consultez Autorisations ECS Exec.

JSON
{ "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "kms:Decrypt" ], "Resource": "arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab" } ] }

Pour que les données soient chiffrées à l'aide de votre propre clé KMS, l'utilisateur ou le groupe utilisant l'action execute-command doit être accordée à l'autorisation kms:GenerateDataKey.

L'exemple de stratégie suivant pour votre utilisateur ou groupe contient l'autorisation requise pour utiliser votre propre clé KMS. Vous devez spécifier l'Amazon Resource Name (ARN) de votre clé KMS.

JSON
{ "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "kms:GenerateDataKey" ], "Resource": "arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab" } ] }

Utilisation de stratégies IAM pour limiter l'accès à ECS Exec

Vous limitez l’accès utilisateur à l’action d’API execute-command en utilisant une ou plusieurs des clés de condition de politique IAM suivantes :

  • aws:ResourceTag/clusterTagKey

  • ecs:ResourceTag/clusterTagKey

  • aws:ResourceTag/taskTagKey

  • ecs:ResourceTag/taskTagKey

  • ecs:container-name

  • ecs:cluster

  • ecs:task

  • ecs:enable-execute-command

Avec l'exemple de stratégie IAM suivant, les utilisateurs peuvent exécuter des commandes dans des conteneurs qui s'exécutent dans des tâches avec une balise qui possède une clé environment et une valeur development, dans un cluster nommé cluster-name.

JSON
{ "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ecs:ExecuteCommand", "ecs:DescribeTasks" ], "Resource": [ "arn:aws:ecs:us-east-1:111122223333:task/cluster-name/*", "arn:aws:ecs:us-east-1:111122223333:cluster/cluster-name" ], "Condition": { "StringEquals": { "ecs:ResourceTag/environment": "development" } } } ] }

Avec l'exemple de politique IAM suivant, les utilisateurs ne peuvent pas utiliser l'API execute-command lorsque le nom du conteneur est production-app.

JSON
{ "Version":"2012-10-17", "Statement": [ { "Effect": "Deny", "Action": [ "ecs:ExecuteCommand" ], "Resource": "*", "Condition": { "StringEquals": { "ecs:container-name": "production-app" } } } ] }

Avec la stratégie IAM suivante, les utilisateurs ne peuvent lancer des tâches que lorsque ECS Exec est désactivé.

JSON
{ "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ecs:RunTask", "ecs:StartTask", "ecs:CreateService", "ecs:UpdateService" ], "Resource": "*", "Condition": { "StringEquals": { "ecs:enable-execute-command": "false" } } } ] }
Note

Étant donné que l'action d'API execute-command contient uniquement des ressources de tâche et de cluster dans une reqûete, seules les balises de cluster et de tâche sont évaluées.

Pour plus d'informations sur les clés de condition de stratégie IAM, consultez Actions, ressources et clés de condition pour Amazon Elastic Container Service dans la Référence de l'autorisation de service.

Limitation de l'accès à l'action StartSession

Bien qu'il soit possible de démarrer des sessions SSM sur votre conteneur en dehors d'ECS Exec, cela pourrait entraîner la non-journalisation des sessions. Les sessions démarrées en dehors d'ECS Exec sont également comptabilisées dans le quota de session. Nous vous recommandons de limiter cet accès en refusant l'action ssm:start-session directement pour vos tâches Amazon ECS à l'aide d'une stratégie IAM. Vous pouvez refuser l'accès à toutes les tâches Amazon ECS ou à des tâches spécifiques en fonction des balises utilisées.

Voici un exemple de stratégie IAM qui refuse l'accès à l'action ssm:start-session pour les tâches dans toutes les régions avec un nom de cluster spécifié. Si vous le souhaitez, vous pouvez inclure un caractère générique avec l'option cluster-name.

JSON
{ "Version":"2012-10-17", "Statement": [ { "Effect": "Deny", "Action": "ssm:StartSession", "Resource": [ "arn:aws:ecs:us-east-1:111122223333:task/cluster-name/*" ] } ] }

Voici un exemple de stratégie IAM qui refuse l'accès à l'action ssm:start-session sur les ressources dans toutes les régions étiquetées avec la clé de balise Task-Tag-Key et la valeur de baliseExec-Task.

JSON
{ "Version":"2012-10-17", "Statement": [ { "Effect": "Deny", "Action": "ssm:StartSession", "Resource": "arn:aws:ecs:*:*:task/*", "Condition": { "StringEquals": { "aws:ResourceTag/Task-Tag-Key": "Exec-Task" } } } ] }

Résolution des problèmes ECS Exec

Pour aller plus loin dans la résolution, consultez la section Résolution des problèmes avec Exec.