아마존 ECS 클러스터 인스턴스와 서비스용 IAM 역할
들어가며 - 아마존 ECS를 사용하기 위한 IAM 역할
아마존 ECSAmazon Elastic Container Service는 아마존에서 제공하는 매니지드 컨테이너 오케스트레이션 서비스입니다. ECS는 크게 클러스터 인스턴스, 태스크, 서비스로 구성되어있습니다. 태스크는 필요에 따라 컨테이너 실행 중에 필요한 IAM 역할을 가질 수 있습니다. 이와 달리 클러스터 인스턴스와 서비스를 사용하기 위해서는 미리 정의된 IAM 역할을 반드시 지정해줄 필요가 있습니다. 이 글에서는 아마존에서 제공하는 ECS 클러스터 인스턴스와 서비스 용 IAM 역할에 대해서 알아봅니다.
ECS 컨테이너 인스턴스용 IAM 역할
AWS에서는 ECS 컨테이너 인스턴스용 IAM 정책IAM Policy을 제공합니다. 이 정책은 AmazonEC2ContainerServiceforEC2Role
입니다. 이 정책에는 ECS, ECRElastic Container Registry 관련 권한과 로그 기록을 위한 권한이 부여되어있습니다. 이러한 권한들은 주로 ECS 컨테이너 에이전트에서 클러스터 관련 작업을 수행하기 위해 사용합니다. 정책에 부여된 모든 권한은 아래와 같습니다.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ecs:CreateCluster",
"ecs:DeregisterContainerInstance",
"ecs:DiscoverPollEndpoint",
"ecs:Poll",
"ecs:RegisterContainerInstance",
"ecs:StartTelemetrySession",
"ecs:UpdateContainerInstancesState",
"ecs:Submit*",
"ecr:GetAuthorizationToken",
"ecr:BatchCheckLayerAvailability",
"ecr:GetDownloadUrlForLayer",
"ecr:BatchGetImage",
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": "*"
}
]
}
이 정책을 가진 역할은 기본적으로 만들어져있지 않습니다만, 웹콘솔을 사용해 클러스터와 클러스터 인스턴스를 생성하는 경우 이 정책을 가진 ECSInstance 롤이 생성됩니다. 이어지는 내용은 이 정책을 가진 역할을 AWSCLI를 사용해 직접 생성하는 방법입니다.
IAM 역할을 생성하기 위해서는 먼저 역할을 실행할 수 있는 서비스를 지정할 수 있는 어슘 롤assume role을 준비해야합니다. 아래 내용을 assume-role.json
에 저장합니다.
{
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "ec2.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
],
"Version": "2012-10-17"
}
ecs-instance
이름을 가진 빈 역할을 생성합니다. iam create-role
명령어를 사용합니다.
$ aws iam create-role --role-name ecs-instance --assume-role-policy-document file://assume-role.json
IAM 역할 대시보드에서 ecs-instance
역할이 추가된 것을 확인합니다.
이 역할에는 아직 아무런 정책이 없는 상태입니다. iam attach-role-policy
명령어로 아마존에서 제공하는 정책을 추가합니다.
$ aws iam attach-role-policy --policy-arn arn:aws:iam::aws:policy/service-role/AmazonEC2ContainerServiceforEC2Role --role-name ecs-instance
ecs-instance
역할의 상세 페이지에서 추가된 정책을 확인할 수 있습니다.
이제 인스턴스를 실행할 때 이 역할을 할당하면 ECS의 클러스터 인스턴스로 사용할 수 있습니다.
ECS 서비스용 IAM 역할
ECS 서비스를 정의할 때도 IAM 역할이 필요합니다. 항상 IAM 역할이 필요한 것은 아니지만, 엘라스틱 로드 밸런서ELB, Elastic Load Balancer와 연동하는 경우에 필수적으로 관련 권한이 필요합니다. 이와 관련된 권한은 AmazonEC2ContainerServiceRole
정책에 정의되어있습니다. 이 정책의 모든 권한은 아래와 같습니다. 이 권한들은 주로 컨테이너를 동적으로 로드 밸런서에 추가하고 제거할 때 사용됩니다.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ec2:AuthorizeSecurityGroupIngress",
"ec2:Describe*",
"elasticloadbalancing:DeregisterInstancesFromLoadBalancer",
"elasticloadbalancing:DeregisterTargets",
"elasticloadbalancing:Describe*",
"elasticloadbalancing:RegisterInstancesWithLoadBalancer",
"elasticloadbalancing:RegisterTargets"
],
"Resource": "*"
}
]
}
이 역할도 웹 콘솔에서 서비스를 생성할 때 ECSService
라는 이름으로 생성할 수 있습니다. 아래는 AWSCLI를 사용해서 직접 역할을 만드는 방법입니다. 먼저 서비스용 어슘 롤에서는 ecs.amazonaws.com
을 지정해주어야합니다. 아래 내용을 assume-role.json
에 저장합니다.
{
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "ecs.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
],
"Version": "2008-10-17"
}
IAM 역할을 만드는 방법은 인스턴스용 역할을 만드는 것과 같습니다. 먼저 ecs-service
이름을 가진 빈 역할을 생성합니다.
$ aws iam create-role --role-name ecs-service --assume-role-policy-document file://assume-role.json
다음으로 이 역할에 AmazonEC2ContainerServiceRole
정책을 연결합니다.
$ aws iam attach-role-policy --policy-arn arn:aws:iam::aws:policy/service-role/AmazonEC2ContainerServiceRole --role-name ecs-service
이제 ELB와 연결된 ECS 서비스를 생성할 때 이 롤을 지정해주면 정상적으로 동작합니다.