Come faccio a configurare la mia attività Amazon ECS in modo che assuma un ruolo IAM in un altro account AWS?

Ultimo aggiornamento: 21-03-2022

Voglio configurare la mia attività Amazon Elastic Container Service (Amazon ECS) per assumere un ruolo AWS Identity and Access Management (IAM) in un altro account.

Breve descrizione

Puoi impostare la tua attività Amazon ECS in modo che assuma un ruolo IAM in un altro account per eseguire una delle seguenti operazioni:

  • Accedere alle risorse, ad esempio un bucket Amazon Simple Storage Service (Amazon S3).
  • Eseguire attività, come la descrizione di una risorsa e l'avvio o l'arresto di istanze, tramite chiamate API.

Per consentire alla tua attività Amazon ECS di assumere un ruolo IAM in un altro account AWS, procedi come segue:

  1. Configura un ruolo IAM nell'account di origine.
  2. Modifica la policy di attendibilità del ruolo IAM dell'account di destinazione per consentire al ruolo IAM dell'account di origine di assumere il ruolo IAM nell'account di destinazione.
  3. Crea una definizione di attività nell'account di origine e definisci il ruolo IAM creato nella fase 1 come ruolo di attività di Amazon ECS.

Risoluzione

Gli esempi utilizzati in questo articolo fanno riferimento a due diversi account AWS:

  • Un account di origine che ospita l'attività Amazon ECS (ad esempio 1111222233334444)
  • Un account di destinazione che include il ruolo IAM (ad esempio destination-account-role) assunto dall'attività Amazon ECS (ad esempio 5555666677778888)

Configurazione del ruolo IAM nell'account di origine

Segui le istruzioni riportate in Aggiunta e rimozione delle autorizzazioni di identità IAM per aggiungere la seguente dichiarazione di policy al tuo ruolo di attività Amazon ECS (ad esempio my-ECS-task-role). In questo modo, il ruolo dell'attività ECS può assumere il ruolo IAM nell'account di destinazione.

Nota:

  • sostituisci 5555666677778888 con l'ID account del ruolo tra account che l'attività deve assumere.
  • Sostituisci destination-account-role con il nome del ruolo assunto.
{
  "Version": "2012-10-17",
  "Statement": {
    "Effect": "Allow",
    "Action": "sts:AssumeRole",
    "Resource": "arn:aws:iam::5555666677778888:role/destination-account-role"
  }
}

Modifica la policy di attendibilità del ruolo IAM nell'account di destinazione

Segui le istruzioni riportate in Modifica di una policy di attendibilità dei ruoli (console) per aggiungere la seguente dichiarazione di policy alla policy di attendibilità (destination-account-role) del ruolo IAM tra account.

Nota:

  • sostituisci 1111222233334444 con l'ID account dell'account di origine in cui esiste il ruolo IAM dell'attività ECS.
  • Sostituisci il ruolo my-ECS-task con il nome del tuo ruolo di attività IAM ECS.
{
  "Version": "2012-10-17",
  "Statement": [{
    "Effect": "Allow",
    "Principal": {
      "AWS": "arn:aws:iam::1111222233334444:role/my-ECS-task-role"
    },
    "Action": "sts:AssumeRole"
  }]
}

Creazione della definizione di attività

Crea un file di definizione di attività simile al seguente (example-task-def.json) e utilizza l'ARN del ruolo IAM dell'account di origine (my-ECS-task-role) per 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"
}

Esegui il comando riportato per registrare la definizione di attività utilizzando il file example-task-def.json:

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

Nota: se ricevi un messaggio di errore durante l'esecuzione dei comandi di AWS CLI, assicurati di utilizzare la versione più recente di AWS CLI.

Dopo aver completato i passaggi precedenti, puoi eseguire un'attività autonoma per assumere un ruolo IAM sull'account di destinazione utilizzando AWS Command Line Interface (AWS CLI). In alternativa, puoi utilizzare le impostazioni credential_source nel file di configurazione di AWS CLI per specificare dove AWS CLI può trovare le credenziali per assumere il ruolo IAM associato al container ECS. Con questa impostazione, l'attività può assumere il ruolo senza dover esportare nuove credenziali. Per ulteriori informazioni, consulta Assunzione di credenziali di ruolo.

Verifica che il container all'interno dell'attività possa assumere il ruolo IAM nell'account di destinazione e accedere alla risorsa

1.    Esegui l'attività utilizzando la definizione di attività creata.

  • Se stai eseguendo l'attività su Amazon Elastic Compute Cloud (Amazon EC2), utilizza il comando docker exec per accedere al container per eseguire il test.
  • Se stai eseguendo un'attività su AWS Fargate, utilizza la funzione ECS Exec per entrare nel container ed eseguire il test.

2.    Configura il file di configurazione di AWS CLI, quindi verifica che l'attività assuma il ruolo IAM nell'account di destinazione:

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

Se gli output sono simili a quelli elencati, allora l'attività ECS nell'account 1111222233334444 può assumere il ruolo IAM nell'account 5555666677778888 per elencare le risorse del cluster ECS.