Amazon Web Services 한국 블로그

EC2 Container Service 따라하기

지난 AWS re:Invent 에서 Amazon EC2 Container Service(ECS) ‘미리 보기’를 처음 소개하면서 다양한 고객의 소리를 들었습니다. ‘미리 보기’ 신청에 많은 분들이 요청해 주신 점도 감사드립니다.  지금까지 ‘미리 보기’ 신청을 준 모든 고객 분들이 사용하실 수 있으며, 신규 신청에 경우도 24시간내에 사용 가능하십니다.

ECS는 Docker기반의 애플리케이션 빌드 및 실행 및 확장성(Scaling)을 돕기 위한 서비스입니다. 간단한 클러스터 관리 및 높은 성능과 유연한 스케줄링, 확장성 및 이동성 그리고 AWS외 서비스 기능과 원활한 통합을 할 수 있습니다.  기존 AWS에서 실행 환경 처럼  안전하고 효율적입니다.

ECS의 기본 사항
먼저 ECS의 용어와 기본 컨셉에 대해 알아보도록 하겠습니다.

  • Cluster -Task를 실행하기 위한 Container Instance의 논리적 그룹입니다
  • Container Instance -ECS가 가동되고 있는 EC2 인스턴스 즉, Cluster에 등록된 것입니다. Cluster내에서 움직이고 있는 인스턴스 집합은 Task를 실행하기 위한 리소스 풀(Resource Pool)을 만듭니다.
  • Task Definition– Task Definition은 Container 모음을 정합니다. 여기에는 Task Description이 포함되며, 한 개 이상의 Container를 정의합니다. 어떤 Task Definition에서 정의된 모든 Container는 동일한 Container Instance에서 가동합니다.
  • Task -Task Definition를 인스턴스화 합니다.
  • Container -Task의 일부로 생성된 Docker 컨테이너입니다.

ECS Container Agent는 Container 인스턴스에서 움직이는 에이전트입니다.  Container를 시작하는 역할 및 에이전트 자신도 Docker 컨테이너에서 실행 되며(Docker Hub에서 이용 가능), 인스턴스 내에 있는 Docker 데몬과 통신을 합니다.

우리가 클러스터 및 컨테이너 서비스를 언급할 때, “스케줄링”은 인스턴스에 작업을 할당하는 과정입니다. ECS는 다음의 3가지 스케줄링 옵션을 제공합니다.

  1. 자동(Automated)RunTask 함수는 Cluster에서 Task(Task Definition에서 정의)을 자동으로 진행합니다.
  2. 매뉴얼(Manual)StartTask 함수는 특정 Container Instance(또는 인스턴스)에서 Task(Task Definition에서 정의)을 진행합니다.
  3. 맞춤(Custom)ListContainerInstancesDescribeContainerInstances을  사용하면 Cluster내의 이용 가능한 자원의 정보를 수집할 수 있고, 스케줄링의 핵심을 구현하는 것입니다. (다시 말해 최적의 Container Instance를 뽑기 위한  정보로 할용 가능합니다.) 그 이후 StartTask를 실행하고 인스턴스에서 작업을 실행합니다. 이를 실행하는 것은 자체 RunTask 구현하는 것과 같은 의미가 됩니다.

EC2 Container Service 직접 해보기
ECS를 실제로 테스트해 보기 위해 미리 보기 등록을 하신 후, AWS CLI의 프리뷰 버전을 다운로드 후 설치합니다. 그 다음, IAM Role와 VPC를 작성해 클러스터를 만들기 위한 준비를 합니다. (ECS는 현재 US East 지역에서만 가능하나 점차로 지원 리전을 확대할 예정입니다.). 아래 명령어를 실행해 MyCluster라는 이름의 Cluster를 작성해 봅시다.

$ aws ecs create-cluster --cluster-name MyCluster --profile jbarr-cli

아래는 JSON 형식으로 신규 생성한 Clouster 정보입니다.

{
    "cluster": {
        "clusterName": "MyCluster", 
        "status": "ACTIVE", 
        "clusterArn": "arn:aws:ecs:us-east-1:348414629041:cluster/MyCluster"
    }
}

다음 단계로  ECS용 AMI(Amazon Linux AMI ECS용 미리보기 버전)를 이용하여,  자신의 VPC 중에 여러개의 EC2인스턴스를 만듭니다. EC2를 만들때, ECS용으로 만든 IAM Role(ecs라는 이름)를 선택합니다.

EC2 사용자 데이터 설정에서 자신의 Cluster(MyCluster)내에서 실행하도록 ECS 설정을 적습니다.(default클러스터 경우, 필요 없음)

인스턴스가 시작된 이후 자신의 Cluster에 포함되었는지 list-container-instances 명령으로 확인할 수 있습니다. 등록된 Container Instance은 각자 ARN가 할당됩니다.

$ aws ecs list-container-instances --cluster MyCluster --profile jbarr-cli
{
    "containerInstanceArns": [
        "arn:aws:ecs:us-east-1:348414629041:container-instance/4cf62484-da62-49a5-ad32-2015286a6d39", 
        "arn:aws:ecs:us-east-1:348414629041:container-instance/be672053-0ff8-4478-b136-7fae9225e493"
    ]
}

Cluster내 인스턴스를 선택한 후, 이용 가능한 CPU와 메모리 자원에 대해 질의를 실행하고 찾아낼 수 있습니다.

