Amazon ECS의 IAM 역할 모범 사례
Amazon ECS의 IAM 역할 모범 사례
Amazon ECS에 필요한 역할은 태스크 정의 실행 유형과 사용하는 기능에 따라 달라져요. 역할을 공유하는 대신 표의 역할을 각각 별도로 만드는 것을 권장해요.
출처: 문서
본문
| 역할 | 정의 | 필요한 경우 | 더 알아보기 |
|---|---|---|---|
| 태스크 실행 역할 (Task execution role) | 이 역할은 Amazon ECS가 사용자를 대신해 다른 AWS 서비스를 사용할 수 있게 해 줘요. | 태스크가 AWS Fargate 또는 외부 인스턴스에서 호스팅되고 다음 중 하나일 때: Amazon ECR 프라이빗 저장소에서 컨테이너 이미지를 pull 하거나, 태스크를 실행하는 계정과 다른 계정의 Amazon ECR 프라이빗 저장소에서 컨테이너 이미지를 pull 하거나, awslogs 로그 드라이버로 컨테이너 로그를 CloudWatch Logs로 보낼 때. 태스크가 AWS Fargate 또는 Amazon EC2 인스턴스에서 호스팅되고 다음 중 하나일 때: 프라이빗 레지스트리 인증을 사용하거나, Runtime Monitoring을 사용하거나, 태스크 정의가 Secrets Manager 시크릿 또는 AWS Systems Manager Parameter Store 파라미터를 사용해 민감한 데이터를 참조할 때. |
Amazon ECS 태스크 실행 IAM 역할 |
| 태스크 역할 (Task role) | 이 역할은 (컨테이너의) 애플리케이션 코드가 다른 AWS 서비스를 사용할 수 있게 해 줘요. | 애플리케이션이 Amazon S3 같은 다른 AWS 서비스에 접근할 때. | Amazon ECS 태스크 IAM 역할 |
| 컨테이너 인스턴스 역할 (Container instance role) | 이 역할은 EC2 인스턴스 또는 외부 인스턴스가 클러스터에 등록할 수 있게 해 줘요. | 태스크가 Amazon EC2 인스턴스 또는 외부 인스턴스에서 호스팅될 때. | Amazon ECS 컨테이너 인스턴스 IAM 역할 |
| Amazon ECS Anywhere 역할 | 이 역할은 외부 인스턴스가 AWS API에 접근할 수 있게 해 줘요. | 태스크가 외부 인스턴스에서 호스팅될 때. | Amazon ECS Anywhere IAM 역할 |
| Amazon ECS CodeDeploy 역할 | 이 역할은 CodeDeploy가 서비스를 업데이트할 수 있게 해 줘요. | CodeDeploy 블루/그린 배포 유형으로 서비스를 배포할 때. | Amazon ECS CodeDeploy IAM 역할 |
| Amazon ECS EventBridge 역할 | 이 역할은 EventBridge가 서비스를 업데이트할 수 있게 해 줘요. | EventBridge 규칙과 대상을 사용해 태스크를 예약할 때. | Amazon ECS EventBridge IAM 역할 |
| Amazon ECS 인프라 역할 | 이 역할은 Amazon ECS가 클러스터의 인프라 리소스를 관리할 수 있게 해 줘요. | 다음 중 하나를 원할 때: Amazon EBS 볼륨을 Fargate 또는 EC2 실행 유형의 Amazon ECS 태스크에 연결하거나(인프라 역할이 태스크용 Amazon EBS 볼륨을 관리할 수 있게 함), Transport Layer Security(TLS)로 Amazon ECS Service Connect 서비스 간 트래픽을 암호화하거나, VPC Lattice 대상 그룹을 만들 때. | Amazon ECS 인프라 IAM 역할 |
태스크 역할 (Task role)
태스크 역할을 할당하는 것을 권장해요. 이 역할은 태스크가 실행되는 Amazon EC2 인스턴스의 역할과 구분할 수 있어요. 각 태스크에 역할을 할당하는 것은 최소 권한 접근 원칙에 부합하며 작업과 리소스에 대한 더 세밀한 제어를 가능하게 해요.
태스크 정의에 태스크 역할을 추가하면 Amazon ECS 컨테이너 에이전트가 태스크에 대해 고유한 자격 증명 ID(예: 12345678-90ab-cdef-1234-567890abcdef)가 있는 토큰을 자동으로 생성해요. 이 토큰과 역할 자격 증명은 에이전트의 내부 캐시에 추가돼요. 에이전트는 컨테이너에 자격 증명 ID의 URI(예: /v2/credentials/12345678-90ab-cdef-1234-567890abcdef)로 AWS_CONTAINER_CREDENTIALS_RELATIVE_URI 환경 변수를 채워요.
컨테이너 내부에서 임시 역할 자격 증명을 수동으로 검색하려면 환경 변수를 Amazon ECS 컨테이너 에이전트의 IP 주소에 추가하고 결과 문자열에서 curl 명령을 실행하세요.
curl 169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI
예상 출력은 다음과 같아요.
{
"RoleArn": "arn:aws:iam::123456789012:role/SSMTaskRole-SSMFargateTaskIAMRole-DASWWSF2WGD6",
"AccessKeyId": "«redacted:AKIA…»",
"SecretAccessKey": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
"Token": "IQoJb3JpZ2luX2VjEEM/Example==",
"Expiration": "2021-01-16T00:51:53Z"
}
최신 버전의 AWS SDK는 AWS API 호출 시 AWS_CONTAINER_CREDENTIALS_RELATIVE_URI 환경 변수에서 이러한 자격 증명을 자동으로 가져와요. 자격 증명을 갱신하는 방법은 rePost의 Renewing AWS credentials를 참고하세요. 출력에는 애플리케이션이 AWS 리소스에 접근하는 데 사용하는 시크릿 액세스 키 ID와 시크릿 키로 구성된 액세스 키 쌍이 포함돼요. 또한 AWS가 자격 증명이 유효한지 확인하는 데 사용하는 토큰도 포함돼요. 기본적으로 태스크 역할을 사용하는 태스크에 할당된 자격 증명은 6시간 동안 유효해요. 이후 Amazon ECS 컨테이너 에이전트에 의해 자동으로 교체돼요.
태스크 실행 역할 (Task execution role)
태스크 실행 역할은 Amazon ECS 컨테이너 에이전트가 사용자를 대신해 특정 AWS API 작업을 호출할 권한을 부여하는 데 사용돼요. 예를 들어 AWS Fargate를 사용할 때 Fargate는 Amazon ECR에서 이미지를 pull 하고 CloudWatch Logs에 로그를 쓸 수 있게 하는 IAM 역할이 필요해요. 태스크가 이미지 pull 시크릿처럼 AWS Secrets Manager에 저장된 시크릿을 참조할 때도 IAM 역할이 필요해요.
참고: 인증된 사용자로 이미지를 pull 한다면 Docker Hub의 pull rate limit에 대한 변경 사항의 영향을 받을 가능성이 적어요. 자세한 내용은 Private registry authentication for container instances를 참고하세요. Amazon ECR과 Amazon ECR Public을 사용하면 Docker가 부과하는 한도를 피할 수 있어요. Amazon ECR에서 이미지를 pull 하면 트래픽이 VPC를 떠날 때 네트워크 pull 시간을 단축하고 데이터 전송 변경을 줄이는 데도 도움이 돼요.
중요: Fargate를 사용할 때는 repositoryCredentials를 사용해 프라이빗 이미지 레지스트리에 인증해야 해요. Fargate에서 호스팅되는 태스크의 경우 Amazon ECS 컨테이너 에이전트 환경 변수 ECS_ENGINE_AUTH_TYPE 또는 ECS_ENGINE_AUTH_DATA를 설정하거나 ecs.config 파일을 수정하는 것은 불가능해요. 자세한 내용은 Private registry authentication for tasks를 참고하세요.
컨테이너 인스턴스 역할 (Container instance role)
AmazonEC2ContainerServiceforEC2Role 관리형 IAM 정책에는 다음 권한이 포함돼요. 최소 권한을 부여하라는 표준 보안 권고를 따르면 AmazonEC2ContainerServiceforEC2Role 관리형 정책을 가이드로 사용할 수 있어요. 사용 사례에서 관리형 정책에 부여된 권한 중 일부가 필요 없다면 사용자 지정 정책을 만들고 필요한 권한만 추가하세요.
ec2:DescribeTags– (선택 사항) 보안 주체가 Amazon EC2 인스턴스와 연결된 태그를 설명할 수 있게 해 줘요. 이 권한은 Amazon ECS 컨테이너 에이전트가 리소스 태그 전파를 지원하는 데 사용해요. 자세한 내용은How resources are tagged를 참고하세요.ecs:CreateCluster– (선택 사항) 보안 주체가 Amazon ECS 클러스터를 만들 수 있게 해 줘요. 이 권한은 Amazon ECS 컨테이너 에이전트가 기본 클러스터가 없으면 만들 때 사용해요.ecs:DeregisterContainerInstance– (선택 사항) 보안 주체가 클러스터에서 Amazon ECS 컨테이너 인스턴스를 등록 해제할 수 있게 해 줘요. Amazon ECS 컨테이너 에이전트는 이 API 작업을 호출하지 않지만, 이 권한은 이전 버전과의 호환성을 보장하기 위해 남아 있어요.ecs:DiscoverPollEndpoint– (필수) 이 작업은 Amazon ECS 컨테이너 에이전트가 업데이트를 폴링하는 데 사용하는 엔드포인트를 반환해요.ecs:Poll– (필수) Amazon ECS 컨테이너 에이전트가 Amazon ECS 컨트롤 플레인과 통신해 태스크 상태 변경을 보고할 수 있게 해 줘요.ecs:RegisterContainerInstance– (필수) 보안 주체가 클러스터에 컨테이너 인스턴스를 등록할 수 있게 해 줘요. 이 권한은 Amazon ECS 컨테이너 에이전트가 Amazon EC2 인스턴스를 클러스터에 등록하고 리소스 태그 전파를 지원하는 데 사용해요.ecs:StartTelemetrySession– (선택 사항) Amazon ECS 컨테이너 에이전트가 Amazon ECS 컨트롤 플레인과 통신해 각 컨테이너와 태스크의 상태 정보와 메트릭을 보고할 수 있게 해 줘요. 이 권한은 필수는 아니지만, 컨테이너 인스턴스 메트릭이 스케일 작업을 시작하고 상태 검사 명령과 관련된 보고서를 받을 수 있도록 추가하는 것을 권장해요.ecs:TagResource– (선택 사항) Amazon ECS 컨테이너 에이전트가 생성 시 클러스터에 태그를 지정하고 클러스터에 등록될 때 컨테이너 인스턴스에 태그를 지정할 수 있게 해 줘요.ecs:UpdateContainerInstancesState– 보안 주체가 Amazon ECS 컨테이너 인스턴스의 상태를 수정할 수 있게 해 줘요. 이 권한은 Amazon ECS 컨테이너 에이전트가 Spot Instance 드레이닝에 사용해요.ecs:Submit*– (필수) 여기에는SubmitAttachmentStateChanges,SubmitContainerStateChange,SubmitTaskStateChangeAPI 작업이 포함돼요. Amazon ECS 컨테이너 에이전트가 각 리소스의 상태 변경을 Amazon ECS 컨트롤 플레인에 보고하는 데 사용해요.SubmitContainerStateChange권한은 더 이상 Amazon ECS 컨테이너 에이전트가 사용하지 않지만 이전 버전과의 호환성을 보장하기 위해 남아 있어요.ecr:GetAuthorizationToken– (선택 사항) 보안 주체가 인증 토큰을 검색할 수 있게 해 줘요. 인증 토큰은 IAM 인증 자격 증명을 나타내며 IAM 보안 주체가 접근할 수 있는 모든 Amazon ECR 레지스트리에 접근하는 데 사용할 수 있어요. 수신된 인증 토큰은 12시간 동안 유효해요.ecr:BatchCheckLayerAvailability– (선택 사항) 컨테이너 이미지가 Amazon ECR 프라이빗 저장소에 push 될 때 각 이미지 레이어가 이미 push 되었는지 확인하기 위해 검사돼요. 이미 push 되었다면 해당 이미지 레이어는 건너뜁니다.ecr:GetDownloadUrlForLayer– (선택 사항) 컨테이너 이미지가 Amazon ECR 프라이빗 저장소에서 pull 될 때 이미 캐시되지 않은 각 이미지 레이어에 대해 이 API가 한 번 호출돼요.ecr:BatchGetImage– (선택 사항) 컨테이너 이미지가 Amazon ECR 프라이빗 저장소에서 pull 될 때 이미지 매니페스트를 검색하기 위해 이 API가 한 번 호출돼요.logs:CreateLogStream– (선택 사항) 보안 주체가 지정된 로그 그룹에 대해 CloudWatch Logs 로그 스트림을 만들 수 있게 해 줘요.logs:PutLogEvents– (선택 사항) 보안 주체가 지정된 로그 스트림에 배치 형태의 로그 이벤트를 업로드할 수 있게 해 줘요.
서비스 연결 역할 (Service-linked roles)
Amazon ECS용 서비스 연결 역할을 사용해 Amazon ECS 서비스가 사용자를 대신해 다른 서비스 API를 호출할 권한을 부여할 수 있어요. Amazon ECS는 네트워크 인터페이스를 만들고 삭제하고, 대상 그룹에 대상을 등록하고 등록 해제할 권한이 필요해요. 또한 스케일링 정책을 만들고 삭제하는 데 필요한 권한도 필요해요. 이러한 권한은 서비스 연결 역할을 통해 부여돼요. 이 역할은 서비스를 처음 사용할 때 사용자를 대신해 생성돼요.
참고: 실수로 서비스 연결 역할을 삭제했다면 다시 만들 수 있어요. 지침은 Create the service-linked role을 참고하세요.
역할 권장 사항 (Roles recommendations)
태스크 IAM 역할과 정책을 설정할 때 다음을 수행하는 것을 권장해요.
Amazon EC2 메타데이터 접근 차단 – Amazon EC2 인스턴스에서 태스크를 실행할 때, 컨테이너가 인스턴스 프로필 자격 증명을 포함한 민감한 인스턴스 수준 데이터에 접근하지 못하도록 Amazon EC2 Instance Metadata Service(IMDS)에 대한 컨테이너 접근을 차단하는 것을 강력히 권장해요. 애플리케이션이 AWS API 작업을 호출해야 한다면 대신 태스크용 IAM 역할을 사용하세요.
bridge 모드에서 실행되는 태스크가 Amazon EC2 메타데이터에 접근하지 못하게 하려면 다음 명령을 실행하거나 인스턴스의 사용자 데이터를 업데이트하세요. 인스턴스의 사용자 데이터를 업데이트하는 방법에 대한 자세한 지침은 이 AWS Support 문서를 참고하세요.