Lambda를 사용하여 맞춤 해지 정책 생성 - Amazon EC2 Auto Scaling

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

Lambda를 사용하여 맞춤 해지 정책 생성

Amazon EC2 Auto Scaling은 Auto Scaling 그룹의 크기를 줄일 때(스케일 인이라고 함) 해지 정책을 사용하여 먼저 해지할 인스턴스의 우선순위를 지정합니다. Auto Scaling 그룹은 기본 해지 정책을 사용하지만, 사용자는 자체 해지 정책을 선택하거나 생성할 수 있습니다. 미리 정의된 해지 정책을 선택하는 방법에 대한 자세한 설명은 Amazon EC2 Auto Scaling에 대한 종료 정책을 구성합니다. 섹션을 참조하세요.

이 주제에서는 Amazon EC2 Auto Scaling이 특정 이벤트에 대한 응답으로 호출하는 AWS Lambda 함수를 사용하여 맞춤 해지 정책을 생성하는 방법을 알아봅니다. 생성한 Lambda 함수는 Amazon EC2 Auto Scaling에서 전송한 입력 데이터의 정보를 처리하고 해지할 준비가 된 인스턴스 목록을 반환합니다.

맞춤 해지 정책은 해지되는 인스턴스와 해지 시점을 보다 효과적으로 제어할 수 있습니다. 예컨대, Auto Scaling 그룹이 축소되면 Amazon EC2 Auto Scaling은 중단되면 안 되는 워크로드가 실행 중인지 확인할 수 없습니다. Lambda 함수를 사용하면 해지 요청의 유효성을 검사하고 워크로드가 완료될 때까지 기다린 후 해지를 위해 인스턴스 ID를 Amazon EC2 Auto Scaling에 반환합니다.

입력 데이터

Amazon EC2 Auto Scaling은 축소 이벤트에 대한 JSON 페이로드를 생성하며, 최대 인스턴스 수명 또는 인스턴스 새로 고침 기능으로 인해 인스턴스가 해지되려고 할 때도 이를 수행합니다. 또한 가용 영역에서 그룹을 재조정할 때 시작할 수 있는 축소 이벤트에 대한 JSON 페이로드를 생성합니다.

이 페이로드에는 Amazon EC2 Auto Scaling이 해지하는 데 필요한 용량, 해지를 제안하는 인스턴스 목록 및 해지를 시작한 이벤트에 대한 정보가 포함되어 있습니다.

다음은 페이로드 예입니다.

{ "AutoScalingGroupARN": "arn:aws:autoscaling:us-east-1:<account-id>:autoScalingGroup:d4738357-2d40-4038-ae7e-b00ae0227003:autoScalingGroupName/my-asg", "AutoScalingGroupName": "my-asg", "CapacityToTerminate": [ { "AvailabilityZone": "us-east-1b", "Capacity": 2, "InstanceMarketOption": "on-demand" }, { "AvailabilityZone": "us-east-1b", "Capacity": 1, "InstanceMarketOption": "spot" }, { "AvailabilityZone": "us-east-1c", "Capacity": 3, "InstanceMarketOption": "on-demand" } ], "Instances": [ { "AvailabilityZone": "us-east-1b", "InstanceId": "i-0056faf8da3e1f75d", "InstanceType": "t2.nano", "InstanceMarketOption": "on-demand" }, { "AvailabilityZone": "us-east-1c", "InstanceId": "i-02e1c69383a3ed501", "InstanceType": "t2.nano", "InstanceMarketOption": "on-demand" }, { "AvailabilityZone": "us-east-1c", "InstanceId": "i-036bc44b6092c01c7", "InstanceType": "t2.nano", "InstanceMarketOption": "on-demand" }, ... ], "Cause": "SCALE_IN" }

페이로드에는 Auto Scaling 그룹의 이름, Amazon 리소스 이름(ARN) 및 다음 요소가 포함됩니다.

  • CapacityToTerminate는 지정된 가용 영역에서 해지되도록 설정된 스팟 또는 온디맨드 용량의 양을 지정합니다.

  • InstancesCapacityToTerminate의 정보를 바탕으로 Amazon EC2 Auto Scaling에서 해지를 제안하는 인스턴스를 나타냅니다.

  • Cause는 해지를 야기한 이벤트를 지정합니다(SCALE_IN, INSTANCE_REFRESH, MAX_INSTANCE_LIFETIME 또는 REBALANCE).