$ aws ecs describe-container-instances --cluster MyCluster \
  --container-instances arn:aws:ecs:us-east-1:348414629041:container-instance/4cf62484-da62-49a5-ad32-2015286a6d39 \
  --profile jbarr-cli

아래가 결과 데이터 샘플입니다.

{
            "registeredResources": [
                {
                    "integerValue": 1024, 
                    "longValue": 0, 
                    "type": "INTEGER", 
                    "name": "CPU", 
                    "doubleValue": 0.0
                }, 
                {
                    "integerValue": 3768, 
                    "longValue": 0, 
                    "type": "INTEGER", 
                    "name": "MEMORY", 
                    "doubleValue": 0.0
                }
            ]
}

ECS의 미리보기 개발자 가이드에 따라 아래와 같이 간단한 Task Definition을 작성하고 등록해 보겠습니다.

$ aws ecs register-task-definition --family sleep360 \
  --container-definitions file://$HOME/tmp/task.json \
  --profile jbarr-cli

그리고 10개를 실행해 보도록 하죠.

aws ecs run-task --cluster MyCluster --task-definition sleep360:1 --count 10 --profile jbarr-cli

실행 중인 작업은 다음과 같이 list-tasks 명령으로 볼 수 있습니다.

$ aws ecs list-tasks --cluster MyCluster --profile jbarr-cli

아래와 같이 실행 중인 컨테이너 목록이 반환됩니다.

{
    "taskArns": [
        "arn:aws:ecs:us-east-1:348414629041:task/0c949733-862c-4979-b5bd-d4f8b474c58e", 
        "arn:aws:ecs:us-east-1:348414629041:task/3ababde9-08dc-4fc9-b005-be5723d1d495", 
        "arn:aws:ecs:us-east-1:348414629041:task/602e13d2-681e-4c87-a1d9-74c139f7335e", 
        "arn:aws:ecs:us-east-1:348414629041:task/6d072f42-75da-4a84-8b68-4841fdfe600d", 
        "arn:aws:ecs:us-east-1:348414629041:task/6da6c947-8071-4111-9d31-b87b8b93cc53", 
        "arn:aws:ecs:us-east-1:348414629041:task/6ec9828a-cbfb-4a39-b491-7b7705113ad2", 
        "arn:aws:ecs:us-east-1:348414629041:task/87e29ab2-34be-4495-988b-c93ac1f8b77c", 
        "arn:aws:ecs:us-east-1:348414629041:task/ad4fc3cc-7e80-4681-b858-68ff46716fe5", 
        "arn:aws:ecs:us-east-1:348414629041:task/cdd221ea-837c-4108-9577-2e4f53376c12", 
        "arn:aws:ecs:us-east-1:348414629041:task/eab79263-087f-43d3-ae4c-1a89678c7101"
    ]
}

여기까지 작업을 실행하고 인스턴스를 정지시킨후 정리해 보겠습니다. 직접 실행해 본 결과, 다음의 세가지 점만 약간의 Tips으로 적어봅니다.

  1. VPC가 외부 연결이 있는지 확인해 두세요
  2. ECS가 이용 가능한 적절한 AMI을 사용하세요(미리 보기 단계)
  3. IAM Role이 필요하므로, AMI을 띄울 때 설정해 주세요

ECS 빠른 실행 템플릿
빠르게 ECS를 실행해 볼 수 있도록 CloudFormation을 사용한 ECS 실행 템플릿을 활용해 보세요. 이 템플릿은 IAM Role과 그 역할을 위한 Instance Profile을 생성합니다. 이 역할은 ECS 에이전트가 ECS와 커뮤니케이션을 할 수 있도록 허용하기 위한 것입니다. 템플릿에서는 이 Role을 통해 인스턴스를 시작하고, 그 결과 인스턴스에 접근할 수 있는 SSH 명령을 생성해서 돌려줍니다. 기존 클러스터로 인스턴스를 시작 및 등록하는 것도 가능하며, “default”라는 이름의 기본 클러스터를 이용하기도 합니다. 이 템플릿을 사용한 경우, 인스턴스는 Default VPC을 사용하게 됩니다.

지금 시작 하기
ECS를 하기 위해서는 먼저 미리 보기 등록을 하시기 바랍니다. 즉시 이용 가능합니다.

ECS에 대해 더욱 알고 싶은 경우, re:Invent의 다음 세션을 보시면 좋습니다. 대략 30분 정도 됩니다(주의하실 점은 현재 ECS 기능이 크게 변해있을 수 있으므로, 참고만 하시면 좋겠습니다.)

또한, 내년 Amazon EC2 Container Service Deep Dive(2015 년 1월 14일 미국 시간)라는 웨비나를 진행합니다. 이번 웨비나에서는 ECS 선임 매니저인 Deepak Singh가 왜 우리가 ECS을 만들었는가, 핵심 개념 및 고객 애플리케이션에서 ECS를 어떻게 사용하면 좋은지 등을 발표합니다..

또 한 가지는 CoreOS라는 현대적인 인프라 구조의 요구 사항을 만족하도록 설계한 운영 체제를 기반으로 CoreOS AMI의 ECS 지원이 가능해졌습니다! 자세한 것은 Amazon ECS on CoreOS를 참고하십시오.

마지막으로 AWS는 우리는 항상 고객 피드백을 받고 있습니다. ECS는 아직 미리보기 모드이므로 고객의 요구나 요청을 듣고 새로운 기능을 개선할 수 있습니다. 피드백은 ECS 포럼에 해 주시기 바랍니다.

– Jeff;

본 글은 EC2 Container Service In Action의 한국어 번역입니다.