Amazon EC2 Auto Scaling
사용 설명서

Amazon EC2 Auto Scaling 수명 주기 후크

수명 주기 후크를 사용하면 Auto Scaling 그룹에서 인스턴스를 시작하거나 종료할 때 인스턴스를 일시 중지하여 사용자 지정 작업을 수행할 수 있습니다. 인스턴스가 일시 중지되는 경우, complete-lifecycle-action CLI 명령이나 CompleteLifecycleAction API 작업을 사용하여 수명 주기 작업을 완료할 때까지 혹은 제한 시간이 끝날 때까지(기본 1시간) 대기 상태로 유지됩니다.

예를 들어, 새로 시작된 인스턴스는 시작 시퀀스를 완료하고 수명 주기 후크는 인스턴스를 일시 중지합니다. 인스턴스가 대기 상태에 있는 동안 인스턴스에 소프트웨어를 설치하거나 구성하여 트래픽 수신을 시작하기 전에 인스턴스가 준비를 마치도록 합니다. 수명 주기 후크 사용의 또 다른 예로, 축소 이벤트가 발생하는 경우 종료 인스턴스가 먼저 로드 밸런서에서 등록 취소됩니다(Auto Scaling 그룹이 탄력적 로드 밸런싱과 함께 사용되는 경우). 그러면 인스턴스가 종료되기 전에 수명 주기 후크가 인스턴스를 일시 중지합니다. 예를 들어, 인스턴스가 대기 상태에 있는 동안 인스턴스가 완전히 종료되기 전에 인스턴스에 연결하여 로그 또는 다른 데이터를 다운로드할 수 있습니다.

각 Auto Scaling 그룹은 다수의 수명 주기 후크를 보유할 수 있습니다. 그러나 Auto Scaling 그룹당 보유할 수 있는 후크 수에 제한이 있습니다. 자세한 내용은 Amazon EC2 Auto Scaling 한도 단원을 참조하십시오.

수명 주기 후크 작동 방식

Auto Scaling 그룹에 수명 주기 후크를 추가하면 다음과 같이 작동합니다.

  1. Auto Scaling 그룹이 인스턴스를 시작하여 확장 이벤트에 응답하고, 인스턴스를 종료하여 축소 이벤트에 응답합니다.

  2. 수명 주기 후크는 인스턴스를 대기 상태(Pending:Wait 또는 Terminating:Wait)로 설정합니다. 인스턴스는 사용자가 계속 진행하거나 제한 시간이 종료될 때까지 일시 중지 상태로 유지됩니다.

  3. 다음 옵션 중 하나 이상을 사용하여 사용자 지정 작업을 수행할 수 있습니다.

    • 수명 주기 작업이 발생할 때 Lambda 함수를 호출하도록 CloudWatch 이벤트 대상을 정의합니다. Amazon EC2 Auto Scaling에서 CloudWatch 이벤트에 수명 주기 작업에 대한 이벤트를 제출하면 Lambda 함수가 호출됩니다. 이 이벤트에는 시작되거나 종료되는 인스턴스에 대한 정보와 수명 주기 작업을 제어하는 데 사용할 수 있는 토큰이 포함되어 있습니다.

    • 수명 주기 후크에 대한 알림 대상을 정의합니다. 그러면 Amazon EC2 Auto Scaling에서 알림 대상에 메시지를 보냅니다. 이 메시지에는 시작되거나 종료되는 인스턴스에 대한 정보와 수명 주기 작업을 제어하는 데 사용할 수 있는 토큰이 포함되어 있습니다.

    • 인스턴스를 시작할 때 인스턴스에서 실행되는 스크립트를 만듭니다. 스크립트는 실행되는 인스턴스의 ID를 사용하여 수명 주기 작업을 제어할 수 있습니다.

  4. 기본적으로 인스턴스는 한 시간 동안 대기 상태로 유지됩니다. 그 후 Auto Scaling 그룹에서 시작 또는 종료 프로세스(Pending:Proceed 또는 Terminating:Proceed)를 진행합니다. 시간이 더 필요한 경우 하트비트를 기록하여 제한 시간을 다시 시작할 수 있습니다. 제한 시간이 종료되기 전에 마칠 경우 수명 주기 작업을 완료하면 시작 또는 종료 프로세스를 진행할 수 있습니다.

