Amazon Web Services 한국 블로그
[AWS Hero 특집] Docker, Amazon ECS 및 Spot Fleet의 환상적인 서비스 조합
AWS 컨테이너 히어로, Tung Nguyen 가 기고한 글입니다. Tung 는 AWS 클라우드 인프라 및 소프트웨어에 초점을 맞춘 컨설팅 회사, BoltOps의 설립자 겸 대표입니다. BoltOps Nuts and Bolts 블로그에도 컨테이너 관련 글을 올립니다.
Amazon C2 스팟(Spot) 인스턴스를 사용하면 많은 할인을 받으면서 여분의 컴퓨팅 용량을 사용할 수 있습니다. AWS에서 워크로드를 실행하는 가장 좋은 방법 중 하나는, 스팟 인스턴스에서 Amazon ECS를 사용하는 것입니다. 스팟 인스턴스를 사용하면 Amazon EC2 인스턴스에서 비용을 50–90% 절감할 수 있습니다. 아마 블랙 프라이데이의 할인 행사처럼 특별한 기회가 있다면 모두 반길 것 같지요? 하지만 대부분의 사람들은 스팟 인스턴스에 대해 잘 알지 못하거나 주저하는 경향이 있습니다. 그 이유는 스팟에 대한 몇 가지 오해 때문입니다.
스팟에 대한 오해
AWS에서는 스팟 모델에서 언제라도 인스턴스를 제거할 수 있습니다. 유지 관리 업그레이드, 해당 인스턴스 유형에 대한 높은 수요, 이전 인스턴스 유형 또는 기타 여러 가지 이유로 인스턴스가 제거될 수 있습니다.
그래서 사람들이 스팟에 대해 바로 지적하는 첫 번째 오해와 망설임은 다음과 같습니다.
언제라도 인스턴스가 대체될 수 있다는 것은 무슨 뜻입니까? 맙소사, 인스턴스를 시작하고 20분 안에 인스턴스가 종료된다는 뜻인가 보군요.
저도 처음에는 그렇게 생각했습니다. 실제 스팟 인스턴스 어드바이저 웹 사이트에서는 다음과 같이 설명합니다.
모든 리전과 인스턴스 유형에서 평균 중단 빈도는 5% 미만입니다.
개인적으로 제 사용량을 보면 여러 주 동안 인스턴스 실행을 확인할 수 있습니다. 증거가 필요하신가요? 다음은 프로덕션 클러스터 중 하나에 있는 인스턴스의 스크린샷입니다.
기간이 궁금하시다면….
네, 연속해서 228일입니다. 이처럼 가동 시간이 길지 않을 수도 있지만, 보통 스팟 인스턴스가 시작된 후 20분 안에 중단된다는 오해는 반증해줍니다.
스팟 플릿(Spot Fleet)
스팟 인스턴스에서는 특정 가용 영역의 특정 인스턴스에 대해 단일 요청을 생성합니다. 이때 단일 인스턴스 유형을 요청하는 대신, 스팟 플릿을 사용하면 요구 사항을 충족하는 다양한 인스턴스 유형을 요청할 수 있습니다. 워크로드가 많은 경우 CPU와 RAM이 충분히 근접하면 인스턴스 유형이 많아도 괜찮습니다.
그래서 스팟 플릿을 사용하여 여러 영역과 인스턴스 유형에서 인스턴스 비용을 분산시킬 수 있습니다. 스팟 플릿을 사용하면 이미 언급한 낮은 중단 비율 외에도, 시스템을 크게 강화할 수 있습니다. 또한 온디맨드 클러스터를 실행하여 추가 보호 용량을 제공할 수도 있습니다.
ECS 및 스팟 플릿: 최상의 조합
굉장히 낮은 비용으로 확장 가능한 시스템을 제공한다는 점에서, 워크로드를 실행할 때 제가 제일 좋아하는 방법 중 하나입니다. 이 기술들은 서로를 위해 구축된 것이 아닌가 생각할 정도로 최상의 조합을 이룹니다.
- Docker는 배포할 일관된 표준 바이너리 형식을 제공합니다. 하나의 Docker 환경에서 작동하면 다른 환경에서도 작동합니다. 컨테이너는 몇 초만에 내릴 수 있으므로 스팟 인스턴스에 가장 적합하며, 이 경우 중단 중에도 컨테이너를 이동할 수 있습니다.
- ECS는 Docker 컨테이너를 실행할 뛰어난 에코시스템을 제공합니다. ECS는 연결 인스턴스 드레이닝이라는 기능을 지원합니다. 이 기능을 사용하면 Docker 컨테이너를 다른 EC2 인스턴스로 재배치하도록 ECS에 알릴 수 있습니다.
- 스팟 인스턴스는 2분 경고 신호를 통해 인스턴스가 종료될 예정임을 알릴 수 있습니다.
스팟 플릿 외에도, ECS 클러스터 구축에 꼭 필요한 기능입니다. 2분 경고를 사용하여 ECS 연결 드레이닝을 호출합니다. 그러면 ECS는 플릿의 다른 인스턴스로 컨테이너를 자동 이동합니다.
ecs-ec2-spot-fleet는 이를 수행하는 CloudFormation 템플릿입니다. 스팟 플릿을 이해하는 데 초점을 맞추고 있기 때문에 VPC는 단순하게 설계되었습니다.
템플릿에서는 스팟 플릿에서 각각 2GB 및 4GB RAM의 두 개 인스턴스 유형인 t3.small과 t3.medium을 지정합니다. 템플릿에서는 t3.medium 가중치를 t3.small의 2배로 지정합니다. 특히, 스팟 플릿 TargetCapacity 값은 ECS 클러스터에 대해 프로비저닝할 전체 RAM과 같습니다. 그래서 8을 지정하면 스팟 플릿 서비스는 t3.small 인스턴스 4개 또는 t3.medium 인스턴스 2개를 프로비저닝할 수 있습니다. 클러스터는 최대 8GB의 RAM을 추가합니다.
스택 실행을 시작하기 위해 다음 명령을 실행합니다.
aws cloudformation create-stack --stack-name ecs-spot-demo --template-body file://ecs-spot-demo.yml --capabilities CAPABILITY_IAM
CloudFormation 스택은 컨테이너 인스턴스를 시작하고, 기본적으로 ECS 클러스터
에 development
라는 이름으로 인스턴스를 등록합니다. EcsCluster 파라미터로 이 인스턴스를 변경할 수 있습니다. 파라미터에 대한 자세한 내용은 README 및 템플릿 소스를 참조하십시오.
애플리케이션을 배포할 때 배포 도구는 ECS 클러스터 자체를 생성합니다. 다음은 EC2 콘솔에서 스팟 인스턴스입니다.
데모 앱 배포
스팟 클러스터를 가동한 후 여기에 데모 앱을 배포할 수 있습니다. 이 작업에 유용한 Ufo라는 도구를 작성했습니다.
- Docker 이미지를 구축합니다.
- ECS 작업 정의를 등록합니다.
- ECS 서비스를 등록 및 배포합니다.
- 로드 밸런서를 생성합니다.
Docker는 전제 조건으로 설치되어 있어야 합니다. 먼저 ECR 리포지토리를 생성하고 몇 가지 변수를 설정합니다.
ECR_REPO=$(aws ecr create-repository --repository-name demo/sinatra | jq -r '.repository.repositoryUri')
VPC_ID=$(aws ec2 describe-vpcs --filters Name=tag:Name,Values="demo vpc" | jq -r '.Vpcs[].VpcId')
이제 데모 리포지토리를 복제하고 Ufo를 사용하여 ECS에 샘플 앱을 배포할 준비가 되었습니다.
git clone https://github.com/tongueroo/demo-ufo.git demo
cd demo
ufo init --image $ECR_REPO --vpc-id $VPC_ID
ufo current --service demo-web
ufo ship # deploys to ECS on the Spot Fleet cluster
다음은 실행 중인 ECS 서비스입니다.
ufo ps
를 사용하거나 콘솔에서 Elastic Load Balancing 엔드포인트를 가져옵니다.
$ ufo ps
Elb: develop-Elb-12LHJWU4TH3Q8-597605736.us-west-2.elb.amazonaws.com
$
이제 curl에서 테스트합니다.
$ curl develop-Elb-12LHJWU4TH3Q8-597605736.us-west-2.elb.amazonaws.com
42
애플리케이션은 “42”를 반환합니다. 이 값은 수명을 나타냅니다. 이게 다입니다! 이제 스팟 플릿 인스턴스를 사용하여 ECS에서 애플리케이션을 실행합니다.
결론
스팟을 사용할 경우 또 다른 한 가지 장점은, 고가용성 측면에서 아키텍처를 생각하게 장려한다는 점입니다. 스팟 “제약 조건”에 따르면, 시스템이 자체 복구되도록 시스템을 설계하려면 밤에 더 많이 쉬어야 한다는 반어적인 결론이 나옵니다.
앞으로 이 게시글이 스팟 인스턴스에서 ECS를 실행하는 기회로 이어지기를 바랍니다. 이 방법은 고객을 위해, 고유한 프로덕션 시스템에서 BoltOps를 실행하는 시스템의 핵심이기도 합니다. 오늘 이러한 설정을 소개하게 되어서 정말 기쁩니다. 스팟 아키텍처에 관심이 있으시다면 BoltOps에서 제게 문의해주십시오.
마지막으로, Auto Scaling 그룹은 여러 인스턴스 유형과 구매 옵션 실행도 지원합니다. Jeff 씨는 그의 게시글에서 가중치 지원이 향후 릴리스에 예정되었다고 언급했습니다. 이 기능을 사용하면 ECS에서 스팟 사용이 더욱 간소화되므로 정말로 반가운 소식입니다.
– Tung Nguyen, AWS Container Hero