용량 재분배를 사용하여 Amazon EC2 스팟 중단 처리 - Amazon EC2 Auto Scaling

용량 재분배를 사용하여 Amazon EC2 스팟 중단 처리

스팟 인스턴스의 가용성에 영향을 주는 변경 사항을 모니터링하고 이에 자동으로 대응하도록 Amazon EC2 Auto Scaling을 구성할 수 있습니다. 용량 리밸런싱을 사용하면 실행 중인 인스턴스가 Amazon EC2에 의해 중단되기 전에 미리 새 스팟 인스턴스로 플릿을 보강할 수 있으므로 워크로드 가용성을 유지하는 데 도움이 됩니다.

작동 방식

용량 재분배의 목표는 중단 없이 워크로드를 계속 처리하는 것입니다. 스팟 인스턴스가 중단될 위험이 높아지면 Amazon EC2 스팟 서비스는 Amazon EC2 Auto Scaling에 EC2 인스턴스 재분배 권장 사항을 알립니다.

Auto Scaling 그룹에 대해 용량 재분배를 활성화하면 Amazon EC2 Auto Scaling은 재분배 권장 사항을 받은 그룹의 스팟 인스턴스를 사전에 대체하려고 합니다. 이는 중단 위험이 높지 않은 새로운 스팟 인스턴스로 워크로드를 재분배할 수 있는 기회를 제공합니다. 기존 인스턴스가 중단되기 전에 Amazon EC2 Auto Scaling이 새 스팟 인스턴스를 시작하는 동안 워크로드는 계속 작업을 처리할 수 있습니다.

수명 주기 후크를 사용하여 인스턴스가 종료되기 전에 인스턴스에 대한 사용자 지정 작업을 수행할 수도 있습니다.

EC2 인스턴스 재분배 권고에 대한 자세한 내용은 Amazon EC2 Linux 인스턴스용 사용 설명서EC2 인스턴스 재분배 권고를 참조하세요.

용량 재분배 기능에 대한 자세한 내용 및 시연은 AWS Compute 블로그의 블로그 게시물 Proactively manage Spot Instance lifecycle using the new Capacity Rebalancing feature for EC2 Auto Scaling(EC2 Auto Scaling에 새로운 용량 재분배 기능을 사용하여 스팟 인스턴스 수명 주기를 사전 예방적으로 관리)을 참조하세요.

참고

용량 재분배가 비활성화된 경우 Amazon EC2 스팟 서비스가 인스턴스를 중단하고 상태 확인에 실패할 때까지 Amazon EC2 Auto Scaling은 스팟 인스턴스를 대체하지 않습니다. 인스턴스를 중단하기 전에 Amazon EC2는 항상 EC2 인스턴스 재분배 권장 사항과 스팟 인스턴스 중단 2분 알림을 둘 다 제공합니다.

용량 재분배 활성화

언제든지 용량 재분배를 활성화 또는 비활성화할 수 있습니다.

고려 사항