다음 그림에서는 이 프로세스에서 인스턴스 상태 간 전환을 보여 줍니다.


                    수명 주기 후크를 사용한 인스턴스 수명 주기.

Auto Scaling 그룹에서 인스턴스의 전체 수명 주기에 대한 자세한 내용은 Auto Scaling 수명 주기 단원을 참조하십시오.

수명 주기 후크 사용 시 고려 사항

Auto Scaling 그룹에 수명 주기 후크를 추가하면 인스턴스를 시작하고 종료하는 방식을 보다 강력하게 제어할 수 있습니다. 수명 주기 후크를 Auto Scaling 그룹에 추가하는 경우, 그룹이 계속해서 예상대로 작동되도록 하려면 몇 가지 고려할 사항이 있습니다.

인스턴스를 대기 상태로 유지

인스턴스는 한정된 시간 동안 대기 상태를 유지할 수 있습니다. 기본값은 1시간(3600초)입니다. 다음 방법을 통해 이 시간을 조절할 수 있습니다.

  • 수명 주기 후크를 만들 때 수명 주기 후크의 하트비트 제한 시간을 설정합니다. put-lifecycle-hook 명령과 --heartbeat-timeout 파라미터를 사용합니다. PutLifecycleHook 작업에서 HeartbeatTimeout 파라미터를 사용합니다.

  • 제한 시간이 종료되기 전에 마칠 경우 complete-lifecycle-action 명령 또는 CompleteLifecycleAction 작업을 사용하여 다음 상태로 진행합니다.

  • record-lifecycle-action-heartbeat 명령 또는 RecordLifecycleActionHeartbeat 작업을 사용하여 하트비트를 기록함으로써 제한 시간 종료를 연장합니다. 그러면 수명 주기 후크를 만들 때 지정한 제한 시간 값을 기준으로 제한 시간이 늘어납니다. 예를 들어 제한 시간 값이 1시간이고 이 명령을 30분 후에 호출한 경우, 인스턴스는 추가 1시간 동안 대기 상태로 유지됩니다(총 90분).

인스턴스를 대기 상태로 유지할 수 있는 최대 시간은 48시간 혹은 하트비트 제한 시간 100회 중 적은 쪽입니다.

휴지 및 사용자 지정 작업

단순 조정 정책으로 인해 Auto Scaling 그룹에서 인스턴스를 시작하거나 종료하면 휴지가 적용됩니다. 휴지 기간은 Auto Scaling 그룹이 필요한 것보다 많은 인스턴스를 시작하거나 종료하지 않도록 합니다.

어떤 Auto Scaling 그룹에 인스턴스 시작 시 사용자 지정 작업을 지원하는 수명 주기 후크가 있다고 가정해 봅시다. 애플리케이션에 수요가 증가하면 그룹은 인스턴스를 시작하여 용량을 추가합니다. 수명 주기 후크가 있으므로 인스턴스는 Pending:Wait 상태로 들어갑니다. 이는 인스턴스가 아직 트래픽을 처리하지 못함을 뜻합니다. 인스턴스가 대기 상태로 들어가면 단순 조정 정책으로 인한 조정 작업이 일시 중지됩니다. 인스턴스가 InService 상태로 들어가면 휴지 기간이 시작됩니다. 휴지 기간이 만료되면 일시 중지된 조정 작업이 재개됩니다.

상태 확인 유예 기간

수명 주기 후크를 추가할 경우 상태 확인 유예 기간은 수명 주기 후크 작업이 완료되고 인스턴스가 InService 상태로 전환되기까지 시작되지 않습니다.

수명 주기 작업 결과

수명 주기 후크 종료 시 결과는 ABANDON 또는 CONTINUE입니다.

