Amazon Web Services 한국 블로그

EC2 스팟 인스턴스로 Amazon ECS 콘테이너 클러스터 운영하기

Amazon EC2 컨테이너 서비스 (Amazon ECS)가 ECS 콘솔에서 Amazon EC2 스팟 인스턴스에 직접 ECS 클러스터를 시작하는 기능을 지원한다는 것을 알리게 되어 매우 기쁩니다.

스팟 인스턴스는 예비 Amazon EC2 컴퓨팅 용량에 입찰 할 수 있게 합니다. 스팟 인스턴스는 일반적으로 온 디맨드 인스턴스보다 50-90 % 저렴합니다. 스팟 인스턴스로 ECS 클러스터를 운영하면 기존의 컨테이너화 된 워크로드를 실행하는 비용을 줄이거나 동일한 예산을 유지하면서 컴퓨팅 용량을 2 ~ 10 배까지 증가시킬 수 있습니다. 혹은 둘 다 조합 할 수 있습니다!

스팟 인스턴스를 사용하면 인스턴스 시간당 지불 할 가격을 지정합니다. 스팟 인스턴스는 언제든지 당신의 입찰가가 현재 스팟 가격을 초과 할 경우 실행됩니다. 더 높은 스팟 가격으로 인해 인스턴스가 회수 된 경우 인스턴스가 실행된 부분 시간에 대해서는 비용이 청구되지 않습니다.

ECS 콘솔은 스팟 집합을 사용하여 스팟 인스턴스를 배포합니다. 스팟 집합은 최적의 가격으로 컨테이너 어플리케이션에 대해 요청한 목표 용량 (인스턴스 또는 vCPU 개수로 표현)을 배포하려고 시도합니다. 현재 입찰 가격 또는 사용 가능한 용량의 변경으로 인해 스팟 인스턴스가 회수 된 경우에도 스팟 집합은 목표 용량을 유지하려고 시도합니다.

컨테이너는 다수의 스팟 집합이 배포되는 여러 종류의 자원 풀과 잘 들어 맞습니다. 스팟 집합을 사용하면 여러 스팟 인스턴스풀 (인스턴스 유형 및 가용 영역 조합)에 용량을 프로비저닝 할 수 있어 애플리케이션 가용성을 향상시키고 시간이 지남에 따라 집합의 운영 비용을 절감할 수 있습니다.  스팟 집합과 함께 ECS가 제공하는 확장 가능하고 유연한 컨테이너 배치 시스템을 결합하면 컨테이너 작업 부하를 효율적으로 배치하고 비용의 일부만으로 규모에 관계없이 쉽게 클러스터를 관리 할 수 있습니다.

이전에는 스팟 인스턴스에 ECS 클러스터를 배포하는 것이 수동 프로세스였습니다. 이 글에서는 ECS 콘솔에서 새로운 스팟 집합 통합을 사용하여 컨테이너 작업 부하에 대한 고 가용성, 확장성 및 비용 절감 방법을 제시합니다. 또한 AWS CloudFormation을 사용하여 스팟 인스턴스에 자신의 ECS 클러스터를 구축하는 방법을 보여줍니다.

스팟 인스턴스에서 실행되는 ECS 클러스터 만들기
AWS 관리 콘솔을 사용하여 ECS 클러스터를 만들 수 있습니다.

  1. https://console.aws.amazon.com/ecs/에서 Amazon ECS 콘솔을 엽니다.
  2. 탐색 창에서 클러스터를 선택하십시오.
  3. 클러스터 페이지에서 클러스터 생성을 선택하십시오.
  4. 클러스터 이름에 이름을 입력하십시오.
  5. 인스턴스 구성에서 프로비저닝 모델에 대해 스팟을 선택하십시오.

스팟 인스턴스 할당 전략 선택하기
두 가지 가능한 스팟 인스턴스 할당 전략은 다각화와 최저 가격입니다.

스팟 집합에 대해 선택한 할당 전략에 따라 가능한 스팟 인스턴스 풀에서 스팟 집합 요청이 어떻게 수행되는지가 결정됩니다. 다양한 전략을 사용하면 스팟 인스턴스가 모든 풀에 분산됩니다. 가장 낮은 가격 전략을 사용하면 스팟 인스턴스는 요청에 지정된 최저 가격의 풀에서 가져옵니다.

