Comment résoudre des problèmes liés à l’ajout de variables d’environnement à ma tâche Amazon ECS ?

Lecture de 9 minute(s)
0

Je souhaite résoudre des problèmes liés à l’ajout de variables d’environnement à ma tâche Amazon Elastic Container Service (Amazon ECS).

Brève description

Vous pouvez ajouter une variable d’environnement à votre tâche Amazon ECS de l’une des manières suivantes :

  • Ajoutez la variable en tant qu’objet environmentFiles dans un compartiment Amazon Simple Storage Service (Amazon S3).
  • Stockez la variable dans un AWS Systems Manager Parameter Store.
  • Stockez la variable dans votre définition de tâche ECS.
  • Stockez la variable dans AWS Secrets Manager.

Remarque : l’utilisation de Parameter Store ou de Secrets Manager pour stocker vos données sensibles en tant que variable d’environnement constitue une bonne pratique en matière de sécurité. Lorsque vous ajoutez les variables d’environnement par le biais de l’une des méthodes précédentes, les erreurs suivantes peuvent s’afficher :

Parameter Store

« Extraction de données secrètes depuis SSM Parameter Store dans la région : AccessDeniedException : L’utilisateur : arn:aws:sts::123456789:assumed-role/ecsExecutionRole/f512996041234a63ac354214 n’est pas autorisé à exécuter : ssm:GetParameters sur la ressource : arn:aws:ssm:ap-south-1:12345678:parameter/status code : 400, ID de demande : e46b40ee-0a38-46da-aedd-05f23a41e861 »

-ou-

« ResourceInitializationError : impossible d’extraire les secrets ou l’authentification de registre : échec de l’extraction des ressources d’exécution : impossible d’extraire les secrets de ssm : 5 nouvelles tentatives d’appel de service : RequestCanceled »

Secrets Manager

« Erreur ResourceInitializationError »

-ou-

« Erreur AccessDenied sur Amazon Elastic Compute Cloud (Amazon EC2) »

Pour résoudre ces erreurs, consultez la page Comment résoudre les problèmes liés aux secrets AWS Secrets Manager dans Amazon ECS ?

Amazon S3

« ResourceInitializationError : échec du téléchargement des fichiers env : commande de téléchargement de fichier : flux d’erreur non vide »

Il se peut que vous rencontriez des problèmes lorsque vous ajoutez des variables d’environnement à vos tâches Amazon ECS pour les raisons suivantes :

  • Votre rôle d’exécution de tâches Amazon ECS ne dispose pas des autorisations AWS Identity and Management (IAM) requises.
  • Il existe des problèmes en lien avec votre configuration réseau.
  • Votre application n’est pas en mesure de lire la variable d’environnement.
  • Le format de la variable est incorrect dans la définition du conteneur.
  • La variable d’environnement n’est pas actualisée automatiquement.

Pour résoudre les erreurs liées aux tâches Amazon ECS qui ne démarrent pas, utilisez le runbook AWSSupport-TroubleshootECSTaskFailedToStart. Ensuite, suivez les étapes de dépannage correspondant à votre problème.

Résolution

Important :

  • Utilisez le runbook AWSSupport-TroubleshootECSTaskFailedToStart dans la même région AWS que celle où se trouvent les ressources de votre cluster ECS.
  • Lorsque vous appliquez le runbook, vous devez utiliser le dernier ID de tâche ayant échoué. Si la tâche ayant échoué fait partie d’un service Amazon ECS, utilisez la dernière tâche ayant échoué dans le service. La tâche ayant échoué doit être visible dans ECS:DescribeTasks pendant l’automatisation. Par défaut, les tâches ECS arrêtées sont visibles pendant 1 heure après le passage à l’état Arrêté. L’utilisation du dernier identifiant de tâche ayant échoué permet d’éviter que le nettoyage de l’état de la tâche n’interrompe l’analyse pendant l’automatisation.

Pour savoir comment lancer le runbook, consultez la page AWSSupport-TroubleshootECSTaskFailedToStart. En fonction des résultats de l’automatisation, utilisez l’une des étapes de dépannage manuelles suivantes.