인스턴스가 시작되는 경우, CONTINUE는 작업이 성공적임을 나타내며 인스턴스는 서비스 상태로 전환될 수 있습니다. 그에 반해 ABANDON은 사용자 지정 작업이 실패했음을 나타내며, 인스턴스는 종료될 수 있습니다.

인스턴스가 종료되는 경우, ABANDONCONTINUE 모두를 통해 인스턴스를 종료할 수 있습니다. 그러나 ABANDON은 수명 주기 후크와 같은 남아 있는 모든 작업을 중지하는 반면, CONTINUE는 다른 모든 수명 주기 후크를 완료합니다.

스팟 인스턴스

스팟 인스턴스와 함께 수명 주기 후크를 사용할 수 있습니다. 그러나 수명 주기 후크는 용량을 더 이상 사용할 수 없는 경우 인스턴스 종료를 막지 않습니다. 또한 스팟 인스턴스가 종료될 때 수명 주기 작업을 완료해야 합니다(complete-lifecycle-action 명령 또는 CompleteLifecycleAction 작업 사용).

알림 준비

인스턴스가 대기 상태로 들어갈 때 사용자 지정 작업을 수행할 수 있도록 옵션에서 알림을 설정할 수 있습니다. Amazon CloudWatch Events, Amazon SNS 또는 Amazon SQS를 사용하여 알림을 받을 수 있습니다. 선호하는 옵션을 선택하십시오.

중요

알림을 위한 AWS 리소스는 항상 수명 주기 후크를 생성하는 것과 동일한 AWS 리전에서 생성해야 합니다. 예를 들어 Amazon SNS을 사용하여 알림을 구성하는 경우, Amazon SNS 주제는 수명 주기 후크와 동일한 지역에 있어야 합니다.

혹은 인스턴스가 시작될 때 인스턴스를 구성하는 스크립트가 있는 경우, 수명 주기 작업이 발생할 때 알림을 받을 필요가 없습니다. 아직 없는 경우 인스턴스 메타데이터에서 인스턴스의 인스턴스 ID를 검색하도록 스크립트를 업데이트합니다. 자세한 내용은 인스턴스 메타데이터 검색 단원을 참조하십시오.

CloudWatch 이벤트를 사용하여 Lambda로 알림 라우팅

수명 주기 작업이 발생할 때 Lambda 함수를 호출하도록 CloudWatch 이벤트를 이용해 대상을 설정할 수 있습니다.

CloudWatch 이벤트를 이용해 알림을 설정하려면

  1. Lambda 함수 만들기의 단계를 사용하여 Lambda 함수를 만들고 Amazon 리소스 이름(ARN)을 적어둡니다. 예: arn:aws:lambda:region:123456789012:function:my-function.

  2. 다음 put-rule 명령을 사용하여 수명 주기 작업에 맞는 CloudWatch 이벤트 규칙을 만듭니다.

    aws events put-rule --name my-rule --event-pattern file://pattern.json --state ENABLED

    인스턴스 시작 수명 주기 작업의 pattern.json은 다음과 같습니다.

    { "source": [ "aws.autoscaling" ], "detail-type": [ "EC2 Instance-launch Lifecycle Action" ] }

    인스턴스 종료 수명 주기 작업의 pattern.json은 다음과 같습니다.

    { "source": [ "aws.autoscaling" ], "detail-type": [ "EC2 Instance-terminate Lifecycle Action" ] }
  3. 다음 add-permission 명령을 사용하여 규칙에 Lambda 함수를 호출할 수 있는 권한을 부여합니다. 이 명령은 CloudWatch 이벤트 서비스 보안 주체(events.amazonaws.com)를 신뢰할 수 있게 하고, 지정된 규칙에 따라 권한의 범위를 지정합니다.

    aws lambda add-permission --function-name LogScheduledEvent --statement-id my-scheduled-event \ --action 'lambda:InvokeFunction' --principal events.amazonaws.com --source-arn arn:aws:events:region:123456789012:rule/my-scheduled-rule
  4. 다음 put-targets 명령을 사용하여 수명 주기 작업이 발생할 때 Lambda 함수를 호출하는 대상을 생성합니다.

    aws events put-targets --rule my-rule --targets Id=1,Arn=arn:aws:lambda:region:123456789012:function:my-function
  5. 이 지침을 따른 후에는 다음 단계 수명 주기 후크 추가 로 계속 진행합니다.