다음 정보는 Amazon EC2 Auto Scaling이 입력 데이터에서 Instances를 생성하는 방법의 가장 중요한 요소를 설명합니다.

  • 스케일 인 이벤트 및 인스턴스 새로 고침 기반 해지로 인해 인스턴스가 해지되는 경우에는 가용 영역 간 균형 유지가 우선합니다. 가용 영역 하나의 인스턴스 수가 그룹에서 사용하는 그 외 가용 영역보다 많으면 입력 데이터에는 균형이 맞지 않는 가용 영역의 해지 대상 인스턴스만 포함됩니다. 그룹에서 사용하는 가용 영역이 균형 잡힌 경우, 입력 데이터에는 해당 그룹에 대한 모든 가용 영역의 인스턴스가 포함됩니다.

  • 혼합 인스턴스 정책을 사용하는 경우, 각 구매 옵션에 대해 원하는 백분율을 기준으로 스팟 및 온디맨드 용량을 균형 있게 유지하는 것이 우선합니다. 먼저 둘(스팟 또는 온디맨드) 중 어떤 타입이 해지되어야 하는지 확인합니다. 그런 다음 가용 영역의 균형을 가장 잘 유지하기 위해 어떤 가용 영역 내에서 (식별된 구매 옵션 내) 어떤 인스턴스를 해지할지 파악합니다.

응답 데이터

입력 데이터와 응답 데이터는 함께 작동하여 해지할 인스턴스 목록의 범위를 좁힙니다.

주어진 입력을 사용하면 Lambda 함수의 응답은 다음 예와 같아야 합니다.

{ "InstanceIDs": [ "i-02e1c69383a3ed501", "i-036bc44b6092c01c7", ... ] }

이 응답에서 InstanceIDs는 해지할 준비가 된 인스턴스를 나타냅니다.

또는 해지 준비가 된 다른 인스턴스 세트를 반환하여 입력 데이터의 인스턴스를 재정의할 수 있습니다. Lambda 함수가 호출될 때 해지할 준비가 된 인스턴스가 없으면 인스턴스를 반환하지 않도록 선택할 수도 있습니다.

해지할 준비가 된 인스턴스가 없는 경우, Lambda 함수의 응답은 다음 예와 같아야 합니다.

{ "InstanceIDs": [ ] }

고려 사항

맞춤 해지 정책을 사용하는 경우, 다음 고려 사항에 유의하세요.

  • 응답 데이터에서 인스턴스를 먼저 반환한다고 해서 해당 인스턴스가 해지되는 것은 아닙니다. Lambda 함수를 호출할 때 필요한 수 이상의 인스턴스가 반환되는 경우, Amazon EC2 Auto Scaling은 Auto Scaling 그룹에 대해 지정한 다른 해지 정책을 기준으로 각 인스턴스를 평가합니다. 여러 해지 정책이 있는 경우에는 목록에 있는 그다음 해지 정책을 적용하려고 하고 해지해야 하는 것보다 인스턴스 수가 더 많으면 다음 해지 정책으로 이동합니다. 지정된 다른 해지 정책이 없는 경우, 기본 해지 정책을 사용하여 해지할 인스턴스를 결정합니다.

  • 인스턴스가 반환되지 않거나 Lambda 함수가 시간 초과되면 Amazon EC2 Auto Scaling은 잠시 기다렸다가 함수를 다시 호출합니다. 축소 이벤트의 경우, 그룹의 원하는 용량이 현재 용량보다 작으면 계속 시도합니다. 인스턴스 새로 고침 기반 해지의 경우, 한 시간 동안 계속 시도합니다. 이후 계속해서 인스턴스를 해지하지 못하면 인스턴스 새로 고침 작업에 실패합니다. 최대 인스턴스 수명을 사용하는 경우, Amazon EC2 Auto Scaling은 최대 수명을 초과하는 것으로 식별된 인스턴스를 계속 해지하려고 시도합니다.

  • 함수가 반복적으로 다시 시도되므로 Lambda 함수를 맞춤 해지 정책으로 사용하기 전에 코드에서 영구적인 오류가 있는지 테스트하고 수정해야 합니다.

  • 해지할 자체 인스턴스 목록으로 입력 데이터를 재정의하고 해당 인스턴스를 해지해 가용 영역의 균형이 틀어진 경우, Amazon EC2 Auto Scaling은 가용 영역에 걸쳐 용량을 점차 재조정합니다. 먼저 Lambda 함수를 호출하여 해지 준비가 된 인스턴스가 있는지 확인해 재조정 여부를 결정할 수 있습니다. 해지할 준비가 된 인스턴스가 있으면 먼저 새 인스턴스를 출범합니다. 인스턴스 출범이 완료되면 그룹의 현재 용량이 원하는 용량보다 크다는 사실을 감지하고 축소 이벤트를 시작합니다.

  • 맞춤 해지 정책은 스케일 인 보호를 사용하여 특정 인스턴스가 해지되지 않도록 보호하는 기능에도 영향을 미치지 않습니다. 자세한 설명은 인스턴스 스케일 인 방비 사용 섹션을 참조하세요.

Lambda 함수 생성

Lambda 함수를 생성하여 시작합니다. 따라서 Auto Scaling 그룹의 해지 정책에서 해당 함수의 Amazon 리소스 이름(ARN)을 지정할 수 있습니다.

