개요
Elastic Container Service
는 컨테이너들의 헬스를 체크하고 일정수준 이상의 컨테이너들이 동작하도록 도와주는 서비스이며 쿠버네티스
의 아마존 버전이라고 생각하면 얼추 맞습니다. 이번 포스팅에서는 Docker
이미지를 사용하여 EC2를 사용한 ECS
에 배포해보겠습니다.
시작유형
아마존에서는 2가지 유형으로 ECS
를 제공하고 있습니다. Fargate
와 EC2
가 바로 그것이죠.
EC2
이 유형은 도커 컨테이너
가 EC2
컨테이너 위에서 작동합니다. 우리가 구매한 EC2
에 대해 일정 이상의 컨테이너
가 돌아가도록 관리하는 방식으로 이루어집니다. 프리티어
사용자라면 1개의 t2
인스턴스는 무료로 사용할 수 있습니다.
Fargate
이 유형은 Lambda
와 매우 비슷합니다. 아마존이 가지고 있는 Fargate Pool
에서 하나를 가져와 도커 이미지를 실행시킵니다. 람다처럼 초당 과금
이지만 람다와 비교하면 많이 비쌉니다. 😔 프리티어
대상도 아닙니다.
장단점
그렇다면 어떤 경우에 EC2
와 Fargate
가 적합할까요?
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.yml
과 ecs-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
'# DevNote > AWS' 카테고리의 다른 글
[ELB] 로드 밸런서를 사용하여 EC2에 HTTPS로 연결하기 (0) | 2020.05.18 |
---|---|
[CloudFront, Lambda@Edge] Next를 serverless하게 배포하기 (0) | 2020.05.17 |
[Lambda] serverless와 typescript로 시작하는 Lambda (0) | 2020.05.15 |
[RDS] PostgreSQL 외부접속 허용하기 (0) | 2020.03.17 |