Comment résoudre les problèmes lors de la transmission de variables d'environnement à ma tâche Amazon ECS ?

Date de la dernière mise à jour : 14/04/2022

Je veux résoudre les problèmes liés à la transmission de variables d'environnement à ma tâche Amazon Elastic Container Service (Amazon ECS).

Brève description

Vous pouvez transmettre une variable d'environnement dans votre tâche Amazon ECS de l'une des manières suivantes :

  • Transmettez 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 la tâche ECS.
  • Stockez la variable dans AWS Secrets Manager.

Remarque : une bonne pratique de sécurité consiste à utiliser Parameter Store ou Secrets Manager pour stocker vos données sensibles comme variable d'environnement.

Lorsque vous transmettez les variables d'environnement par l'une des méthodes précédentes, vous risquez d'obtenir les erreurs suivantes :

Parameter Store :

Fetching secret data from SSM Parameter Store in region: AccessDeniedException: User: arn:aws:sts::123456789:assumed-role/ecsExecutionRole/f512996041234a63ac354214 is not authorized to perform: ssm:GetParameters on resource: arn:aws:ssm:ap-south-1:12345678:parameter/status code: 400, request id: e46b40ee-0a38-46da-aedd-05f23a41e861 (Récupération de données secrètes à partir du SSM Parameter Store dans la région : AccessDeniedException : 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/code du statut : 400, id de requête : e46b40ee-0a38-46da-aedd-05f23a41e861)

-ou-

ResourceInitializationError: unable to pull secrets or registry auth: execution resource retrieval failed: unable to retrieve secrets from ssm: service call has been retried 5 time(s): RequestCanceled (ResourceInitializationError : impossible d'extraire les secrets ou l'authentification du registre : échec de l'extraction des ressources d'exécution : impossible d'extraire les secrets du ssm : l'appel de service a été réessayé cinq fois : RequestCanceled)

Secrets Manager :

Erreur ResourceInitializationError

-ou-

AccessDenied error on Amazon Elastic Compute Cloud (Amazon EC2) (Erreur AccessDenied sur Amazon Elastic Compute Cloud (Amazon EC2))

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

Amazon S3 :

ResourceInitializationError: failed to download env files: file download command: non empty error stream (ResourceInitializationError : échec du téléchargement des fichiers env : commande de téléchargement de fichiers : flux d'erreurs non vide)

Vous pouvez rencontrer des problèmes lorsque vous transmettez des variables d'environnement à vos tâches Amazon ECS pour les raisons suivantes :

  • Le rôle d'exécution de votre tâche Amazon ECS ne dispose pas des autorisations AWS Identity and Management (IAM) requises.
  • La configuration de votre réseau présente des problèmes.
  • Votre application ne parvient pas à lire la variable d'environnement.
  • Le format de la variable dans la définition du conteneur est incorrect.
  • La variable d'environnement n'est pas automatiquement actualisée.

Solution

Le rôle d'exécution de votre tâche Amazon ECS ne dispose pas des autorisations IAM requises

Si vous utilisez des variables d'environnement dans Parameter Store ou Secrets Manager, examinez 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âche dans les événements CloudTrail, ajoutez alors manuellement les autorisations requises en tant que politique en ligne à votre rôle IAM d'exécution de tâche ECS. Vous pouvez également créer une politique gérée par le client et l'ajouter à votre rôle d'exécution de tache ECS.

Si vous utilisez Secrets Manager, ajoutez les autorisations suivantes à votre rôle d'exécution de tache :

{
  "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, ajoutez les autorisations suivantes à votre rôle d'exécution de tache :

{
  "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"
      ]
    }
  ]
}

Pour utiliser un compartiment S3 pour stocker la variable d'environnement sous forme de fichier .env, ajoutez manuellement les autorisations suivantes en tant que politique en ligne au rôle d'exécution de tâche :

{
  "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"
      ]
    }
  ]
}

La configuration de votre réseau présente des problèmes