Lambda 함수를 생성하려면(콘솔)
  1. Lambda 콘솔에서 함수 페이지를 엽니다.

  2. 화면 상단의 탐색 모음에서 Auto Scaling 그룹을 생성할 때 사용한 것과 동일한 지역을 선택합니다.

  3. Create function(함수 생성)Author from scratch(새로 작성)를 차례로 선택합니다.

  4. Basic information(기본 정보)에서 Function name(함수 이름)에 함수 이름을 입력합니다.

  5. Create function(함수 생성)을 선택합니다. 함수의 코드 및 구성으로 돌아갑니다.

  6. 함수가 콘솔에 여전히 열려 있으면 Function code(함수 코드)에서 코드를 편집기에 붙여 넣습니다.

  7. Deploy(배치)를 선택합니다.

  8. 경우에 따라 Versions(버전) 탭을 선택한 다음 Publish new version(새 버전 발행)을 선택하여 Lambda 함수의 게시 버전을 생성합니다. Lambda의 버전 관리에 대한 자세한 설명은 AWS Lambda 개발자 안내서Lambda 함수 버전을 참조하세요.

  9. 버전을 게시하도록 선택한 경우, Lambda 함수의 이 버전과 별칭을 연결하려면 Aliases(별칭) 탭을 선택합니다. Lambda의 별칭에 대한 자세한 설명은 AWS Lambda 개발자 안내서Lambda 함수 별칭을 참조하세요.

  10. 그런 다음 Configuration(구성) 탭을 선택한 다음 Permissions(권한)를 선택합니다.

  11. Resource-based policy(리소스 기반 정책)까지 스크롤한 다음 Add permissions(권한 추가)를 선택합니다. 리소스 기반 정책은 정책에 지정된 보안 주체에 함수를 호출하는 권한을 부여하는 데 사용됩니다. 이 경우, 보안 주체는 Auto Scaling 그룹과 연결된 Amazon EC2 Auto Scaling 서비스 연결 역할입니다.

  12. Policy statement(정책 설명) 섹션에서 권한을 구성합니다.

    1. AWS 계정를 선택합니다.

    2. Principal(보안 주체)에 호출 서비스 연결 역할의 ARN 입력합니다(예: arn:aws:iam::<aws-account-id>:role/aws-service-role/autoscaling.amazonaws.com/AWSServiceRoleForAutoScaling).

    3. [액션] 에서 lambda:를 선택합니다. InvokeFunction

    4. Statement ID(설명 ID)에 고유한 설명 ID를 입력합니다(예: AllowInvokeByAutoScaling).

    5. 저장을 선택합니다.

  13. 이 지침을 따른 후에는 다음 단계로 Auto Scaling 그룹의 해지 정책에서 함수의 ARN 지정합니다. 자세한 정보는 Auto Scaling 그룹의 종료 정책 변경을 참조하세요.

참고

Lambda 함수 개발을 위한 참조로 사용할 수 있는 예제는 Amazon EC2 Auto Scaling용 GitHub 리포지토리를 참조하십시오.

제한 사항

  • Auto Scaling 그룹에 대한 해지 정책에는 Lambda 함수를 하나만 지정할 수 있습니다. 해지 정책이 여러 개 지정된 경우, Lambda 함수를 먼저 지정해야 합니다.

  • 정규화되지 않은 ARN(접미사 제외) 또는 버전 또는 별칭이 접미사로 있는, 정규화된 ARN을 사용하여 Lambda 함수를 참조할 수 있습니다. 정규화되지 않은 ARN이 사용되는 경우(예: function:my-function) 게시되지 않은 함수 버전에서 리소스 기반 정책을 생성해야 합니다. 정규화된 ARN이 사용되는 경우(예: function:my-function:1 또는 function:my-function:prod) 게시된 특정 함수 버전에서 리소스 기반 정책을 생성해야 합니다.

  • 접미사가 $LATEST인 정규화된 ARN은 사용할 수 없습니다. 접미사가 $LATEST인 정규화된 ARN 참조하는 맞춤 해지 정책을 추가하려고 하면 오류가 발생합니다.

  • 입력 데이터에 제공되는 인스턴스 수는 30,000개로 제한됩니다. 해지할 수 있는 인스턴스가 30,000개 이상인 경우, 입력 데이터에는 최대 인스턴스 수가 반환됨을 나타내는 "HasMoreInstances": true가 포함됩니다.

  • Lambda 함수의 최대 실행 시간은 2초(2,000밀리초)입니다. 예상 실행 시간에 근거하여 Lambda 함수의 제한 시간 값을 설정하는 것이 가장 좋습니다. Lambda 함수의 기본 제한 시간은 3초이지만 이 시간은 줄일 수 있습니다.

  • 런타임이 2초 제한을 초과하는 경우 런타임이 이 임계값 아래로 떨어질 때까지 모든 확장 작업이 보류됩니다. 런타임이 지속적으로 더 긴 Lambda 함수의 경우, 후속 Lambda 호출 중에 결과를 검색할 수 있는 결과를 캐싱하는 등 런타임을 줄이는 방법을 찾으십시오.