이 구성에는 다음 고려이 적용됩니다.

  • 여러 인스턴스 유형을 사용하도록 Auto Scaling 그룹을 구성하는 것이 좋습니다. 이렇게 하면 여러 인스턴스 유형 및 구매 옵션이 포함된 Auto Scaling 그룹에서 설명하는 것처럼 각 가용 영역 내의 다양한 스팟 인스턴스 풀의 인스턴스를 유연하게 시작할 수 있습니다.

  • lowest-price 할당 전략을 사용하는 경우 대체 스팟 인스턴스가 중단될 위험이 높아질 수 있습니다. 이는 시작 직후에 대체 스팟 인스턴스가 중단될 수 있더라도 해당 순간에 사용 가능한 용량이 있는 최저가의 풀에서 인스턴스를 항상 시작하기 때문입니다. 중단 위험이 높아지는 것을 피하기 위해 lowest-price 할당 전략을 사용하지 않는 것이 좋으며 대신 capacity-optimized 또는 capacity-optimized-prioritized 할당 전략을 권장합니다. 이러한 전략은 가장 최적의 스팟 용량 풀에서 교체 스팟 인스턴스를 시작하여 가까운 시일 내에 중단될 가능성을 줄이는 것을 목표로 합니다.

  • 가능하면 리전 내 모든 가용 영역에서 Auto Scaling 그룹을 생성해야 합니다. 이러한 방식으로 Amazon EC2 Auto Scaling은 각 가용 영역에서 사용 가능한 용량을 확인할 수 있습니다. 하나의 가용 영역에서 시작에 실패하는 경우 Amazon EC2 Auto Scaling은 지정된 가용 영역에서 성공할 때까지 스팟 인스턴스를 계속 시작하려고 시도합니다.

  • Amazon EC2 Auto Scaling은 용량 재분배를 사용하여 다음과 같은 방식으로 작동합니다.

    새 인스턴스를 시작할 때 Amazon EC2 Auto Scaling은 새 인스턴스가 상태 확인을 통과할 때까지 기다렸다가 이전 인스턴스를 종료합니다. 둘 이상의 인스턴스를 대체하는 경우 새 인스턴스가 시작되어 상태 확인을 통과하면 각각의 이전 인스턴스가 종료되기 시작합니다. Amazon EC2 Auto Scaling에서는 이전 인스턴스 종료 전에 새 인스턴스를 시작하려고 하므로 지정된 최대 용량에 도달하거나 이에 근접하면 재분배 활동을 지연시키거나 완전히 중지할 수 있습니다. 이 문제를 피하기 위해 Amazon EC2 Auto Scaling은 재분배 활동 중에 그룹의 지정된 최대 용량을 일시적으로 초과할 수 있습니다.

    • 새 인스턴스가 시작에 실패했거나 시작되었지만 상태 확인에 실패하는 경우 Amazon EC2 Auto Scaling은 계속해서 인스턴스를 다시 시작하려고 시도합니다. 새 인스턴스를 시작하려고 시도하는 동안 이전 인스턴스는 결국 중단되고 강제로 종료됩니다.

    • 크기 조정 활동이 진행 중이고 Auto Scaling 그룹이 원하는 새 용량 미만일 경우 Amazon EC2 Auto Scaling은 이전 인스턴스를 종료하기 전에 먼저 확장합니다.

  • 용량 재분배를 활성화한 경우 Amazon EC2 Auto Scaling이 인스턴스를 종료하기 전에 용량 재분배 알림을 수신하는 인스턴스 내에서 애플리케이션의 정상적인 종료를 시도하도록 Auto Scaling 그룹의 종료 수명 주기 후크를 구성할 수 있습니다. 수명 주기 후크를 구성하지 않으면 Amazon EC2 Auto Scaling은 새 인스턴스가 상태 확인을 통과하자마자 이전 인스턴스를 종료하기 시작합니다.

  • 애플리케이션은 스팟 인스턴스가 조기에 중단될 가능성에 대처할 수 있어야 합니다. 예를 들어, 인스턴스가 종료되기 시작하면 Amazon EC2 Auto Scaling은 인스턴스가 종료될 때까지 기다립니다. Auto Scaling 그룹이 Elastic Load Balancing 로드 밸런서 뒤에 있는 경우 Amazon EC2 Auto Scaling은 인스턴스가 로드 밸런서에서 등록을 취소할 때까지 기다렸다가 종료 수명 주기 후크를 호출합니다(구성된 경우). 인스턴스 등록을 취소하고 수명 주기 작업을 완료하는 데 시간이 너무 오래 걸리면 Amazon EC2 Auto Scaling이 인스턴스가 종료되기를 기다리는 동안 인스턴스가 중단될 수 있습니다.

  • 또한 Amazon EC2에서 항상 스팟 인스턴스 중단 2분 전 알림보다 먼저 리밸런싱 권고 신호를 전송할 수 있는 것은 아닙니다. 일부 경우에는 리밸런싱 권고 신호가 중단 2분 전 알림과 함께 도착할 수도 있습니다.

  • 인스턴스가 최종 2분 중단 알림을 받는 경우 Amazon EC2 Auto Scaling은 종료 수명 주기 후크를 호출하고 즉시 대체를 시작합니다.

용량 재분배 활성화(콘솔)