Auto Scaling 그룹에서 확장 또는 축소 이벤트에 응답할 때 인스턴스를 대기 상태로 설정합니다. 인스턴스가 대기 상태에 있는 동안 Lambda 함수가 호출됩니다. 이벤트 데이터에 대한 자세한 내용은 Auto Scaling 이벤트 단원을 참조하십시오.

Amazon SNS를 이용해 알림 받기

수명 주기 작업이 발생할 때 알림을 받도록 Amazon SNS를 이용해 알림 대상을 설정합니다.

Amazon SNS를 이용해 알림을 설정하려면

  1. 다음 create-topic 명령을 사용하여 Amazon SNS 주제를 생성합니다. 자세한 내용은 Amazon Simple Notification Service 개발자 안내서주제 생성을 참조하십시오.

    aws sns create-topic --name my-sns-topic

    대상의 ARN(예: arn:aws:sns:region:123456789012:my-sns-topic)을 적어둡니다.

  2. Amazon EC2 Auto Scaling에 대해 알림 대상에 액세스하는 권한을 부여할 수 있는 서비스 역할(수임 역할)을 생성합니다.

    IAM 역할을 생성하고 Amazon EC2 Auto Scaling에 해당 역할을 맡기려면

    1. https://console.aws.amazon.com/iam/에서 IAM 콘솔을 엽니다.

    2. 탐색 창에서 Roles(역할), Create new role(새 역할 생성)을 선택합니다.

    3. Select type of trusted entity(신뢰할 수 있는 유형의 엔터티 선택) 아래에서 AWS service(AWS 서비스)를 선택합니다.

    4. Choose the service that will use this role(이 역할을 사용할 서비스 선택) 아래에 있는 목록에서 EC2 Auto Scaling을 선택합니다.

    5. Select your use case(사용 사례 선택) 하단에서 EC2 Auto Scaling Notification Access (EC2 Auto Scaling 알림)을 선택한 후, Next:Permissions(다음:권한)를 선택합니다.

    6. Next:Tags(다음:태그)를 선택하고, (선택사항) 태그를 키-값 페어로 연결하여 메타데이터를 역할에 추가한 후 Next:Review(다음:검토)를 선택합니다.

    7. 검토 페이지에서 역할의 이름을 입력하고(예: my-notification-role) 역할 생성을 선택합니다.

    8. 역할 페이지에서 방금 만든 역할을 선택하여 요약 페이지를 엽니다. 역할 ARN을 기록해 둡니다. 예: arn:aws:iam::123456789012:role/my-notification-role. 다음 절차에서 수명 주기 후크를 생성하는 경우 역할 ARN을 지정합니다.

  3. 이 지침을 따른 후에는 다음 단계 수명 주기 후크 추가 로 계속 진행합니다.

Auto Scaling 그룹에서 확장 또는 축소 이벤트에 응답할 때 인스턴스를 대기 상태로 설정합니다. 인스턴스가 대기 상태에 있는 동안 알림 대상에게 메시지가 전송됩니다. 메시지에 포함되는 이벤트 데이터는 다음과 같습니다.

  • LifecycleActionToken - 수명 주기 작업 토큰.

  • AccountId - AWS 계정 ID.

  • AutoScalingGroupName - Auto Scaling 그룹 이름.

  • LifecycleHookName - 수명 주기 후크 이름.

  • EC2InstanceId - EC2 인스턴스의 ID.

  • LifecycleTransition - 수명 주기 후크 유형.

예:

