uncategorized

AWS EC2 Container Service(ECS)를 통한 배포

ecs 는 현재 서울 리전에서는 지원되고 있지 않다. 글을 쓰다가 개인 업무가 있어서 끊어 쓰다보니 매끄럽지가 않은데 질문사항이나 잘못된 점이 있으면 피드백 주세요.

개요

aws console 을 통해 EC2 Container Service(ecs) 에 진입하면 3개의 메뉴가 보인다.

  • Cluster
  • Task Definitions
  • Repositories

Cluster

하드웨어 클러스터를 의미한다. EC2의 모임이라고 생각하면 편하다.

Task Definitions

이 곳에서 Docker 파일을 통해 task 를 정의한다. 정의한 taskcluster에 할당하여 동작시킨다고 생각하면된다. task 에서는 메모리를 얼마나 사용할 것인가? 등의 docker 설정을 포함한다.

Repository

aws 에서 사용할 수 있는 docker hub 라고 이해하면 빠르다. 이 곳에 빌드된 docker image 를 올린다.

실제 구성

저장소 구성 및 업로드

docker image build

먼저 어플리케이션을 구현하고 Dockerfile을 통해 이미지로 빌드한다(빌드 과정은 이 포스트의 영역을 넘어간다).

docker 저장소 생성

빌드 된 이미지를 ecs repository 에 업로드하기 위해서 ecs 서비스의 repository 에 진입하여 Create repository 버튼으로 저장소를 생성한다.

docker image upload

친절하게 ecs에서 repository 를 선택하면 View Push Commands 라는 버튼을 통해 업로드 방법을 볼 수 있다. login, build, tag, push(upload) 순으로 명령어가 적혀있는데 저장소 url, region을 자신에 맞게 수정하고 올리면된다.

task definitions

task 생성

Task Definitions 메뉴에서 Create a Task Definition 버튼을 눌러 생성한다. Container Definitions 에서 Add container 버튼을 통해 컨테이너를 등록해야하는데, image 에서는 프로토콜(http://)을 제외한 이미지 경로를 넣어준다.

메모리의 경우는 task 가 실행될 실제 컨테이너의 메모리 안에서 설정하면된다. 실제 사용하는 메모리보다 적게 잡을 경우 속도저하, 응답없음 등을 경험할 수 있다. 실제로 PDF를 생성하는 서버를 구현했다가 랜더링 할 메모리가 모자라 응답없음을 경험했었다.

추가적으로 포트 매핑, CPU unit 등을 설정해준다.

cluster 에 배포

cluster 생성
service 생성

클러스터를 생성하고 나서 클러스터에 제공할 서비스를 생성한다. 여기서는 위에서 정의한 task 와 이를 서비스할 cluster 를 지정하고 몇개의 task를 돌릴 것인지 등을 셋업한다. 추가적으로 ELB, auto scaling등도 셋업을 한다.

ELB 최근에 Application Load Balandcer 가 추가 되면서 기본설값이 되어 있다. 기존에 쓰이던 ELB는 Classic Load Balancer 니 참고 바란다.


여기 까지는 그냥 따라오면 되는데 중요한 문제가 있다. cluster 에 등록된 컨테이너 인스턴스가 없다. 이제 이를 세팅해야한다. cluster에 ec2 instance를 등록하기 위해서는 ecs agent가 설치된 이미지가 로드되야한다. 이건 유저가 스스로 설치할 수도 있지만 기본적으로 아마존에서 제공하는 이미지가 있다.

테스트를 위해 ec2 instance 를 생성한다. AMIAmazon ECS-Optimized Amazon Linux AMI 를 이용한다.

auto scaling group, launch configuration 을 통해 서비스를 하는게 정석이다.

여기서 user data 를 설정해서 인스턴스가 ecs에 접속해서 클러스터에 등록을 할 수 있도록 설정해 줘야한다.

1
2
#!/bin/bash
echo ECS_CLUSTER=CLUSTER_NAME >> /etc/ecs/ecs.config

user 데이터의 내용은 위와 같다.

여기서 CLUSTER_NAME 부분을 통해 인스턴스가 로딩되면서 ecs agent가 실행되게되고 여기서 ecs 에 접속하여 cluster에 등록되게 된다.


update revision

docker image가 업데이트 되어 재 배포가 필요한 경우에는 task의 new revision을 선택하고 container를 눌러서 한번 업데이트를 누른다(현재 컨테이너가 같은 docker이름을 참조하더라도 재 참조를 하도록) 리비전이 생성되면 생성된 task를 서비스에 업데이트하게 되면 현재 구동되고 있는 task가 active로 업데이트된 task가 primary로 등록되며 시간이 조금 지나면 active가 내려가고 primary가 active되면서 서비스가 이어지게 된다.

trouble shotting

###* cat /etc/ecs/ecs.config

1
Could not register module="api client" err="ClientException: Cluster not found.
  • /etc/ecs/ecs.config 에 cluster 이름이 정확히 올라가 있는지 2번 확인한다.
  • 그래도 안되면 ecs agent api call이 public ip를 요구하므로 public ip가 있어야한다.(또는 프록시 등의 다른 방법) ec2를 확인한다.
Share