Si votre tâche ECS se trouve dans un sous-réseau privé, vérifiez ce qui suit :

  • 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 d'un VPC, assurez-vous que l'ACL réseau autorise le trafic sortant sur le port 443.
  • Vérifiez la connectivité à Systems Manager/Secrets Manager et au point de terminaison Amazon S3 à l'aide de la commande telnet.
  • Si vous utilisez une passerelle NAT, assurez-vous que votre tâche possède un acheminement par défaut vers la passerelle NAT.
  • Assurez-vous que vous avez défini les points de terminaison d'un VPC pour vos tâches. Si vous avez défini les points de terminaison d'un VPC, assurez-vous que vous disposez des points de terminaison d'un VPC requis pour Secrets Manager/Systems Manager Parameter Store et S3.
  • Si vous utilisez un point de terminaison d'un VPC, assurez-vous des points suivants :
    • Le groupe de sécurité de votre point de terminaison d'un VPC autorise le trafic sortant de la tâche ou du service sur le port 443.
    • Le point de terminaison d'un VPC est associé au bon VPC.
    • Les attributs du VPC enableDnsHostnames et enableDnsSupport sont activés.

Si votre tâche ECS se trouve dans un sous-réseau public, vérifiez ce qui suit :

  • Assurez-vous que la tâche dispose d'une adresse IP publique activée.
  • Assurez-vous que le groupe de sécurité de votre VPC dispose d'un accès sortant sur le port 443 vers l'Internet.
  • Assurez-vous que la configuration de l'ACL réseau autorise tout le trafic entrant et sortant des sous-réseaux vers l'Internet.

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

Pour vérifier si les variables d'environnement correctes sont renseignées à l'intérieur du conteneur de votre tâche, 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 la tâche ou le fichier .env dans S3.

Si vous utilisez les types de lancement Amazon EC2 ou AWS Fargate, la bonne pratique consiste à utiliser la fonction Exec d'ECS. Vous pouvez utiliser cette fonction pour exécuter des commandes à l'intérieur, ou par un shell, d'un conteneur qui s'exécute 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 exec de Docker pour interagir avec votre conteneur. Dans ce cas, procédez comme suit :

Connectez-vous à l'instance de conteneur dans laquelle votre tâche est en cours d'exécution. Ensuite, exécutez la commande Docker suivante pour trouver l'ID de conteneur du conteneur de votre tâche.

docker container ps

Exécutez la commande suivante pour interagir avec le conteneur :

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. Examinez cette liste pour vous assurer que les variables d'environnement que vous avez définies dans la définition de la tâche ou dans le fichier .env sont présentes.

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

Lorsque vous définissez des variables d'environnement dans la définition du conteneur, assurez-vous de les définir en tant qu'objets KeyValuePair similaires à ce qui suit :

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

Assurez-vous également de utiliser ce format lorsque vous définissez les variables d'environnement dans vos fichiers .env.

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

Lorsque vous mettez à jour la variable d'environnement dans votre fichier .env, elle n'est pas automatiquement actualisée dans votre conteneur en cours d'exécution.

Pour injecter les valeurs actualisées 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 du conteneur, vous devez alors créer une nouvelle définition de la tâche pour actualiser les variables d'environnement mises à jour. Avec cette nouvelle définition de la tâche, vous pouvez créer une nouvelle tâche ou 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 transmettez des variables d'environnement à votre tâche :

  • Si des variables d'environnement sont spécifiées à l'aide du paramètre d'environnement dans une définition du conteneur, elles ont la priorité sur les variables contenues dans un fichier d'environnement.
  • Si plusieurs fichiers d'environnement sont spécifiés 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 des variables dupliquées sont ignorées. C'est une bonne pratique d'utiliser des noms de variables uniques.
  • Si un fichier d'environnement est spécifié en tant que remplacement du conteneur, ce fichier est utilisé. Tout autre fichier d'environnement spécifié dans une définition du conteneur est ignoré.
  • Les variables d'environnement sont disponibles pour les processus PID 1 dans un conteneur à partir du fichier /proc/1/environ. Si le conteneur exécute plusieurs processus ou des processus init, tels que wrapper script, start script ou supervisord, la variable d'environnement n'est pas disponible pour les processus non PID 1.

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


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