Amazon Web Services 한국 블로그

EC2 Fleet – 한번에 수천 개의 온디맨드 및 스팟 인스턴스 동시 관리 기능 출시

2015년 5월 첫 선을 보인 EC2 스팟 플릿(Spot Feleet)은 정말 멋진 기능입니다. 여러 가지 EC2 인스턴스 유형 및 가용 영역에 걸쳐 스팟 인스턴스 플릿을 시작할 수 있으며 용량을 검색하거나 가격을 모니터링하기 위해 사용자 지정 코드를 작성할 필요도 없습니다.

애플리케이션에 유의미한 단위로 대상 용량(플릿의 크기)을 설정하면 스팟 집합에서 플릿을 생성 및 관리해 줍니다. 고객은 다양한 크기의 스팟 집합을 생성할 수 있습니다. 예를 들어, 금융 서비스 분야의 한 고객은 10개의 서로 다른 EC2 인스턴스 유형에 걸쳐 Monte Carlo 시뮬레이션을 실행하고 있습니다. 이 고객은 수시로 수십만 개의 vCPU에 대해 요청을 생성하며 스팟 집합은 최상의 가격으로 방대한 용량을 이용할 수 있게 해 줍니다.

온디맨드, 예약 및 스팟 단일 호출 EC2 플릿 기능 출시
오늘 AWS에서는 EC2 온디맨드, 예약 및 스팟 인스턴스로 조합된 플릿을 단일 API 호출로 생성할 수 있게 해 주는 새로운 구성 요소로서 EC2 플릿의 스팟 집합에서 처음 선보였던 한 번 설정 후 자동 수행(set-it-and-forget-it) 모델을 확장 및 일반화합니다. 고객이 용량 및 인스턴스에 대한 요구 사항만 알려주면 AWS에서 모든 사항을 처리해 드립니다. AWS에서 필요에 따라 인스턴스를 시작, 관리, 모니터링 및 확대하며 별도의 스캐폴딩 코드는 필요하지 않습니다.

인스턴스, vCPU 또는 애플리케이션 기반 단위로 플릿의 용량을 지정할 수 있으며 어느 정도의 용량을 스팟 인스턴스에 할당할지도 지정할 수 있습니다. 애플리케이션 기반 단위를 사용하면 애플리케이션의 요구 사항에 직접적으로 연계된 방식으로 각 EC2 인스턴스 유형의 상대적 성능을 지정할 수 있습니다. 세 가지 용량 사양 옵션(인스턴스, vCPU 및 애플리케이션 기반 단위)은 모두 일종의 가중치입니다.

이 기능은 여러 방면으로 인스턴스 플릿의 관리를 쉽게 만들어 줄 것이며, 개발팀의 단기적 기능 로드맵도 많은 기대를 불러일으킬 것으로 생각됩니다(이 부분은 뒤에서 추가 설명).

EC2 플릿 사용 방법
이 기능은 상태 비저장 웹 서비스, 빅데이터 클러스터 또는 연속 통합 파이프라인 실행과 같은 다양한 작업에서 다양한 방법으로 사용할 수 있습니다. 오늘은 EC2 플릿을 유전 정보 프로세싱 분야에서 사용하는 방법을 설명해 드리겠지만 이는 리스크 분석, 로그 프로세싱 또는 이미지 렌더링과 같은 워크로드와도 큰 차이가 없습니다. 오늘날의 DNA 염기서열 분석 장치는 매일 수 테라바이트에 이르는 방대한 양의 미가공 데이터를 생산할 수 있으며 이러한 데이터를 유의미한 정보로 적시에 가공하려면 상당한 수준의 프로세싱 성능이 필요합니다. 보조 분석 작업을 신속하게 병렬로 진행할 수 있는 작업자 노드 “그리드”를 배포하는 방법을 보여드리겠습니다.

유전체학 분야의 프로젝트는 EC2가 제공하는 탄력성을 사용하여 수백 또는 수천 개의 서버에 새로운 파이프라인을 실험 및 평가 사용해 볼 수 있습니다. EC2를 사용하면 필요한 수만큼 얼마든지 코어에 액세스할 수 있으며 사용한 부분에 대해서만 비용을 지불합니다. 지금까지는 해당 그리드의 온디맨드 및 예약 인스턴스 부분에 대해 RunInstances API 또는 Auto Scaling 그룹을 사용해야 했습니다.

