Amazon EC2 Auto Scaling
사용 설명서

Amazon EC2 Auto Scaling 수명 주기 후크

수명 주기 후크를 사용하면 Auto Scaling 그룹에서 인스턴스를 시작하거나 종료할 때 인스턴스를 일시 중지하여 사용자 지정 작업을 수행할 수 있습니다. 예를 들어, 새로 시작한 인스턴스를 일시 중지하는 동안 인스턴스에 소프트웨어를 설치 또는 구성할 수 있습니다.

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

수명 주기 후크 작동 방식

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

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

  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, or Amazon SQS를 사용하여 알림을 받을 수 있습니다. 선호하는 옵션을 선택하십시오.

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

CloudWatch 이벤트를 이용해 알림 받기

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

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

  1. Lambda 함수 만들기의 단계를 사용하여 Lambda 함수를 만들고 Amazon 리소스 이름(ARN)을 적어둡니다. 예: arn:aws:lambda:us-west-2: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:us-east-1:123456789012:rule/my-scheduled-rule
  4. 다음 put-targets 명령을 사용하여 수명 주기 작업이 발생할 때 Lambda 함수를 호출하는 대상을 만듭니다.

    aws events put-targets --rule my-rule --targets Id=1,Arn=arn:aws:lambda:us-west-2:123456789012:function:my-function
  5. Auto Scaling 그룹에서 확장 또는 축소 이벤트에 응답할 때 인스턴스를 대기 상태로 설정합니다. 인스턴스가 대기 상태에 있는 동안 Lambda 함수가 호출됩니다. 이벤트 데이터에 대한 자세한 내용은 Auto Scaling 이벤트 단원을 참조하십시오.

Amazon SNS를 이용해 알림 받기

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

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

  1. Amazon SNS를 사용하여 대상을 만듭니다. 자세한 내용은 Amazon Simple Notification Service 개발자 안내서주제 생성을 참조하십시오. 대상의 ARN(예: arn:aws:sns:us-west-2:123456789012:my-sns-topic)을 적어둡니다.

  2. IAM 사용 설명서AWS 서비스에 대한 권한을 위임할 역할 생성에 나와 있는 단계를 사용하여 Amazon EC2 Auto Scaling에 알림 대상에 액세스할 권한을 부여하는 IAM 역할을 만듭니다. 역할 유형을 선택하라는 메시지가 표시되면 [AWS Service Roles], [AutoScaling Notification Access]를 선택합니다. 역할의 ARN을 적어둡니다. 예: arn:aws:iam::123456789012:role/my-notification-role.

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

    • LifecycleActionToken - 수명 주기 작업 토큰

    • AccountId - AWS 계정 ID

    • AutoScalingGroupName - Auto Scaling 그룹의 이름

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

    • EC2InstanceId - EC2 인스턴스의 ID

    • LifecycleTransition - 수명 주기 후크 유형

    예:

    Service: AWS Auto Scaling Time: 2016-09-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을 적어둡니다.

  2. IAM 사용 설명서AWS 서비스에 대한 권한을 위임할 역할 생성에 나와 있는 단계를 사용하여 Amazon EC2 Auto Scaling에 알림 대상에 액세스할 권한을 부여하는 IAM 역할을 만듭니다. 역할 유형을 선택하라는 메시지가 표시되면 [AWS Service Roles], [AutoScaling Notification Access]를 선택합니다. 역할의 ARN을 적어둡니다. 예: arn:aws:iam::123456789012:role/my-notification-role.

  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를 사용해 알림을 받을 수 있는 추가 옵션이 있습니다. 예를 들어 SNS 주제를 알림 대상으로 지정하려면 다음 옵션을 추가합니다.

--notification-target-arn arn:aws:sns:us-west-2: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-action-token bcd2f1b8-9a78-44d3-8a7a-4dd07d7cf635 --lifecycle-hook-name my-launch-hook --auto-scaling-group-name my-asg

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

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

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

    또는 다음 명령과 같이 인스턴스의 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 Groups]를 선택합니다.

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

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

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

  6. [Save]를 선택합니다.

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