Auto Scaling 그룹을 생성하거나 업데이트할 때 용량 재분배를 사용하거나 사용하지 않도록 설정할 수 있습니다.

새 Auto Scaling 그룹에 대해 용량 재분배를 활성화하려면

  1. https://console.aws.amazon.com/ec2autoscaling/에서 Amazon EC2 Auto Scaling 콘솔을 엽니다.

  2. Auto Scaling 그룹 생성을 선택합니다.

  3. 1단계에서 Auto Scaling 그룹의 이름을 입력하고 시작 템플릿을 선택한 후 다음(Next)을 선택하여 다음 단계로 진행합니다.

  4. 2단계: 인스턴스 시작 옵션 선택(Step 2: Choose instance launch options)네트워크(Network)에서 원하는 옵션을 선택합니다.

  5. 인스턴스 유형 요구 사항(Instance type requirements)에서 시작할 수 있는 인스턴스 유형, 인스턴스 구매 옵션, 스팟 및 온디맨드 인스턴스에 대한 할당 전략을 포함하여 혼합 인스턴스 그룹을 생성하기 위한 설정을 선택합니다. 기본적으로 이러한 설정은 구성되어 있지 않습니다. 이러한 설정을 구성하려면 시작 템플릿 재정의(Override launch template)를 선택해야 합니다. 혼합 인스턴스 그룹 생성에 대한 자세한 내용은 여러 인스턴스 유형 및 구매 옵션이 포함된 Auto Scaling 그룹 섹션을 참조하세요.

  6. 페이지 하단의 할당 전략(Allocation strategies) 섹션에서 스팟 할당 전략을 선택합니다. 용량 재분배(Capacity rebalance) 확인란을 선택하거나 선택 취소하여 용량 재분배를 활성화하거나 비활성화합니다. 인스턴스 구매 옵션(Instance purchase options) 섹션에서 스팟 인스턴스로 시작할 Auto Scaling 그룹의 백분율을 지정한 경우에만 이 옵션이 표시됩니다.

  7. Auto Scaling 그룹을 생성합니다.

기존 Auto Scaling 그룹에 대해 용량 재분배를 활성화하려면

  1. https://console.aws.amazon.com/ec2autoscaling/에서 Amazon EC2 Auto Scaling 콘솔을 엽니다.

  2. Auto Scaling 그룹 옆의 확인란을 선택합니다.

    Auto Scaling 그룹(Auto Scaling groups) 페이지 하단에 분할 창이 열립니다.

  3. 세부 정보(Details) 탭에서 할당 전략(Allocation strategies), 편집(Edit)을 선택합니다.

  4. 할당 전략(Allocation strategies) 섹션에서 다음을 수행합니다.

    • 용량 재분배를 활성화하려면 Capacity rebalance(용량 재분배) 확인란을 선택합니다.

    • 용량 재분배를 비활성화하려면 Capacity rebalance(용량 재분배) 확인란을 선택 취소합니다.

  5. Update(업데이트)를 선택합니다.

용량 재분배 활성화(AWS CLI)

다음 예제에서는 AWS CLI을 사용하여 용량 재분배를 활성화 및 비활성화하는 방법을 보여줍니다.

다음 파라미터와 함께 create-auto-scaling-group 또는 update-auto-scaling-group 명령을 사용합니다.

  • --capacity-rebalance / --no-capacity-rebalance — 용량 재조정이 활성화되었는지를 나타내는 부울 값입니다.

create-auto-scaling-group 명령을 호출하려면 Auto Scaling 그룹에 사용하도록 구성된 시작 템플릿의 이름이 필요합니다. 자세한 내용은 Auto Scaling 그룹에 대한 시작 템플릿 생성 섹션을 참조하세요.

참고

다음 절차는 JSON 또는 YAML로 형식의 구성 파일을 사용하는 방법을 보여줍니다. AWS CLI 버전 1을 사용하는 경우 JSON 형식의 구성 파일을 지정해야 합니다. AWS CLI 버전 2를 사용하는 경우 YAML 또는 JSON 형식의 구성 파일을 지정할 수 있습니다.