Votre rôle d’exécution de tâches Amazon ECS ne dispose pas des autorisations IAM requises

Si vous utilisez des variables d’environnement dans Parameter Store ou Secrets Manage, passez en revue les événements AWS CloudTrail pour l’un des appels d’API suivants :

GetParameters pour Parameter Store

-ou-

GetSecretValue pour Secrets Manager

Si vous remarquez l’erreur AccessDenied pour le rôle d’exécution de tâches dans les événements CloudTrail, ajoutez les autorisations requises manuellement sous forme de politique intégrée à votre rôle IAM d’exécution de tâches ECS. Vous pouvez également créer une politique gérée par le client et l’ajouter à votre rôle d’exécution de tâches ECS.

Si vous utilisez Secrets Manager, accordez les autorisations suivantes à votre rôle d’exécution de tâches :

{  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "secretsmanager:GetSecretValue",
        "kms:Decrypt"
      ],
      "Resource": [
        "arn:aws:secretsmanager:example-region:11112222333344445555:secret:example-secret",
        "arn:aws:kms:example-region:1111222233334444:key/example-key-id"
      ]
    }
  ]
}

Si vous utilisez Parameter Store, accordez les autorisations suivantes à votre rôle d’exécution de tâches :

{  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "ssm:GetParameters",
        "secretsmanager:GetSecretValue",
        "kms:Decrypt"
      ],
      "Resource": [
        "arn:aws:ssm:example-region:1111222233334444:parameter/example-parameter",
        "arn:aws:secretsmanager:example-region:1111222233334444:secret:example-secret",
        "arn:aws:kms:example-region:1111222233334444:key/example-key-id"
      ]
    }
  ]
}

Vous pouvez utiliser un compartiment S3 pour stocker la variable d’environnement en tant que fichier .env. Toutefois, vous devez ajouter les autorisations suivantes manuellement en tant que politique intégrée au rôle d’exécution de tâches :

{  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetObject"
      ],
      "Resource": [
        "arn:aws:s3:::example-bucket/example-folder/example-env-file"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetBucketLocation"
      ],
      "Resource": [
        "arn:aws:s3:::example-bucket"
      ]
    }
  ]
}

Il existe des problèmes en lien avec votre configuration réseau

Si votre tâche ECS se trouve dans un sous-réseau privé, vérifiez les points suivants :

  • Assurez-vous que le groupe de sécurité de la tâche ou du service autorise le trafic sortant sur le port 443.
  • Si vous utilisez un point de terminaison de VPC, assurez-vous que la liste de contrôle d’accès réseau (ACL) autorise le trafic sortant sur le port 443.
  • Vérifiez la connectivité à Systems Manager/Secrets Manager et au point de terminaison Amazon S3. Pour ce faire, utilisez la commande telnet.
  • Si vous utilisez une passerelle NAT, assurez-vous que votre tâche possède une route par défaut vers la passerelle NAT.
  • Définissez les points de terminaison de VPC pour vos tâches. Vérifiez que vous disposez des points de terminaison de VPC requis pour Secrets Manager/Systems Manager Parameter Store et Amazon S3.

Si vous utilisez un point de terminaison de VPC, vérifiez ce qui suit :

  • Le groupe de sécurité de votre point de terminaison de VPC autorise le trafic sortant issu de la tâche ou du service sur le port 443.
  • Associez le point de terminaison de VPC au VPC approprié.
  • Activez les attributs VPC enableDnsHostnames etEnableDNSSupport.

Si votre tâche ECS se trouve dans un sous-réseau public, vérifiez les points suivants :

  • Vous devez activer une adresse IP publique pour la tâche.
  • Assurez-vous que le groupe de sécurité de votre VPC dispose d’un accès sortant vers Internet via le port 443.
  • La configuration de l’ACL réseau permet à tout le trafic d’aller et venir entre les sous-réseaux et Internet.

Votre application ne parvient pas à lire la variable d’environnement

