다른 AWS 계정에서 IAM 역할을 수임하도록 Amazon ECS 작업을 구성하려면 어떻게 해야 합니까?

최종 업데이트 날짜: 2022년 3월 21일

다른 계정에서 AWS Identity and Access Management(IAM) 역할을 수임하도록 Amazon Elastic Container Service(Amazon ECS) 작업을 설정하려고 합니다.

간략한 설명

다음 중 하나를 수행하기 위해 다른 계정의 IAM 역할을 수임하도록 Amazon ECS 작업을 설정할 수 있습니다.

  • Amazon Simple Storage Service(Amazon S3) 버킷과 같은 Amazon 리소스.
  • API 호출을 통해 리소스 설명, 인스턴스 시작 또는 중지와 같은 작업을 수행합니다.

Amazon ECS 작업이 다른 AWS 계정에서 IAM 역할을 수임하도록 허용하려면 다음을 수행합니다.

  1. 소스 계정에서 IAM 역할을 구성합니다.
  2. 소스 계정의 IAM 역할이 대상 계정의 IAM 역할을 수임할 수 있도록 대상 계정의 IAM 역할에 대한 신뢰 정책을 수정합니다.
  3. 소스 계정에서 작업 정의를 생성하고 1단계에서 생성한 IAM 역할을 Amazon ECS 작업 역할로 정의합니다.

해결 방법

이 문서에 사용된 예제에서는 서로 다른 두 AWS 계정을 참조합니다.

  • Amazon ECS 작업을 호스팅하는 소스 계정(예: 1111222233334444)
  • Amazon ECS 작업이 수임하는 IAM 역할(예: destination-account-role)을 포함하는 대상 계정(예: 5555666677778888)

소스 계정에서 IAM 역할 구성

IAM 자격 증명 권한 추가 및 제거의 지침에 따라 Amazon ECS 작업 역할에 다음 정책 설명을 추가합니다(예: my-ECS-task-role). 이렇게 하면 ECS 작업 역할이 대상 계정의 IAM 역할을 수임할 수 있습니다.

참고:

  • 5555666677778888을 작업에서 수임해야 하는 cross-account role의 계정 ID로 바꿉니다.
  • destination-account-role을 수임받은 역할의 이름으로 바꿉니다.
{
  "Version": "2012-10-17",
  "Statement": {
    "Effect": "Allow",
    "Action": "sts:AssumeRole",
    "Resource": "arn:aws:iam::5555666677778888:role/destination-account-role"
  }
}

대상 계정에서 IAM 역할의 신뢰 정책 수정

역할 신뢰 정책 수정(콘솔)의 지침에 따라 대상 계정의 교차 계정 IAM 역할(destination-account-role) 신뢰 정책에 다음 정책 설명문을 추가합니다.

참고:

  • 111122223333444를 ECS 작업 IAM 역할이 있는 소스 계정의 계정 ID로 바꿉니다.
  • my-ECS-task-role을 ECS IAM 작업 역할의 이름으로 바꿉니다.
{
  "Version": "2012-10-17",
  "Statement": [{
    "Effect": "Allow",
    "Principal": {
      "AWS": "arn:aws:iam::1111222233334444:role/my-ECS-task-role"
    },
    "Action": "sts:AssumeRole"
  }]
}

작업 정의 만들기

다음과 유사한 작업 정의 파일(example-task-def.json)을 생성하고 taskRoleArn에 대해 소스 계정의 IAM 역할(my-ECS-task-role)의 ARN을 사용합니다.

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

다음 명령을 실행한 다음 example-task-def.json 파일을 사용하여 작업 정의를 등록합니다.

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

참고: AWS CLI 명령을 실행할 때 오류가 발생하는 경우, 최신 버전의 AWS CLI를 사용하고 있는지 확인하세요.

이전 단계를 완료한 후 독립 실행형 작업을 실행하고 AWS Command Line Interface(AWS CLI)를 사용하여 대상 계정에서 IAM 역할을 수임할 수 있습니다. 또는 AWS CLI 구성 파일의 credential_source 설정을 사용하여 AWS CLI가 ECS 컨테이너에 연결된 IAM 역할을 수임하기 위한 자격 증명을 검색 가능한 위치를 지정할 수 있습니다. 이 설정을 사용하면 새 자격 증명을 내보내지 않고도 작업에서 역할을 수임할 수 있습니다. 자세한 내용은 역할 자격 증명 수임을 참조하세요.

작업 내의 컨테이너가 대상 계정의 IAM 역할을 수임하고 리소스에 액세스할 수 있는지 확인

1.    생성한 작업 정의를 사용하여 작업을 실행합니다.

  • Amazon Elastic Compute Cloud(Amazon EC2)에서 작업을 실행하는 경우 docker exec 명령을 사용하여 컨테이너로 이동한 다음 테스트를 수행합니다.
  • AWS Fargate에서 작업을 실행하는 경우 ECS Exec 기능을 사용하여 컨테이너로 이동한 다음 테스트를 수행합니다.

2.    AWS CLI 구성 파일을 구성한 다음 작업이 대상 계정의 IAM 역할을 수임하는지 확인합니다.

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

출력이 나열된 것과 유사하면 계정 1111222233334444의 ECS 작업이 계정 5555666677778888의 IAM 역할을 수임하여 ECS 클러스터 리소스를 나열할 수 있습니다.