본문 바로가기
Coding/DevOps

AWS ECS에 docker-compose.yml 배포하는 방법

by Hide­ 2018. 12. 31.
반응형

이전 포스팅에서는 단일 도커파일(Dockerfile)을 ECS에 배포하는 방법에 대해 다뤘었다.

하지만 실제 프로덕션 단계에서는 docker-compose를 통해 여러개의 도커를 하나로 엮어서 사용하는 경우가 많다.

ECS는 EC2서비스 위에 도커가 돌아가는 형태인데, docker-compose를 통해 배포해준다면

하나의 EC2위에 여러개의 도커 컨테이너가 돌아간다고 생각하면 된다.

먼저 awsecs-cli를 설치해줘야 한다.

나는 OSX를 사용하므로 모든 명령어를 맥북 기준으로 설명한다.

아래의 명령어를 통해 aws cli를 설치해준다.


pip3 install awscli


다음으로 아래의 명령어로 ecs-cli를 설치한다.


sudo curl -o /usr/local/bin/ecs-cli https://s3.amazonaws.com/amazon-ecs-cli/ecs-cli-darwin-amd64-latest


이제 다운받은 파일에 실행권한을 준다.


sudo chmod +x /usr/local/bin/ecs-cli


설치가 완료됐으면 버전을 확인해본다.


ecs-cli --version


위처럼 잘 나오면 정상적으로 설치가 완료된 것이다.

이제 몇가지 환경설정을 거친 후 클러스터 구성부터 설정해준다.


ecs-cli configure --cluster 클러스터이름 --region ap-northeast-2 --default-launch-type EC2 --config-name 설정파일이름


여기서 굵게 표시한 부분은 원하는 이름으로 하면 된다.

그리고 일반적으로 설정파일 이름은 클러스터 이름과 동일하게 가면 된다.

나는 EC2위에 도커를 돌릴 예정이므로 --default-launch-type에 EC2옵션을 줬지만 Fargate를 사용하고 싶다면 FARGATE로 주면 된다.

다음으로 클러스터를 생성한다.


aws ecs create-cluster --cluster-name 클러스터이름


이제 ecs설정을 해준다.


ecs-cli configure profile --access-key 액세스키 --secret-key 비밀키 --profile-name ECS이름


굵게 표시한 부분을 알맞게 수정하고 위 명령어를 실행한다.

다음으로 클러스터를 생성한다.


ecs-cli up --keypair 키페어이름 --capability-iam --size 2 --instance-type t2.micro --cluster-config 클러스터설정이름


위 내용도 굵게 표시한 부분만 자신에게 맞춰서 수정해준다.

인스턴스 타입은 테스트이므로 가장 작은 t2.micro로 설정해줬으며, 클러스터 설정이름은 클러스터 이름과 동일하게 설정해줬다.

(참고로 여기서 FATA[0000] Error executing 'up': A CloudFormation stack already exists for the cluster 에러가 발생한다면 맨 끝에 --force 옵션을 주면 된다.)

이제 docker-compose.yml파일을 만들어줘야 한다.

본 포스팅에서는 MySQL(5.7)과 Wordpress를 엮어서 올려본다.

그러기 위해서 먼저 아래의 명령어로 이미지를 땡겨온다.


docker pull wordpress

docker pull mysql:5.7


이제 docker-compose.yml파일을 생성하고 아래의 내용으로 채워넣는다.


version: '3'
services:
wordpress:
image: wordpress
ports:
- "80:80"
links:
- mysql
logging:
driver: awslogs
options:
awslogs-group: tutorial-wordpress
awslogs-region: ap-northeast-2
awslogs-stream-prefix: wordpress
mysql:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: password
logging:
driver: awslogs
options:
awslogs-group: tutorial-mysql
awslogs-region: ap-northeast-2
awslogs-stream-prefix: mysql

이전에는 version 2까지만 지원했었는데 이제 3까지 지원해준다고 한다.

참고로 기존에 로컬에서 돌릴 때 build옵션을 통해 각 컨테이너별로 명령어를 실행시켰었는데

ECS에서는 build옵션을 지원하지 않는다고 한다.

따라서 기존처럼 docker-compose에서는 각 컨테이너를 엮어주고 해당 컨테이너들에서

실행시킬 세부 명령어를 따로 Dockerfile에 정의해놓은 경우, docker-compose build로 빌드하고

해당 이미지들을 ECR에 올린 이후 위 docker-compose의 image부분에 해당 ECR이미지의 주소를 적어주면 된다.

이번 포스팅의 경우 따로 실행시킬 명령어가 없으므로 그냥 진행하기로 한다.


추가적으로 docker-compose 3버전을 사용하는 경우 ecs-params.yml라는 파일도 생성해줘야 한다.

ecs-params.yml파일을 생성하고 아래의 내용으로 채워넣는다.


version: 1
task_definition:
services:
wordpress:
cpu_shares: 100
mem_limit: 208435456
mysql:
cpu_shares: 100
mem_limit: 208435456

이제 ecs-cli compose up 명령어를 통해 클러스터에 배포할 수 있다.

기본적으로 파일명에 대한 명시가 없으면 현재 폴더에 있는 docker-compose.yml파일과 ecs-params.yml파일을 참조하여 생성하지만

--file옵션을 준다면 다른 파일을 통해 설정해줄수도 있다.

아래의 명령어로 배포한다.


ecs-cli compose up --create-log-groups --cluster-config 클러스터이름


클러스터이름만 설정해주고 실행한다.

위 명령어를 실행하면 아마 아래처럼 나올것이다.


맨 마지막 2개의 라인을 보면 컨테이너를 실행시켰다고 나온다.

이제 AWS콘솔의 ECS부분을 들어가보면,


우리가 설정한 2개의 컨테이너가 하나의 EC2 클러스터에서 돌고있는 모습을 확인할 수 있다.

들어가서 세부내용을 살펴본다.


작업 탭으로 이동하면 현재 돌고있는 작업을 확인할 수 있다.

작업 부분을 눌러서 세부 내용을 확인해본다.


우리가 설정한대로 mysql, wordpress 두개의 컨테이너가 실행중인 모습을 확인할 수 있다.

wordpress 옆에 있는 > 를 눌러 세부 내용을 살펴본다.


이런식으로 외부 링크 부분에 접속할 수 있는 IP가 나온다.

해당 아이피로 접속을 해보면,


정상적으로 접속이 된다.

명령어들만 적어본다면 다음과 같다. (aws, ecs-cli 설정이 완료됐다고 가정)


aws ecs create-cluster --cluster-name 클러스터이름

ecs-cli configure --cluster 클러스터이름 --region ap-northeast-2 --default-launch-type EC2 --config-name 설정이름

ecs-cli configure profile --access-key 액세스키 --secret-key 시크릿키 --profile-name 클러스터이름

ecs-cli up --keypair 키페어이름 --capability-iam --size 2 --instance-type t2.micro --cluster-config 클러스터이름 --force

ecs-cli compose up --create-log-groups --cluster-config 클러스터이름