Pour vous assurer que les variables d’environnement correctes sont renseignées dans votre conteneur de tâches, procédez comme suit :

  1. Répertoriez toutes les variables d’environnement qui sont exposées à l’intérieur du conteneur.
  2. Vérifiez que cette liste inclut les variables d’environnement que vous avez définies dans la définition de tâche ou dans le fichier .env dans S3.

Si vous utilisez les types de lancement Amazon EC2 ou AWS Fargate, il est recommandé d’utiliser la fonction ECS Exec. Vous pouvez utiliser cette fonction pour exécuter des commandes ou ajouter un shell dans un conteneur s’exécutant sur une instance Amazon EC2 ou Fargate. Après avoir activé cette fonction, exécutez la commande suivante pour interagir avec votre conteneur :

aws ecs execute-command --cluster example-cluster \--task example-task-id \
--container example-container \
--interactive \
--command "/bin/sh"

Si vous utilisez le type de lancement Amazon EC2, vous pouvez également utiliser la commande d’exécution Docker pour interagir avec votre conteneur. Dans ce cas, procédez comme suit : Connectez-vous à l’instance de conteneur sur laquelle votre tâche est en cours d’exécution. Exécutez ensuite la commande Docker suivante pour trouver l’ID de conteneur de votre conteneur de tâches :

docker container ps

Pour interagir avec le conteneur, exécutez la commande suivante 

docker exec -it example-container-id bash

Remarque : sélectionnez le shell en fonction du shell par défaut de votre conteneur.

Après avoir établi la connexion avec le conteneur, exécutez la commande env sur votre conteneur pour obtenir la liste complète de vos variables d’environnement. Consultez cette liste pour vous assurer que les variables d’environnement que vous avez définies dans la définition de tâche ou dans le fichier .env sont bien présentes.

Le format de la variable est incorrect dans la définition du conteneur

Lorsque vous définissez des variables d’environnement dans la définition du conteneur, configurez-les en tant qu’objets KeyValuePair :

"environment": [{    "name": "foo",
    "value": "bar"
}]

Veillez également à utiliser ce format lorsque vous définissez les variables d’environnement dans vos fichiers .env.

La variable d’environnement n’est pas actualisée automatiquement

Lorsque vous mettez à jour la variable d’environnement dans votre fichier .env, la variable n’est pas actualisée automatiquement dans votre conteneur en cours d’exécution.
Pour injecter les valeurs mises à jour des variables d’environnement dans votre tâche, mettez à jour le service en exécutant la commande suivante :

aws ecs update-service --cluster example-cluster --service example-service --force-new-deployment

Si vous utilisez des variables d’environnement dans votre définition de conteneur, vous devez créer une nouvelle définition de tâche pour actualiser les variables d’environnement mises à jour. Cette nouvelle définition de tâche vous permet de créer une nouvelle tâche ou de mettre à jour votre service ECS :

`aws ecs update-service --cluster example-cluster --service example-service --task-definition <family:revision>`;

Remarque : tenez compte des points suivants lorsque vous ajoutez des variables d’environnement à votre tâche :

  • Si vous spécifiez des variables d’environnement à l’aide du paramètre d’environnement dans une définition de conteneur, celles-ci sont prioritaires sur les variables contenues dans un fichier d’environnement.
  • Si vous spécifiez plusieurs fichiers d’environnement et qu’ils contiennent la même variable, ils sont traités dans l’ordre d’entrée. La première valeur de la variable est utilisée et les valeurs suivantes dupliquées sont ignorées. Il est recommandé d’utiliser des noms de variables uniques.
  • Si vous spécifiez un fichier d’environnement pour un remplacement de conteneur, le fichier est utilisé. Tous les autres fichiers d’environnement spécifiés dans une définition de conteneur sont ignorés.
  • Les variables d’environnement sont disponibles pour les processus PID 1 dans un conteneur issu du fichier /proc/1/environ. Si le conteneur exécute plusieurs processus ou des processus d’initialisation (tels qu’un script encapsuleur ou un superviseur), la variable d’environnement n’est pas disponible pour les processus non PID 1.

Informations connexes

Ajout de variables d’environnement à un conteneur