본문 바로가기

# DevNote/AWS

[ECS] 도커를 통해 ECS EC2에 배포하기

개요

Elastic Container Service는 컨테이너들의 헬스를 체크하고 일정수준 이상의 컨테이너들이 동작하도록 도와주는 서비스이며 쿠버네티스의 아마존 버전이라고 생각하면 얼추 맞습니다. 이번 포스팅에서는 Docker 이미지를 사용하여 EC2를 사용한 ECS에 배포해보겠습니다.


시작유형

아마존에서는 2가지 유형으로 ECS를 제공하고 있습니다. FargateEC2가 바로 그것이죠.


EC2

이 유형은 도커 컨테이너EC2 컨테이너 위에서 작동합니다. 우리가 구매한 EC2에 대해 일정 이상의 컨테이너가 돌아가도록 관리하는 방식으로 이루어집니다. 프리티어 사용자라면 1개의 t2 인스턴스는 무료로 사용할 수 있습니다.


Fargate

이 유형은 Lambda와 매우 비슷합니다. 아마존이 가지고 있는 Fargate Pool에서 하나를 가져와 도커 이미지를 실행시킵니다. 람다처럼 초당 과금이지만 람다와 비교하면 많이 비쌉니다. 😔 프리티어 대상도 아닙니다.


장단점

그렇다면 어떤 경우에 EC2Fargate가 적합할까요?


EC2가 적합한 경우

  • 각 컨테이너들이 동일한 디스크를 공유해야 하는 경우
  • 세밀한 인스턴스 세팅이 필요한 경우
  • 항상 실행되는 웹서버

Fargate가 적합한 경우

  • 단기간에 엄청난 CPU 연산이 필요한 경우
  • 5분을 넘겨 Lambda에서는 실행이 불가능한 경우
  • 주기적으로 잠깐만 실행되는 웹크롤러

만약 Fargate 유형으로로 웹서버를 실행시켰다면 엄청난 불상사가 발생합니다. 😱 람다보다 비싸고 프리티어도 아니기 때문에 까먹은 상태로 내버려두면 억울한 금액이 청구됩니다.


시작하기

여기서는 API 서버ECS EC2에 올려서 사용해보겠습니다.


ECS CLI 설치

여기서는 ECS 명령행 인터페이스를 이용하여 설정을 진행합니다. 자세한 설치 방법은 여기를 참조해주세요.


도커 이미지 생성

먼저 서버를 도커 이미지로 만들고 ECR에 배포합니다. 또는 이미 도커허브에 올려져있는 amazon/amazon-ecs-sample 이미지를 사용하셔도 됩니다.


만약 ECR로 푸쉬하는데 에러가 발생했다면 권한부족이 이유일 수 있습니다. 아래 명령어를 입력하면 로그인 명령어가 출력됩니다. 출력된 명령어를 다시 입력해주세요.

aws ecr get-login --no-include-email

클러스터

프로필 생성하기

아마존 공개키비밀키를 설정합니다. 앞으로는 이 프로필을 사용하여 아마존에 자격을 증명합니다.

ecs-cli configure profile \
    --access-key xxx \
    --secret-key xxx \
    --profile-name hello-profile

클러스터 구성하기

어떤 클러스터를 원하는지 묘사합니다. 아래 명령어를 실행한다고 해서 바로 클러스터가 생성되지 않습니다.

ecs-cli configure \
    --cluster hello-cluster \
    --default-launch-type EC2 \
    --config-name hello-cluster-config \
    --region ap-northeast-2

클러스터 생성하기

위에서 진행했던 클러스터 구성프로필을 사용하여 클러스터를 생성해보겠습니다. size는 할당할 EC2인스턴스의 개수입니다. 여기서는 1로 설정해주세요.

ecs-cli up \
    --capability-iam \
    --size 1 \
    --instance-type t2.micro \
    --cluster-config hello-cluster-config \
    --ecs-profile hello-profile

작업

Docker Compose를 사용하여 컨테이너의 구성을 설정할 수 있습니다. 여기서는 Compose Version 3을 사용하여 진행합니다.


작업 정의하기

아래와 같이 docker-compose.yml을 작성해주세요.

version: "3"
services:
  web:
    image: amazon/amazon-ecs-sample
    ports:
      - "80:80"
    logging:
      driver: awslogs
      options:
        awslogs-group: hello-cluster
        awslogs-region: ap-northeast-2
        awslogs-stream-prefix: web

한계 설정하기

각 작업(컨테이너)에 하드웨어 제약을 넣기위해 ecs-params.yml을 작성해야 합니다.

version: 1
task_definition:
  services:
    web:
      # t2.micro 최대 사용 가능량은..
      cpu_shares: 1024
      mem_limit: 983m

작업 생성하기

docker-compose.ymlecs-params.yml파일이 있는 디렉터리에서 다음 명령어를 실행하면 컴포즈 파일로부터 작업생성을 할 수 있습니다.

ecs-cli compose up \
    --create-log-groups \
    --cluster-config hello-cluster-config \
    --ecs-profile hello-profile

작업 확인하기

다음 명령어를 실행하면 클러스터에서 실행중인 작업을 확인할 수 있습니다.

ecs-cli ps \
    --cluster-config hello-cluster-config \
    --ecs-profile hello-profile

작업(컨테이너)에 할당된 IP도 같이 표시되기 때문에 웹브라우저에 해당 IP를 입력하면 작업이 정상적으로 실행중인지 확인할 수 있습니다.


서비스

작업이 성공적으로 실행되고 있는것을 확인했다면 서비스로 등록하여 일정 이상의 작업이 유지되도록 설정할 수 있습니다.


작업 전부 종료하기

일단 아무 작업도 없는 상태에서 진행하기 위해 아래 명령어를 입력합니다.

ecs-cli compose down \
    --cluster-config hello-cluster-config \
    --ecs-profile hello-profile

서비스 생성하기

ecs-cli compose service up \
    --cluster-config hello-cluster-config \
    --ecs-profile hello-profile

이제 웹서버가 중간에 다운되더라도 서비스에 의해 곧 새로운 웹서버 작업이 생성됩니다.


정리하기

서비스 삭제

클러스터 이전에 반드시 서비스부터 삭제해야 합니다. 클러스터가 삭제되어도 서비스는 남아있을 수 있습니다.

ecs-cli compose service rm \
    --cluster-config hello-cluster-config \
    --ecs-profile hello-profile

클러스터 삭제

클러스터를 삭제하면 실행중인 작업도 같이 삭제됩니다.

ecs-cli down \
    --force \
    --cluster-config hello-cluster-config \
    --ecs-profile hello-profile