Service: AWS Auto Scaling Time: 2019-04-30T20:42:11.305Z RequestId: 18b2ec17-3e9b-4c15-8024-ff2e8ce8786a LifecycleActionToken: 71514b9d-6a40-4b26-8523-05e7ee35fa40 AccountId: 123456789012 AutoScalingGroupName: my-asg LifecycleHookName: my-hook EC2InstanceId: i-0598c7d356eba48d7 LifecycleTransition: autoscaling:EC2_INSTANCE_LAUNCHING NotificationMetadata: null

Amazon SQS를 이용해 알림 받기

수명 주기 작업이 발생할 때 알림을 받도록 Amazon SQS를 이용해 알림 대상을 설정합니다.

중요

FIFO 대기열은 수명 주기 후크와 호환되지 않습니다.

Amazon SQS를 이용해 알림을 설정하려면

  1. Amazon SQS를 사용하여 대상을 만듭니다. 자세한 내용은 Amazon Simple Queue Service 개발자 안내서Amazon SQS 시작하기를 참조하십시오. 대상의 ARN(예: arn:aws:sqs:region:123456789012:my-sqs-queue)을 적어둡니다.

  2. Amazon EC2 Auto Scaling에 대해 알림 대상에 액세스하는 권한을 부여할 수 있는 서비스 역할(수임 역할)을 생성합니다.

    IAM 역할을 생성하고 Amazon EC2 Auto Scaling에 해당 역할을 맡기려면

    1. https://console.aws.amazon.com/iam/에서 IAM 콘솔을 엽니다.

    2. 탐색 창에서 Roles(역할), Create new role(새 역할 생성)을 선택합니다.

    3. Select type of trusted entity(신뢰할 수 있는 유형의 엔터티 선택) 아래에서 AWS service(AWS 서비스)를 선택합니다.

    4. Choose the service that will use this role(이 역할을 사용할 서비스 선택) 아래에 있는 목록에서 EC2 Auto Scaling을 선택합니다.

    5. Select your use case(사용 사례 선택) 하단에서 EC2 Auto Scaling Notification Access (EC2 Auto Scaling 알림)을 선택한 후, Next:Permissions(다음:권한)를 선택합니다.

    6. Next:Tags(다음:태그)를 선택하고, (선택사항) 태그를 키-값 페어로 연결하여 메타데이터를 역할에 추가한 후 Next:Review(다음:검토)를 선택합니다.

    7. 검토 페이지에서 역할의 이름을 입력하고(예: my-notification-role) 역할 생성을 선택합니다.

    8. 역할 페이지에서 방금 만든 역할을 선택하여 요약 페이지를 엽니다. 역할 ARN을 기록해 둡니다. 예: arn:aws:iam::123456789012:role/my-notification-role. 다음 절차에서 수명 주기 후크를 생성하는 경우 역할 ARN을 지정합니다.

  3. 이 지침을 따른 후에는 다음 단계 수명 주기 후크 추가 로 계속 진행합니다.

Auto Scaling 그룹에서 확장 또는 축소 이벤트에 응답할 때 인스턴스를 대기 상태로 설정합니다. 인스턴스가 대기 상태에 있는 동안 알림 대상에게 메시지가 전송됩니다.

수명 주기 후크 추가

put-lifecycle-hook 명령을 사용하여 수명 주기 후크를 생성하고 업데이트할 수 있습니다.

확장 시 작업을 수행하려면 다음 명령을 사용합니다.

aws autoscaling put-lifecycle-hook --lifecycle-hook-name my-hook --auto-scaling-group-name my-asg \ --lifecycle-transition autoscaling:EC2_INSTANCE_LAUNCHING

축소 시 작업을 수행하려면 그 대신 다음 명령을 사용합니다.

aws autoscaling put-lifecycle-hook --lifecycle-hook-name my-hook --auto-scaling-group-name my-asg \ --lifecycle-transition autoscaling:EC2_INSTANCE_TERMINATING

Amazon SNS나 Amazon SQS를 사용해 알림을 받으려면, 추가 옵션을 지정해야 합니다. 이전 절차를 수행하였다면, 알림 대상 및 IAM 역할이 이미 생성되어 있습니다. 자세한 내용은 알림 준비 단원을 참조하십시오.

