Comment configurer ma tâche Amazon ECS pour qu'elle assume un rôle IAM dans un autre compte AWS ?

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

Je souhaite configurer ma tâche Amazon Elastic Container Service (Amazon ECS) pour qu'elle assume un rôle AWS Identity and Access Management (IAM) dans un autre compte.

Brève description

Vous pouvez configurer votre tâche Amazon ECS pour qu'elle assume un rôle IAM dans un autre compte pour effectuer l'une des opérations suivantes :

  • Accéder à des ressources, telles qu'un compartiment Amazon Simple Storage Service (Amazon S3).
  • Effectuer des tâches, telles que la description d'une ressource et le démarrage ou l'arrêt d'instances, par le biais d'appels d'API.

Pour permettre à votre tâche Amazon ECS d'assumer un rôle IAM dans un autre compte AWS, procédez comme suit :

  1. Configurer un rôle IAM dans le compte source.
  2. Modifiez la politique d'approbation du rôle IAM du compte de destination pour permettre au rôle IAM du compte source d'assumer le rôle IAM dans le compte de destination.
  3. Créez une définition de tâche dans le compte source et définissez le rôle IAM créé à l'étape 1 en tant que rôle de tâche Amazon ECS.

Résolution

Les exemples utilisés dans cet article font référence à deux comptes AWS différents :

  • Un compte source qui héberge la tâche Amazon ECS (exemple : 1111222233334444)
  • Un compte de destination qui inclut le rôle IAM (exemple : destination-account-role) que la tâche Amazon ECS assume (exemple : 5555666677778888)

Configurer le rôle IAM dans le compte source

Suivez les instructions de la section Ajout et suppression d'autorisations d'identité IAM pour ajouter la déclaration de politique suivante à votre rôle de tâche Amazon ECS (exemple : my-ECS-task-role). Cela permet au rôle de tâche ECS d'assumer le rôle IAM dans le compte de destination.

Remarque :

  • Remplacez 5555666677778888 par l'ID de compte du rôle inter-comptes que votre tâche doit assumer.
  • Remplacez destination-account-role par le nom du rôle assumé.
{
  "Version": "2012-10-17",
  "Statement": {
    "Effect": "Allow",
    "Action": "sts:AssumeRole",
    "Resource": "arn:aws:iam::5555666677778888:role/destination-account-role"
  }
}

Modifier la politique d'approbation du rôle IAM dans le compte de destination

Suivez les instructions de la section Modification d'une politique d'approbation de rôle (console) pour ajouter la déclaration de politique suivante à la politique d'approbation de votre rôle IAM inter-comptes (destination-account-role) dans le compte de destination.

Remarque :

  • Remplacez 1111222233334444 par l'ID de compte source dans lequel le rôle IAM de la tâche ECS existe.
  • Remplacez my-ECS-task-role par le nom de votre rôle de tâche ECS IAM.
{
  "Version": "2012-10-17",
  "Statement": [{
    "Effect": "Allow",
    "Principal": {
      "AWS": "arn:aws:iam::1111222233334444:role/my-ECS-task-role"
    },
    "Action": "sts:AssumeRole"
  }]
}

Créer la définition de tâche

Créez un fichier de définition de tâche similaire au fichier suivant (example-task-def.json) et utilisez l'ARN du rôle IAM du compte source (my-ECS-task-role) pour taskRoleArn :

{
  "containerDefinitions": [
    {
      "name": "test",
      "image": "your-test-image",
      "cpu": 100,
      "memory": 200,
      "essential": true
    }
  ],
  "family": "verify-assume-cross-account-role",
  "taskRoleArn": "arn:aws:iam::1111222233334444:role/my-ECS-task-role"
}

Exécutez la commande suivante pour enregistrer la définition de tâche à l'aide du fichier example-task-def.json :

aws ecs register-task-definition —cli-input-json file://example-task-def.json

Remarque : en cas d'erreurs lors de l'exécution des commandes AWS CLI, vérifiez que vous utilisez la version la plus récente de l'AWS CLI.

Une fois les étapes précédentes terminées, vous pouvez exécuter une tâche autonome pour assumer un rôle IAM sur le compte de destination à l'aide de l'AWS Command Line Interface (AWS CLI). Vous pouvez également utiliser les paramètres credential_source dans le fichier de configuration de l'AWS CLI pour spécifier où l'AWS CLI peut trouver les informations d'identification pour assumer le rôle IAM attaché au conteneur ECS. Avec ce paramètre, la tâche peut assumer le rôle sans avoir à exporter de nouvelles informations d'identification. Pour plus d'informations, consultez Assumer les informations d'identification des rôles.

Vérifiez que le conteneur de la tâche peut assumer le rôle IAM dans le compte de destination et accéder à la ressource

1.    Exécutez la tâche à l'aide de la définition de tâche que vous avez créée.

  • Si vous exécutez la tâche sur Amazon Elastic Compute Cloud (Amazon EC2), utilisez la commande docker exec pour accéder au conteneur afin d'effectuer les tests.
  • Si vous exécutez une tâche sur AWS Fargate, utilisez la fonction ECS Exec pour accéder au conteneur afin d'effectuer les tests.

2.    Paramétrez le fichier de configuration de l'AWS CLI, puis vérifiez que la tâche assume le rôle IAM dans le compte de destination :

Using the ECS exec command to access the container
$ aws ecs execute-command --cluster example-cluster --task example-taskID --container test --interactive --command "/bin/bash"

The Session Manager plugin was installed successfully. Use the AWS CLI to start a session.
Starting session with SessionId: ecs-execute-command-064a40c5149cecc32

# Create AWS CLI config file
bash-4.2# mkdir /root/.aws
bash-4.2# cat <<EOF > /root/.aws/config
[profile cross-account]
role_arn = arn:aws:iam::5555666677778888:role/destination-account-role
credential_source = EcsContainer
EOF

# Check the current task IAM role
bash-4.2# aws sts get-caller-identity
{
  "UserId": "AROA4SHE6JAGEAYNUH6ST:8ee54a7f5c474a3f93ee28474486402f",
  "Account": "1111222233334444",
  "Arn": "arn:aws:sts::1111222233334444:assumed-role/my-ECS-task-role/8ee54a7f5c474a3f93ee28474486402f"
}

# Assume the cross-account IAM role
bash-4.2# aws sts get-caller-identity --profile cross-account
{
  "UserId": "AROA3A44JRHY6FFSMMJKN:botocore-session-1647426859",
  "Account": "5555666677778888",
  "Arn": "arn:aws:sts::5555666677778888:assumed-role/destination-account-role/botocore-session-1647426859"
}

# Verify that you can list the resources in cross-account in the task
bash-4.2# aws ecs list-clusters --profile cross-account
{
  "clusterArns": [
    "arn:aws:ecs:us-east-1:5555666677778888:cluster/default"
  ]
}

Si vos sorties ressemblent à celles répertoriées, la tâche ECS du compte 1111222233334444 peut assumer le rôle IAM dans le compte 5555666677778888 pour répertorier les ressources du cluster ECS.