또한 보조 분석을 강화하기 위해 스팟 인스턴스를 추가하려는 경우, 최상의 가격 성능을 얻으려면 서로 다른 인스턴스 유형의 스팟 집합 또는 다중 스팟 Auto Scaling 그룹을 생성 및 관리해야 했습니다. 마지막으로, 여러 API 및 Auto Scaling 그룹에 대한 조정 결정을 자동화하려면, 그리드의 진행 상태 및 백로그뿐 아니라 최신 스팟 가격을 주기적으로 평가하는 Lambda 함수를 작성하여 Auto Scaling 그룹 및 스팟 집합을 적절히 수정해야 했습니다.

이제는 이 모든 작업을 단일 EC2 플릿으로 대체하여 분석 작업당 적게는 1 USD의 비용으로 유전 정보 분석을 수행할 수 있습니다. 제 그리드에서는 파이프라인의 각 단계에 1개의 vCPU 및 4GiB의 메모리가 필요하므로 vCPU당 4GiB의 메모리를 제공하는 M4 및 M5 인스턴스가 이상적입니다. 각 인스턴스의 vCPU 수에 해당하는 가중치가 적용된 M4 및 M5 인스턴스를 사용하여 플릿을 생성하겠습니다.

  • m4.16xlarge – vCPU 64개, 가중치 = 64
  • m5.24xlarge – vCPU 96개, 가중치 = 96

이 설정은 다음과 같은 모양의 템플릿으로 구현됩니다.

"Overrides": [
{
  "InstanceType": "m4.16xlarge",
  "WeightedCapacity": 64,
},
{
  "InstanceType": "m5.24xlarge",
  "WeightedCapacity": 96,
},
]

기본적으로 EC2 플릿은 스팟 인스턴스에 대한 최신 가격과 온디맨드 인스턴스에 대한 공개 가격을 사용하여 가장 비용 효과적인 인스턴스 유형 및 가용 영역(둘 다 템플릿에 지정되어 있음)을 선택합니다(일치하는 RI가 있는 인스턴스를 지정하는 경우에는 할인 적용). 기본 모드는 가중치를 고려하여 가장 낮은 단가의 인스턴스를 찾습니다. 그러므로 제 그리드의 경우 플릿은 vCPU당 가작 낮은 가격을 제공하는 인스턴스를 찾아줄 것입니다.

이제 vCPU 단위로 용량을 요청하기만 하면 EC2 플릿에서는 제가 정의한 허용 인스턴스 유형만 사용하여 가장 낮은 비용 옵션을 선택해 줍니다. 또한 온디맨드 또는 예약 인스턴스 용량을 사용하여 얼마나 많은 vCPU를 시작할 것인지 그리고 스팟 인스턴스 용량을 사용하여 얼마나 많은 vCPU를 시작할 것인지를 지정할 수 있습니다.

"TargetCapacitySpecification": {
	"TotalTargetCapacity": 2880,
	"OnDemandTargetCapacity": 960,
	"SpotTargetCapacity": 1920,
	"DefaultTargetCapacityType": "Spot"
}

위의 설정은 2880개의 vCPU를 원하며 그 중 960개의 vCPU는 온디맨드, 1920개는 스팟을 사용하겠다는 의미합니다. m5.24xlarge의 vCPU당 온디맨드 가격은 m4.16xlarge의 vCPU당 온디맨드 가격보다 낮으므로 EC2 플릿은 10개의 m5.24xlarge 인스턴스를 시작하여 960 vCPU를 확보할 것입니다. 스팟의 경우 1920개 vCPU를 제공하기 위해 EC2 플릿은 최신 스팟 가격(여기에서도 vCPU당 가격)을 기반으로 30개의 m4.16xlarge 인스턴스 또는 20개의 m5.24xlarges 인스턴스를 선택할 것입니다.

