Comment puis-je accéder à d’autres services AWS à partir de mes tâches Amazon ECS sur Fargate ?

Lecture de 6 minute(s)
0

Je souhaiterais accéder à d’autres services AWS à partir de mes tâches Amazon Elastic Container Service (Amazon ECS) sur AWS Fargate.

Brève description

Les applications conteneurisées doivent signer les demandes d’API AWS avec des informations d’identification AWS lorsque vous appelez des API AWS. Pour une tâche Amazon ECS, utilisez le rôle de tâche AWS Identity and Access Management (IAM) pour signer les demandes d’API avec les informations d’identification AWS. Ensuite, associez un rôle IAM à une définition de tâche Amazon ECS ou à une opération d’API RunTask. Après cela, vos conteneurs peuvent utiliser le kit SDK AWS ou l’interface de la ligne de commande AWS (AWS CLI) pour effectuer des demandes d’API auprès des services AWS autorisés.

Remarque : si des erreurs surviennent lors de l’exécution de commandes AWS CLI, assurez-vous que la version de l’AWS CLI utilisée est bien la plus récente.
Dans cet article, le cas de résolution est celui d’une application qui fonctionne sur Fargate et qui doit accéder à Amazon Simple Storage Service (Amazon S3).

Résolution

Prérequis

  • Identifiez le service AWS auquel vos tâches Fargate doivent accéder. Créez ensuite un rôle IAM et spécifiez la politique avec les actions requises pour effectuer les appels d’API à l’intérieur des conteneurs.
  • Créez une définition de tâche pour vos conteneurs d’applications, puis utilisez le paramètre taskRoleArn IAM pour spécifier le rôle IAM de vos tâches.

Créer une politique et un rôle IAM pour vos tâches

1.    Créez un compartiment Amazon S3 pour stocker vos données. Le nom du compartiment doit être unique et respecter les exigences relatives aux compartiments Amazon S3 en matière de noms de compartiment. Pour plus d’informations, consultez la section Règles de dénomination de compartiment.

2.    Créez une politique et un rôle IAM pour vos tâches. Dans l’exemple qui suit, l’application doit placer des objets dans un compartiment S3, et les répertorier par la suite :

{
  "Version": "2012-10-17",
  "Statement": [{
    "Sid": "S3PutGEList",
    "Effect": "Allow",
    "Action": ["s3:PutObject", "s3:GetObject", "s3:ListBucketMultipartUploads", "s3:ListBucketVersions", "s3:ListBucket", "s3:ListMultipartUploadParts"],
    "Resource": ["arn:aws:s3:::*/*", "arn:aws:s3:::kc-test-fargate-app-bucket"]
  }]
}

Remarque : remplacez fargate-app-bucket par le nom de votre compartiment S3.

Créer une définition de tâche pour votre application et préciser le rôle IAM pour vos tâches

Pour attribuer le rôle lorsque vous créez une définition de tâche, utilisez la section taskRoleArn :

{
  "containerDefinitions": [{
    "name": "sample-s3-access",
    "image": "public.ecr.aws/aws-cli/aws-cli:latest",
    "memory": 1024,
    "cpu": 512,
    "command": ["s3api", "put-object", "--bucket", "fargate-app-bucket", "--key", "/usr/local/bin/aws"],
    "essential": true
  }],
  "memory": "1024",
  "cpu": "512",
  "requiresCompatibilities": ["FARGATE"],
  "networkMode": "awsvpc",
  "runtimePlatform": {
    "operatingSystemFamily": "LINUX"
  },
  "family": "s3_access-WITH-ROLE",
  "taskRoleArn": "arn:aws:iam::aws_account_id:role/s3-access-role"
}

Remarque : comme l’image de base inclut l’installation d’aws-cli (public.ecr.aws/aws-cli/aws-cli:latest), cette application peut effectuer l’appel d’API.

Enregistrez les informations de configuration dans un fichier, puis utilisez la commande register-task-definition pour enregistrer la définition de tâche :

aws ecs register-task-definition --cli-input-json file://task-def1.json --region eu-west-1

Créer et exécuter une tâche autonome

Pour exécuter une tâche autonome, utilisez un type de lancement Fargate. Dans cet exemple, le conteneur s’exécute sur des commandes et quitte.