모든 리전의 각 가용 영역 안에 있는 각 인스턴스 유형 (각 인스턴스 패밀리 내의 인스턴스 크기, 예 : c4.4xlarge)은 별도의 용량 풀이므로 별도의 스팟 마켓입니다. 가능한 많은 인스턴스 유형과 가용 영역을 다양화함으로써 스팟 집합의 가용성을 향상시킬 수 있습니다. 또한 시간이 지남에 따라 하나의 풀에서 스팟 가격 상승에 집합이 덜 민감해지도록 됩니다.

https://d2908q01vomqb2.cloudfront.net/1b6453892473a467d07372d45eb05abc2031647a/2017/06/05/06.06-Spot-3.png

스팟 집합에 사용할 최대 6 개의 EC2 인스턴스 유형을 선택할 수 있습니다. 이 예에서는 크기가 xlarge 인 m3, m4, c3, c4, r3 및 r4 인스턴스 유형을 선택했습니다.

https://d2908q01vomqb2.cloudfront.net/1b6453892473a467d07372d45eb05abc2031647a/2017/06/05/06.06-Spot-4.png

인스턴스에 대한 입찰가를 입력해야 합니다. 일반적으로 온 디맨드 인스턴스 가격 또는 그 근처에서의 입찰은 좋은 출발점입니다. 입찰가는 해당 스팟 풀에서 인스턴스 유형에 대해 지불할 최대 가격입니다. 스팟 가격이 입찰가 또는 그 이하인 경우 스팟 가격을 지불합니다. 낮은 입찰가는 낮은 비용을 보장, 높은 입찰가는 중단 가능성을 낮춥니다.

클러스터에 포함할 인스턴스 수를 구성하십시오. 스팟 집합은 요청에 지정된 목표 용량을 충족시키는 데 필요한 스팟 인스턴스 수를 배포하려고 시도합니다. 또한 스팟 집합은 스팟 가격이나 사용 가능한 용량이 변경되어 스팟 인스턴스가 회수되는 경우 대상 용량을 유지하려고 시도합니다.

ECS–optimized AMI가 인스턴스가 배포될 때 사용됩니다.

저장소 및 네트워크 설정을 구성하십시오. 다양화 및 고 가용성을 활성화하려면 여러 가용 영역에서 서브넷을 선택해야합니다. 단일 Spot Fleet에서 동일한 가용 영역에서 여러 서브넷을 선택할 수 없습니다.

ECS 컨테이너 에이전트는 사용자를 대신하여 ECS API 작업을 호출합니다. 에이전트를 실행하는 컨테이너 인스턴스에는 에이전트가 사용자에게 속한 것을 알 수 있도록 서비스에 대한 ecsInstanceRole IAM 정책 및 롤이 필요합니다. ecsInstanceRole이 없는 경우 ECS 콘솔을 사용하여 ecsInstanceRole을 만들 수 있습니다.

스팟 집합을 사용하는 관리형 컴퓨트 환경을 만드는 경우, 스팟 집합에 인스턴스에 대한 입찰, 실행 및 종료 권한을 부여하는 롤을 만들어야 합니다. ECS 콘솔을 사용하여 롤을 만들 수도 있습니다.

여기까지입니다! ECS 콘솔에서 생성을 선택하여 스팟 인스턴스에서 실행되는 새 ECS 클러스터를 시작하십시오.

AWS CloudFormation 사용하여 스팟 인스턴스에 ECS 클러스터 배포
이제 CloudFormation 스택을 쉽게 시작하고 스팟 인스턴스에 ECS 클러스터를 배포하는 방법을 보여주는 참조 아키텍처 AWS CloudFormation 템플릿을 게시했습니다.

CloudFormation 템플릿에는 앞서 언급한 스팟 인스턴스 종료 알림 스크립트뿐만 아니라 신속한 시작을 위한 몇 가지 추가 로깅 및 기타 예제 기능이 포함되어 있습니다. Amazon EC2 스팟 인스턴스 GitHub 레포에서 CloudFormation 템플릿을 찾을 수 있습니다.

시험해보고 당신의 환경에 필요에 맞게 사용자 정의하십시오.

 

Spot Fleet Architecture 종료 처리
스팟 인스턴스를 사용하면 지정한 가격 이상을 절대 지불하지 않습니다. 스팟 가격이 주어진 인스턴스의 입찰 가격을 초과하면 자동으로 종료됩니다.

스팟 인스턴스 중단을 방지하는 가장 좋은 방법은 컨테이너 애플리케이션을 내결함성으로 설계하는 것입니다. 또한 스팟 인스턴스 종료 통지라는 기능을 활용할 수 있습니다. EC2가 스팟 인스턴스를 종료하기 2 분전에 경고를 제공합니다.