새 Auto Scaling 그룹을 생성하고 구성하려면

  • 다음 create-auto-scaling-group 명령을 사용하여 JSON 파일을 Auto Scaling 그룹의 유일한 파라미터로 참조하는 Auto Scaling 그룹을 생성하고 용량 재분배를 활성화할 수 있습니다.

    aws autoscaling create-auto-scaling-group --cli-input-json file://~/config.json

    혼합 인스턴스 정책을 지정하는 CLI 구성 파일이 아직 없는 경우에서 하나 생성합니다.

    구성 파일의 최상위 JSON 객체에 다음 줄을 추가합니다.

    { "CapacityRebalance": true }

    다음은 예제 config.json 파일입니다.

    { "AutoScalingGroupName": "my-asg", "DesiredCapacity": 12, "MinSize": 12, "MaxSize": 15, "CapacityRebalance": true, "MixedInstancesPolicy": { "InstancesDistribution": { "OnDemandBaseCapacity": 0, "OnDemandPercentageAboveBaseCapacity": 25, "SpotAllocationStrategy": "capacity-optimized" }, "LaunchTemplate": { "LaunchTemplateSpecification": { "LaunchTemplateName": "my-launch-template", "Version": "$Default" }, "Overrides": [ { "InstanceType": "c5.large" }, { "InstanceType": "c5a.large" }, { "InstanceType": "m5.large" }, { "InstanceType": "m5a.large" }, { "InstanceType": "c4.large" }, { "InstanceType": "m4.large" }, { "InstanceType": "c3.large" }, { "InstanceType": "m3.large" } ] } }, "TargetGroupARNs": "arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/my-alb-target-group/943f017f100becff", "VPCZoneIdentifier": "subnet-5ea0c127,subnet-6194ea3b,subnet-c934b782" }

새 Auto Scaling 그룹을 생성하고 구성하려면

  • 다음 create-auto-scaling-group 명령을 사용하여 YAML 파일을 Auto Scaling 그룹의 유일한 파라미터로 참조하는 새 Auto Scaling 그룹을 생성합니다.

    aws autoscaling create-auto-scaling-group --cli-input-yaml file://~/config.yaml

    YAML로 형식이 지정된 구성 파일에 다음 줄을 추가합니다.

    CapacityRebalance: true

    다음은 예제 config.yaml 파일입니다.

    --- AutoScalingGroupName: my-asg DesiredCapacity: 12 MinSize: 12 MaxSize: 15 CapacityRebalance: true MixedInstancesPolicy: InstancesDistribution: OnDemandBaseCapacity: 0 OnDemandPercentageAboveBaseCapacity: 25 SpotAllocationStrategy: capacity-optimized LaunchTemplate: LaunchTemplateSpecification: LaunchTemplateName: my-launch-template Version: $Default Overrides: - InstanceType: c5.large - InstanceType: c5a.large - InstanceType: m5.large - InstanceType: m5a.large - InstanceType: c4.large - InstanceType: m4.large - InstanceType: c3.large - InstanceType: m3.large TargetGroupARNs: - arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/my-alb-target-group/943f017f100becff VPCZoneIdentifier: subnet-5ea0c127,subnet-6194ea3b,subnet-c934b782

기존 Auto Scaling 그룹에 대해 용량 재분배를 활성화하려면

  • 다음 update-auto-scaling-group 명령을 사용하여 용량 재분배를 사용하도록 설정합니다.

    aws autoscaling update-auto-scaling-group --auto-scaling-group-name my-asg \ --capacity-rebalance

기존 Auto Scaling 그룹에 대해 용량 재분배가 활성화되었는지 확인하려면

  • 다음 describe-auto-scaling-groups 명령을 사용하여 용량 재분배가 활성화되어 있는지 확인하고 세부 정보를 볼 수 있습니다.

    aws autoscaling describe-auto-scaling-groups --auto-scaling-group-name my-asg

    다음은 응답의 예입니다.

    { "AutoScalingGroups": [ { "AutoScalingGroupName": "my-asg", "AutoScalingGroupARN": "arn", ... "CapacityRebalance": true } ] }

용량 재분배를 비활성화하려면