Une fois que le conteneur a exécuté la commande, la tâche renvoie un ExitCode=0 si le taskRoleArn dispose des autorisations requises pour exécuter les appels d’API. Si taskRoleArn est absent ou ne dispose pas d’autorisations suffisantes, la tâche renvoie un code de sortie nul 0.

Créer un service

Remarque : le processus de votre tâche ne peut pas se terminer à l’entrée pour que le service atteigne un état stable. Dans l’exemple précédent, le conteneur sort une fois la commande terminée. Cela rend l’exemple impropre à l’exécution dans le cadre du service.

1.    Créez un script bash qui exécute une boucle et imprime la date de création et le nom d’hôte du fichier dans un fichier. Transférez ensuite le fichier dans le compartiment Amazon S3.

Le script bash s’appelle « run-s3-script.sh» dans l’exemple ci-dessous.

#!/bin/bash

while true; do
TODAY=$(date)
echo "-----------------------------------------------------"
echo "Date: $TODAY Host:$HOST"
echo "File was added and active on these Dates: $TODAY" from Host:$HOSTNAME>> checkfile.txt
echo "--------------------Add to S3------------------------"
aws s3 cp checkfile.txt s3://kc-test-fargate-app-bucket
status_code=$?
echo "------------Get upload StatusCode=$status_code ([ $status_code -eq 0 ] means failed)---------------"
#echo "------------Get upload StatusCode=$status_code and exit if upload failed.---------------"
#[ $status_code -eq 0 ] || exit 1
echo "------------Also list the files in the S3 bucket---------------"
aws s3 ls s3://kc-test-fargate-app-bucket
status_code=$?
echo "------------Get the status_code=$status_code after listing objects in bucket---------------"
#[ $status_code -eq 0 ] || exit 1 #uncomment this is you want the task to stop upon failed attempt
echo "============================================================================="
sleep 5

#check the user or role that made the call
aws sts get-caller-identity
echo "*****End of loop, restarting"
sleep 10

done

2.    Pour créer une nouvelle image qui ajoute le script et l’exécute, créez un Dockerfile :

FROM public.ecr.aws/amazonlinux/amazonlinux:latest
Run yum -y install unzip
RUN curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
RUN unzip awscliv2.zip
RUN /aws/install
RUN rm -rf aws*
COPY run-s3-test.sh /
CMD ./run-s3-test.sh

3.    Pour créer l’image localement, exécutez la commande suivante :

$ docker build -t test-awscli:amz-build-scripts

4.    Transférez l’image vers Amazon Elastic Container Registry (Amazon ECR). Ajoutez l’image à la définition de tâche que vous utilisez pour créer le service. Pour plus d’informations, consultez la section Transmission d’une image.

{
  "containerDefinitions": [{
    "name": "add-files-to-s3",
    "image": "aws_account_id.dkr.ecr.eu-central-1.amazonaws.com/test-s3-ecs:amzlin-build-scripts",
    "memory": 1024,
    "cpu": 512,
    "healthCheck": {
      "retries": 3,
      "command": ["CMD-SHELL", "aws s3 ls s3://kc-test-fargate-app-bucket || exit 1"],
      "timeout": 5,
      "interval": 10,
      "startPeriod": 5
    },
    "logConfiguration": {
      "logDriver": "awslogs",
      "options": {
        "awslogs-group": "/ecs/test-s3-script",
        "awslogs-region": "eu-central-1",
        "awslogs-create-group": "true",
        "awslogs-stream-prefix": "ecs"
      }
    },
    "essential": true
  }],
  "memory": "1024",
  "cpu": "512",
  "requiresCompatibilities": ["FARGATE"],
  "networkMode": "awsvpc",
  "runtimePlatform": {
    "operatingSystemFamily": "LINUX"
  },
  "family": "test-s3-script",
  "taskRoleArn": "arn:aws:iam::aws_account_id:role/s3-access-role",
  "executionRoleArn": "arn:aws:iam::aws_account_id:role/ecsTaskExecutionRole"
}

Remarque : lorsque vous utilisez les rôles de tâches IAM pour vos conteneurs, vous risquez de recevoir des messages d’erreurs de type « Accès refusé ». Pour plus d’informations, consultez Comment puis-je configurer des rôles de tâche IAM dans Amazon ECS afin d’éviter les messages d’erreurs « Access Denied » ?

Informations connexes

Création d’un service à l’aide de la console

AWS OFFICIEL
AWS OFFICIELA mis à jour il y a 9 mois