¿Cómo configuro mi tarea de Amazon ECS para que asuma un rol de IAM en otra cuenta de AWS?

Última actualización: 21/03/2022

Quiero configurar mi tarea de Amazon Elastic Container Service (Amazon ECS) para que asuma un rol de AWS Identity and Access Management (IAM) en otra cuenta.

Descripción breve

Puede configurar su tarea de Amazon ECS para que asuma un rol de IAM en otra cuenta y realice alguna de las siguientes acciones:

  • Acceder a recursos, como un bucket de Amazon Simple Storage Service (Amazon S3)
  • Llevar a cabo tareas, como describir un recurso e iniciar o detener instancias, a través de llamadas a la API

Para permitir que su tarea de Amazon ECS asuma un rol de IAM en otra cuenta de AWS, haga lo siguiente:

  1. Configure un rol de IAM en la cuenta de origen.
  2. Modifique la política de confianza del rol de IAM de la cuenta de destino para permitir que el rol de IAM de la cuenta de origen asuma el rol de IAM en la cuenta de destino.
  3. Cree una definición de tarea en la cuenta de origen y defina el rol de IAM creado en el paso 1 como el rol de tarea de Amazon ECS.

Resolución

Los ejemplos utilizados en este artículo hacen referencia a dos cuentas de AWS diferentes:

  • Una cuenta de origen que aloja la tarea de Amazon ECS (por ejemplo, 1111222233334444)
  • Una cuenta de destino que incluye el rol de IAM (por ejemplo, destination-account-role) que asume la tarea de Amazon ECS (por ejemplo, 5555666677778888)

Configurar el rol de IAM en la cuenta de origen

Siga las instrucciones que aparecen en Adición y eliminación de permisos de identidad de IAM para agregar la siguiente declaración de política a su rol de tarea de Amazon ECS (por ejemplo, my-ECS-task-role). Esto permitirá que el rol de tarea de ECS asuma el rol de IAM en la cuenta de destino.

Nota:

  • Reemplace 5555666677778888 por el ID de la cuenta del rol entre cuentas que su tarea debe asumir.
  • Reemplace destination-account-role por el nombre del rol asumido.
{
  "Version": "2012-10-17",
  "Statement": {
    "Effect": "Allow",
    "Action": "sts:AssumeRole",
    "Resource": "arn:aws:iam::5555666677778888:role/destination-account-role"
  }
}

Modificar la política de confianza del rol de IAM en la cuenta de destino

Siga las instrucciones que aparecen en Modificación de una política de confianza de rol (consola) para agregar la siguiente declaración de política a la política de confianza del rol de IAM entre cuentas (destination-account-role) en la cuenta de destino.

Nota:

  • Reemplace 1111222233334444 por el ID de la cuenta de origen en la que existe el rol de IAM de la tarea de ECS.
  • Reemplace my-ECS-task-role por el nombre del rol de IAM de la tarea de ECS.
{
  "Version": "2012-10-17",
  "Statement": [{
    "Effect": "Allow",
    "Principal": {
      "AWS": "arn:aws:iam::1111222233334444:role/my-ECS-task-role"
    },
    "Action": "sts:AssumeRole"
  }]
}

Crear la definición de tarea

Cree un archivo de definición de tarea similar al siguiente (example-task-def.json) y use el ARN del rol de IAM de la cuenta de origen (my-ECS-task-role) para 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"
}

Ejecute el siguiente comando para registrar la definición de tarea con el archivo example-task-def.json:

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

Nota: Si recibe errores al ejecutar comandos de AWS CLI, asegúrese de que utiliza la versión más reciente de AWS CLI.

Después de completar los pasos anteriores, puede ejecutar una tarea independiente para asumir un rol de IAM en la cuenta de destino mediante la AWS Command Line Interface (AWS CLI). O bien, puede usar la configuración de credential_source en el archivo de configuración de la AWS CLI para especificar el lugar en el que la AWS CLI puede encontrar las credenciales para asumir el rol de IAM adjunto al contenedor de ECS. Con esta configuración, la tarea puede asumir el rol sin tener que exportar credenciales nuevas. Para obtener más información, consulte Assume role credentials (Asumir credenciales de rol).

Verificar que el contenedor que se encuentra dentro de la tarea puede asumir el rol de IAM en la cuenta de destino y acceder al recurso

1.    Ejecute la tarea usando la definición de tarea que creó.

  • Si ejecuta la tarea en Amazon Elastic Compute Cloud (Amazon EC2), utilice el comando docker exec para acceder al contenedor y llevar a cabo las pruebas.
  • Si ejecuta la tarea en AWS Fargate, utilice la característica ECS Exec para acceder al contenedor y llevar a cabo las pruebas.

2.    Configure el archivo de configuración de la AWS CLI y, a continuación, verifique que la tarea asuma el rol de IAM en la cuenta de destino:

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 lo que obtiene es similar a los resultados enumerados, la tarea de ECS en la cuenta 1111222233334444 podrá asumir el rol de IAM en la cuenta 5555666677778888 para enumerar los recursos del clúster de ECS.


¿Le resultó útil este artículo?


¿Necesita asistencia técnica o con la facturación?