--no-capacity-rebalance 옵션과 함께 update-auto-scaling-group 명령을 사용하여 용량 재분배를 비활성화할 수 있습니다.

aws autoscaling update-auto-scaling-group --auto-scaling-group-name my-asg \ --no-capacity-rebalance

종료 수명 주기 후크 추가

필요에 따라 용량 재분배를 활성화할 때 종료 수명 주기 후크를 구성합니다. 수명 주기 후크를 사용하면 인스턴스가 종료되기 전에 인스턴스에 대한 사용자 정의 작업을 수행할 수 있습니다.

다음은 종료 수명 주기 후크를 사용할 수 있는 몇 가지 이유입니다.

  • Amazon Simple Storage Service(Amazon S3)에 시스템 또는 애플리케이션 로그를 업로드하려면

  • Amazon SQS 작업자를 정상적으로 종료하는 경우

  • 도메인 이름 시스템(DNS)에서 등록 취소를 완료하려면

종료 수명 주기 후크가 없는 경우에는 다음 절차에 따라 하나 생성하세요.

종료 수명 주기 후크를 추가하려면

  1. https://console.aws.amazon.com/ec2autoscaling/에서 Amazon EC2 Auto Scaling 콘솔을 엽니다.

  2. Auto Scaling 그룹 옆의 확인란을 선택합니다.

    Auto Scaling 그룹(Auto Scaling groups) 페이지 하단에 분할 창이 열립니다.

  3. 인스턴스 관리 탭의 Lifecycle hooks(수명 주기 후크)에서 Create lifecycle hook(수명 주기 후크 생성)를 선택합니다.

  4. 수명 주기 후크를 정의하려면 다음을 수행합니다.

    1. Lifecycle hook name(수명 주기 후크 이름)에 수명 주기 후크의 이름을 지정합니다.

    2. Lifecycle transition(수명 주기 전환)에서 Instance terminate(인스턴스 종료)를 선택합니다.

    3. Heartbeat timeout(하트비트 제한 시간)에서 수명 주기 작업을 완료하거나 제한 시간이 종료될 때까지 시간(초)을 지정합니다. 애플리케이션을 종료하는 데 필요한 시간에 따라 30초에서 120초 사이의 값을 사용하는 것이 좋습니다.

    4. 기본 결과(Default result)에 제한 시간이 경과하거나 예기치 못한 오류가 발생할 때 Auto Scaling 그룹에서 수행하는 작업을 지정합니다. 중단(ABANDON)계속(CONTINUE) 둘 다 인스턴스를 종료할 수 있습니다.

      • 계속(CONTINUE)을 선택하면 종료 전에 Auto Scaling 그룹이 남아 있는 모든 작업(예: 다른 수명 주기 후크)을 진행할 수 있습니다.

      • 중단(ABANDON)을 선택하면 Auto Scaling 그룹이 인스턴스를 즉시 종료합니다.

    5. (선택 사항) 알림 메타데이터(Notification Metadata)에 Amazon EC2 Auto Scaling이 AWS Lambda 함수 또는 6단계에서 구성하는 다른 알림 대상으로 메시지를 전송할 때마다 포함할 추가 정보를 지정합니다.

  5. 생성(Create)을 선택합니다.

  6. (선택 사항) Lambda와 같은 서비스를 사용하여 인스턴스 종료 전에 사용자 지정 작업을 수행하려면 자습서: Lambda 함수를 호출하는 수명 주기 후크 구성 섹션을 참조하세요. 이 자습서는 수명 주기 후크에 대한 Lambda 함수를 설정하는 방법을 이해하는 데 도움이 됩니다. 그러지 않고 EC2 인스턴스에서 작업을 자동으로 실행하도록 하려면 종료 스크립트를 실행하도록 인스턴스를 구성해야 합니다. 전체 종료 시퀀스를 1~2분 내에 완료하도록 스크립팅하여 인스턴스 종료 전에 작업을 완료할 충분한 시간을 확보하는 것이 좋습니다.

수명 주기 후크 작업의 다양한 측면을 이해하는 데 도움이 되는 자세한 내용은 Amazon EC2 Auto Scaling 수명 주기 후크 섹션을 참조하세요.