ECS-CLI로 서울리전 Fargate 만들어보기

Harry The Great
해리의 유목코딩
6 min readNov 27, 2018

주의: 제목만큼 내용은 더 골이아픕니다

AWS에 익숙하신 사용자분들이고 평소 Docker를 사용해오시는분들께 권장합니다.

ECS? 엥 그거 완전 쿠버네틱스에 밀린거 아니냐?

맞습니다.. 세상이 완전 쿠버네틱스 세상이 되었습니다….

YES… BUT !!!!

아직 쓸만한구석은 남아있습니다. 바로 이번에 서울리전에 생긴 Fargate입니다. 아직까지 AWS 환경에서 쿠버네틱스를 사용하려면 EC2가 필요하고 많은 프로비저닝 시간이 걸립니다. 그리고 설정도 아주 복잡하죠. 이럴때를 위해 쓸만한 서비스가 ECS Fargate입니다.

단기간에 Lambda보다는 컴퓨팅용량과 시간이 많이 필요한 일에 적합하지만 장시간 사용할 일은 아닌경우에 좋습니다. 예로들자면 동영상압축, 사이트 크롤링, 간단한 데이터분석등이 있습니다.

ECR 레포지토리 만들기

예제를 CLI로 작성할 예정이지만 웹인터페이스에서 설정하는법도(아주 간략히…) 함께 기술하겠습니다.

aws ecr get-login --no-include-email //로그인을 해준 후 
aws ecr create-repository --repository-name [레포지토리이름]

먼저 레포지토리를 생성해줍니다. 위 명령어를 실행하면 리턴값으로 생성된 ECR ARN주소가 나오는데 잘 적어둡니다.

웹에서는 ECR 레포지토리 생성으로 만들어주세요.

생명주기 설정해주기

aws ecr put-lifecycle-policy — repository-name <string> — lifecycle-policy-text “file://aws-ecr-lifecycle-policy.json”

본 내용에서 자세하게 다루기는 어려워 도큐먼트를 참고해주세요. 생명주기를 설정하지 않고 계속해서 ECR에 이미지들이 쌓인다면 나중에 요금폭탄을 맞을 수 있으니 주의해주세요.

만든 이미지 업로드하기

docker build . -f ./Dockerfile.dev -t [레포지토리지ARN]

조금전 보았던 ARN 파일을 이용 업로드해줍니다.

클러스터 만들기

ecs-cli up --empty --cluster [클러스터이름] --launch-type FARGATE

ecs-cli를 통해 비어있는 클러스터를 만들어줍니다. 클러스터란 간단히 Docker Instance들의 집합입니다.

웹인터페이스라면…

클러스터 생성을 누르신 후

AWS Fargate를 누른 후 만들어줍니다. VPC와 서브넷을 설정해주셔도 되지만 지금 단계에서는 필요하지는 않습니다.

작업정의 만들기

작업정의란 실행할 도커이미지와 메모리,CPU 그리고 AWS VPC,Subnet등을 미리 정해주는 내용입니다.

ecs-cli compose --project-name [테스크이름] --file docker/humor-docker-compose.yml --region ap-northeast-2 --ecs-params ecs-params.yml create --launch-type FARGATE --create-log-groups

하나하나 옵션별로 설명을 해드리면… project-name은 사용할 작업정의의 이름을 설정해주시고 — file옵션으로 docker-compose 파일을 지정해줍니다.

/////ECS params 파일의 예시
version
: 1
task_definition:
task_role_arn: IAM 권한 ARN
task_execution_role: role
ecs_network_mode: awsvpc
task_size:
mem_limit: 1024
cpu_limit: 512
run_params:
network_configuration:
awsvpc_configuration:
subnets:
- 서브넷아이디
security_groups:
- 보안주소아이디
assign_public_ip: ENABLE

ecs-params란것은 도커에는 없는 옵션들 예를들어 VPC설정 보안그룹 설정등은 AWS 고유의 옵션이기때문에 Docker-compose 문법에는 없는내용입니다. 위 내용을 따로 import하여야지 AWS가 아닌 다른환경 혹은 로컬환경에서 문제 없이 작동할 수 있습니다. 자세한 파라미터는 이곳에서 확인해주세요.

이제 위와같이 명령어를 실행하면 작업정의가 만들어지고 그 작업정의를 Fargate를 통해 실행할 수 있습니다. 참 웹으로 보시는 분들은

새 작업정의를 누르시면
훨씬더 직관적으로 확인할 수 있습니다!

웹 인터페이스를 사용할경우 방금 위에 있던 내용들을 조금 더 쉽게 자동완성!까지 지원되는 상황에서 확인할 수 있습니다. 물론 반복되는 작업이 계속 될수록 따로 쉘스크립트로 만들어두시는 편이 좋습니다.

자 이제 Fargate를 실행해보겠습니다.

일반적으로 Fargate를 Lambda를 통해 실행합니다. API Gateway를 통해 이벤트를 받거나 S3를 통해 이미지를 받거나할경우 이벤트 스트림을 Lambda로 받은 후 람다에서 Fargate를 실행하여 작업을 수행합니다.

람다 함수가 ECS를 Trigger 시킬 권한이 있는지 IAM에서 꼭 확인해주세요.

웹에서 하신다면…

새 작업 실행을 누른 후
조금 전 만들어준 작업정의 그리고 클러스트를 설정한 후 실행해주세요.

--

--

Harry The Great
해리의 유목코딩

Android & IOS Developer 😀 미디움 이외에 스니펫이나 디버그노트로 활용하는 https://www.harrymikoshi.com/ 블로그도 운영하고있습니다.