아마존 ECS 클러스터 인스턴스와 서비스용 IAM 역할

들어가며 - 아마존 ECS를 사용하기 위한 IAM 역할

아마존 ECSAmazon Elastic Container Service는 아마존에서 제공하는 매니지드 컨테이너 오케스트레이션 서비스입니다. ECS는 크게 클러스터 인스턴스, 태스크, 서비스로 구성되어있습니다. 태스크는 필요에 따라 컨테이너 실행 중에 필요한 IAM 역할을 가질 수 있습니다. 이와 달리 클러스터 인스턴스와 서비스를 사용하기 위해서는 미리 정의된 IAM 역할을 반드시 지정해줄 필요가 있습니다. 이 글에서는 아마존에서 제공하는 ECS 클러스터 인스턴스와 서비스 용 IAM 역할에 대해서 알아봅니다.

44BITS 소식과 클라우드 뉴스를 전해드립니다. 지금 5,000명 이상의 구독자와 함께 하고 있습니다 📮

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 서비스를 생성할 때 이 롤을 지정해주면 정상적으로 동작합니다.

더 읽을거리

44BITS 로고

아마존 웹 서비스(AWS, Amazon Web Serivce)란?

🏷️ 키워드, 2020-01-20 - 아마존 웹 서비스는 아마존의 자회사로 같은 이름으로 퍼블릭 클라우드 컴퓨팅 서비스를 제공하고 있습니다. 대표적인 서비스로는 컴퓨팅 자원을 제공하는 EC2, 오브젝트 스토리지 S3, 프라이빗 클라우드 VPC, 권한 제어 IAM, 컨테이너 오케스트레이션 ECS, EKS 등이 있습니다.
도움이 되셨나요?
RSS 리더 피들리에서 최신 글을 구독할 수 있습니다.
트위터, 페이스북으로 44BITS의 새소식을 전해드립니다.
✔ 44BITS의 다른 활동도 확인해보세요. 다양한 채널에서 만나볼 수 있습니다.
✔ 따뜻한 댓글 하나와 피드백은 큰 힘이 됩니다.

서버스펙(Serverspec)을 사용한 도커 이미지 테스트 자동화: 인프라스트럭처 테스트 프레임워크

🗒 기사, 2015-07-07 - 구성 관리 도구는 서버의 상태를 코드로 기술하고 관리할 수 있게 도와줍니다. 이러한 패러다임을 기반으로 서버를 관리할 때도 소프트웨어에 사용할 수 있는 기법들을 활용할 수 있게 되었습니다. 서버스펙(Serverspec)은 루비의 테스트 프레임워크인 R스펙(RSpec)을 확장한 인프라스트럭처 테스트 도구입니다. 서버스펙을 사용하면 소프트웨어를 테스트하듯이 인프라스트럭처도 테스트하는 게 가능해집니다. 이 글에서는 서버스펙을 사용해 도커(Docker) 이미지 테스트 방법을 소개합니다.

장고(Django) 2.2 LTS 릴리스와 주요 변경 사항

🗞 새소식, 2019-04-12 - Django 2.2가 출시되었습니다. 이 글에서는 Django 2.2에 추가된 기능과 바뀐 점을 알아보려 합니다. 릴리스 노트만으로 이해하기가 어려운 기능엔 설명을 조금 보태었습니다.

Write the Docs 서울 밋업 준비 기록

🗒 기사, 2019-05-03 - 2019년 3월에 열린 Write The Docs 서울의 밋업을 준비하면서, 디자이너 없이 꾸역꾸역 대표 이미지와 스티커, 현수막, 배너를 직접 제작한 경험을 정리해보았습니다.