이 경고는 인스턴스 메타 데이터의 항목을 사용하여 스팟 인스턴스의 어플리케이션에서 사용할 수 있습니다. 콘솔을 사용하여 스팟 인스턴스에 ECS 클러스터를 배포하면 AWS는 5 초마다 스팟 인스턴스 종료 알림을 확인하는 스크립트를 설치합니다. 통지가 감지되면 스크립트는 컨테이너 인스턴스 상태를 드레이닝으로 즉시 업데이트합니다.

스팟 인스턴스 종료 통지 스크립트의 단순화 된 버전은 다음과 같습니다.

Bash
#!/bin/bash

while sleep 5; do
  if [ -z $(curl -Isf http://169.254.169.254/latest/meta-data/spot/termination-time) ]; then
    /bin/false
  else
    ECS_CLUSTER=$(curl -s http://localhost:51678/v1/metadata | jq .Cluster | tr -d \") CONTAINER_INSTANCE=$(curl -s http://localhost:51678/v1/metadata \ | jq .ContainerInstanceArn | tr -d \")
    aws ecs update-container-instances-state --cluster $ECS_CLUSTER \
      --container-instances $CONTAINER_INSTANCE --status DRAINING
  fi
done

컨테이너 인스턴스를 드레이닝으로 설정하면 ECS는 새 작업이 컨테이너 인스턴스에 배치되지 않도록 합니다. 리소스가 가용한 경우, 교체 서비스 작업이 클러스터의 다른 컨테이너 인스턴스에서 시작됩니다. 컨테이너 인스턴스 드레이닝을 사용하면 클러스터의 작업에 영향을 미치지 않고 클러스터에서 컨테이너 인스턴스를 제거 할 수 있습니다. PENDING 상태에 있는 컨테이너 인스턴스의 서비스 작업은 즉시 중지됩니다.

RUNNING 상태에 있는 컨테이너 인스턴스의 서비스 작업은 서비스의 배치 구성 매개 변수 minimumHealthyPercent 및 maximumPercent에 따라 중지 및 교체됩니다.

스팟 인스턴스에 ECS 실제 작동
고객들이 어떻게 이미 스팟 인스턴스 위에 ECS 클러스터를 운영하고 있는지 알고 싶습니까? Mapbox에 있는 우리 친구들이 그 일을 하고 있습니다.

Mapbox는 맞춤 지도를 디자인하고 게시하기 위한 플랫폼입니다. 이 회사는 ECS를 사용하여 전체 일괄 처리 아키텍처에 전력을 공급하여 일일 1 억 마일이 넘는 센서 데이터를 수집하고 처리하여 지도에 사용합니다. 또한 스팟 인스턴스를 사용하여 ECS에서 일괄 처리 아키텍처를 최적화합니다.

Mapbox 플랫폼은 매달 5,000 개가 넘는 앱과 2 억 명 이상의 사용자에게 서비스를 제공합니다. 백엔드는 ECS에서 실행되므로 하루 13 억 건의 요청을 처리 할 수 있습니다. 그들의 ECS 로의 최근 이전에 대한 자세한 내용을 보려면 최근 블로그 게시물, We Switched to Amazon ECS, and You Won’t Believe What Happened Next를 읽으시기 바랍니다. 그리고 후속 블로그 게시물인 Caches to Cash에서 어떻게 그들의 전체 플랫폼을 스팟 인스턴스에서 운영하면서 EC2 비용을 50-90%이상 절약할 수 있었는지 배워보세요.

결론
스팟 인스턴스를 사용하여 규모가 크고 비용 효율적으로 컨테이너 응용 프로그램을 운영하는 것에 대해 우리만큼 흥분을 느끼시길 바랍니다. 자세한 내용은 다음 페이지를 참조하십시오.

의견이나 제안이 있으시면, 의견 부탁드립니다.

Chad Schmutzer, Solutions Architect Shawn O'Conner, Enterprise Solutions Architect
Chad Schmutzer
Solutions Architect
Shawn O’Connor
Solutions Architect

원문: Powering your Amazon ECS Cluster with Amazon EC2 Spot Instances

본 글은 아마존웹서비스 코리아의 솔루션즈 아키텍트가 국내 고객을 위해 전해 드리는 AWS 활용 기술 팁을 보내드리는 코너로서, 이번 글은 이창수 솔루션즈 아키텍트께서 번역해주셨습니다.