이 모두를 합치면 해당 플릿을 설명하는 하나의 파일(fl1.json)이 완성됩니다.

    "LaunchTemplateConfigs": [
        {
            "LaunchTemplateSpecification": {
                "LaunchTemplateId": "lt-0e8c754449b27161c",
                "Version": "1"
            }
        "Overrides": [
        {
          "InstanceType": "m4.16xlarge",
          "WeightedCapacity": 64,
        },
        {
          "InstanceType": "m5.24xlarge",
          "WeightedCapacity": 96,
        },
      ]
        }
    ],
    "TargetCapacitySpecification": {
        "TotalTargetCapacity": 2880,
        "OnDemandTargetCapacity": 960,
        "SpotTargetCapacity": 1920,
        "DefaultTargetCapacityType": "Spot"
    }
}

이 플릿은 단일 명령으로 시작할 수 있습니다.

$ aws ec2 create-fleet --cli-input-json file://home/ec2-user/fl1.json
{
    "FleetId":"fleet-838cf4e5-fded-4f68-acb5-8c47ee1b248a"
}

전체 플릿이 수초 만에 생성되었으며 10개의 m5.24xlarge 온디맨드 인스턴스, 그리고 최신 스팟 가격이 m4.16xlarge의 경우 vCPU당 1.5¢, m5.24xlarge의 경우 vCPU당 1.6¢이므로 30개의 m4.16xlarge 스팟 인스턴스를 사용하여 구축되었습니다.

이제 그리드가 백로그를 모두 처리했으며 더 이상 추가 스팟 인스턴스가 필요하지 않게 되었다고 가정해 보겠습니다. 이 경우 다음과 같이 플릿 사양의 대상 용량을 변경하여 플릿의 크기를 수정할 수 있습니다.

{         
    "TotalTargetCapacity": 960,
}

960은 방금 요청한 온디맨드 vCPU의 수와 같으므로 플릿을 지정할 때 모든 용량은 온디맨드 용량을 사용하여 제공됩니다.

"TargetCapacitySpecification": {
	"TotalTargetCapacity": 960,
	"OnDemandTargetCapacity": 960,
	"SpotTargetCapacity": 0,
	"DefaultTargetCapacityType": "Spot"
}

플릿이 더 이상 필요하지 않게 되면 다음과 같이 플릿을 삭제하고 인스턴스를 종료할 수 있습니다.

$ aws ec2 delete-fleets --fleet-id fleet-838cf4e5-fded-4f68-acb5-8c47ee1b248a \
  --terminate-instances   
{
    "UnsuccessfulFleetDletetions": [],
    "SuccessfulFleetDeletions": [
        {
            "CurrentFleetState": "deleted_terminating",
            "PreviousFleetState": "active",
            "FleetId": "fleet-838cf4e5-fded-4f68-acb5-8c47ee1b248a"
        }
    ]
}

EC2 플릿에서 일치하는 RI가 있는 인스턴스를 시작할 때 RI 할인이 적용된다는 점을 앞에서 설명해 드린 바 있습니다. 그렇다면 RI 고객이 EC2 플릿을 통해 다른 어떤 혜택을 얻을 수 있는지 알아보겠습니다. M4 인스턴스에 대한 지역적 RI를 보유하고 있다고 가정해 봅니다. 저는 EC2 플릿에서 m5.24xlarge를 제거하고 m4.10xlargem4.16xlarge를 지정할 것입니다. 그러면 EC2 플릿은 그리드를 생성할 때 제가 지정한 크기와 가용 영역에 대한 M4 용량을 찾고 자동으로 이 사용량에 RI 할인을 적용합니다.

향후 로드맵
저희는 EC2 플릿과 EC2 Auto Scaling 그룹을 연결할 계획입니다. 이렇게 하면 상태 확인 및 수명 주기 후크와 같은 EC2 Auto Scaling 기능을 활용하는 동시에 인스턴스 유형 및 스팟, 예약, 온디맨드가 혼합된 단일 플릿을 생성할 수 있습니다. 또한 이러한 통합은 플릿 관리를 위해 EC2 Auto Scaling을 활용하는 Amazon ECS, Amazon EKS, AWS Batch와 같은 서비스에 EC2 플릿 기능을 제공합니다.

정식 출시
EC2 플릿은 지금 모든 퍼블릭 AWS 리전에서 생성 및 사용할 수 있습니다.

Jeff;