예를 들어 SNS 주제를 알림 대상으로 지정하려면 다음 옵션을 추가합니다.

--notification-target-arn arn:aws:sns:region:123456789012:my-sns-topic --role-arn arn:aws:iam::123456789012:role/my-notification-role

이 주제는 다음 키/값 쌍에 해당하는 테스트 알림을 보냅니다.

"Event": "autoscaling:TEST_NOTIFICATION"

수명 주기 후크 완료

Auto Scaling 그룹에서 확장 또는 축소 이벤트에 응답할 때 인스턴스를 대기 상태로 설정하고 알림을 전송합니다. 수명 주기 후크를 완료한 후 프로세스를 계속 시작하거나 종료합니다.

수명 주기 후크를 완료하려면

  1. 인스턴스가 대기 상태에 있는 동안 사용자 지정 작업을 수행할 수 있습니다. 새 연결을 생성하는 방법에 대한 자세한 내용은 알림 준비을 참조하십시오.

  2. (선택 사항) 사용자 지정 작업을 완료할 시간이 더 필요한 경우, record-lifecycle-action-heartbeat 명령을 사용하여 제한 시간을 재시작하고 인스턴스를 대기 상태로 유지합니다. 다음 명령과 같이 이전 단계에서 받은 수명 주기 작업 토큰을 지정할 수 있습니다.

    aws autoscaling record-lifecycle-action-heartbeat --lifecycle-hook-name my-launch-hook \ --auto-scaling-group-name my-asg --lifecycle-action-token bcd2f1b8-9a78-44d3-8a7a-4dd07d7cf635

    또는 다음 명령과 같이 이전 단계에서 검색한 인스턴스의 ID를 지정할 수도 있습니다.

    aws autoscaling record-lifecycle-action-heartbeat --lifecycle-hook-name my-launch-hook \ --auto-scaling-group-name my-asg --instance-id i-1a2b3c4d
  3. 제한 시간이 종료되기 전에 사용자 지정 작업을 마치는 경우, Auto Scaling 그룹에서 인스턴스를 계속 시작하거나 종료할 수 있도록 complete-lifecycle-action 명령을 사용합니다. 다음 명령과 같이 수명 주기 작업 토큰을 지정할 수 있습니다.

    aws autoscaling complete-lifecycle-action --lifecycle-action-result CONTINUE \ --lifecycle-hook-name my-launch-hook --auto-scaling-group-name my-asg \ --lifecycle-action-token bcd2f1b8-9a78-44d3-8a7a-4dd07d7cf635

    또는 다음 명령과 같이 인스턴스의 ID를 지정할 수도 있습니다.

    aws autoscaling complete-lifecycle-action --lifecycle-action-result CONTINUE \ --instance-id i-1a2b3c4d --lifecycle-hook-name my-launch-hook \ --auto-scaling-group-name my-asg

알림 테스트

시작 이벤트에 대해 알림이 발생하도록 하려면 Auto Scaling 그룹의 용량을 1만큼 늘려 Auto Scaling 그룹을 업데이트합니다. 인스턴스 시작 후 몇 분 내에 알림을 받게 됩니다.

원하는 용량을 변경하려면(콘솔)

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

  2. 탐색 창의 Auto Scaling 아래에서 Auto Scaling 그룹을 선택합니다.

  3. Auto Scaling 그룹을 선택합니다.

  4. [Details] 탭에서 [Edit]를 선택합니다.

  5. [Desired]에서 현재 값을 1만큼 늘립니다. 이 값이 [Max]를 넘으면 [Max] 값도 1만큼 늘려야 합니다.

  6. Save를 선택합니다.

  7. 몇 분 후 이벤트 알림이 전송됩니다. 이 테스트에서 시작한 인스턴스가 추가로 필요하지 않으면 [Desired]를 1만큼 줄일 수 있습니다. 몇 분 후 이벤트 알림이 전송됩니다.