

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

# 자습서: Lambda 함수를 호출하는 수명 주기 후크 구성
<a name="tutorial-lifecycle-hook-lambda"></a>

이 연습에서는 일치 시 AWS Lambda 함수를 규칙 대상으로 호출하는 필터 패턴이 포함된 Amazon EventBridge 규칙을 생성합니다. 사용할 필터 패턴과 샘플 함수 코드가 제공됩니다.

모든 설정을 올바르게 구성하면 이 자습서를 마친 후 인스턴스가 시작될 때 Lambda 함수가 사용자 지정 작업을 수행합니다. 사용자 지정 작업은 Lambda 함수와 연결된 CloudWatch Logs 로그 스트림에 이벤트를 로깅하기만 합니다.

또한 Lambda 함수는 이 작업에 성공할 경우, 인스턴스의 수명 주기가 진행되도록 하지만 작업에 실패하면 인스턴스가 시작을 중단하고 해지할 수 있도록 하는 콜백을 수행합니다.

다음 그림은 Lambda 함수를 사용하여 사용자 지정 작업을 수행할 때 스케일 아웃 이벤트의 흐름을 요약합니다. 인스턴스가 시작되면 제한 시간을 초과하거나 Amazon EC2 Auto Scaling에서 계속 진행하라는 신호를 수신하여 수명 주기 후크가 완료될 때까지 인스턴스의 수명 주기가 일시 중지됩니다.

![\[Lambda 함수를 사용하여 사용자 지정 작업을 수행할 때 스케일 아웃 이벤트의 흐름입니다.\]](http://docs.aws.amazon.com/ko_kr/autoscaling/ec2/userguide/images/lifecycle-hook-lambda-function.png)


**참고**  
사용 사례별로 아래 단계에 따라 EventBridge 규칙을 생성하여 수명 주기 후크를 구성할 수 있습니다. 또는 Lambda 함수를 사용하여 EventBridge 규칙을 생성하지 않고도 수명 주기 후크를 직접 구성할 수 있습니다.

**Topics**
+ [사전 조건](#lambda-hello-world-tutorial-prerequisites)
+ [1단계: 수명 주기 작업을 완료할 권한이 있는 IAM 역할 생성](#lambda-create-iam-role)
+ [2단계: Lambda 함수 생성](#lambda-create-hello-world-function)
+ [3단계: EventBridge 규칙 생성](#lambda-create-rule)
+ [4단계: 수명 주기 후크 추가](#lambda-add-lifecycle-hook)
+ [5단계: 이벤트 테스트 및 확인](#lambda-testing-hook-notifications)
+ [6단계: 정리](#lambda-lifecycle-hooks-tutorial-cleanup)
+ [관련 리소스](#lambda-lifecycle-hooks-tutorial-related-resources)

## 사전 조건
<a name="lambda-hello-world-tutorial-prerequisites"></a>

Auto Scaling 그룹이 없는 경우, 이 자습서를 시작하기 전에 Auto Scaling 그룹을 생성합니다. Auto Scaling 그룹을 생성하려면 Amazon EC2 콘솔에서 [Auto Scaling 그룹](https://console.aws.amazon.com/ec2/v2/home?#AutoScalingGroups) 페이지를 열고 **Auto Scaling 그룹 생성**을 선택합니다.

## 1단계: 수명 주기 작업을 완료할 권한이 있는 IAM 역할 생성
<a name="lambda-create-iam-role"></a>

Lambda 함수를 생성하기 전에 먼저 집행 역할과 사용 권한 정책을 만들어 Lambda가 수명 주기 후크를 완료할 수 있도록 해야 합니다.

**정책 생성**

1. IAM 콘솔에서 [정책(Policies)](https://console.aws.amazon.com/iam/home?#/policies) 페이지를 열고 **Create policy(정책 생성)**를 선택합니다.

1. **JSON** 탭을 선택합니다.

1. **Policy Document(정책 문서)** 상자에 다음 정책 문서를 붙여 넣고 **기울임꼴**로 표시된 텍스트를 계정 번호 및 Auto Scaling 그룹의 이름으로 바꿉니다.

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Action": [
           "autoscaling:CompleteLifecycleAction"
         ],
         "Resource": "arn:aws:autoscaling:*:123456789012:autoScalingGroup:*:autoScalingGroupName/my-asg"
       }
     ]
   }
   ```

------

1. **다음**을 선택합니다.

1. **정책 이름(Policy name)**에 **LogAutoScalingEvent-policy**을 입력합니다. **Create policy(정책 생성)**를 선택합니다.

정책 생성을 완료하면 정책을 사용하는 역할을 생성할 수 있습니다.

**역할 생성**

1. 왼쪽의 탐색 창에서 **역할**을 선택합니다.

1. **역할 생성**을 선택합니다.

1. **신뢰할 수 있는 엔터티 선택(Select trusted entity)**에서 **AWS 서비스( service)**를 선택합니다.

1. 사용 사례에 대해 **Lambda**를 선택하고 **다음(Next)**을 선택합니다.

1. **권한 추가(Add permissions)**에서 생성한 정책(**LogAutoScalingEvent-policy**)과 이름이 **AWSLambdaBasicExecutionRole**인 정책을 선택합니다. 그리고 **다음**을 선택합니다.
**참고**  
**AWSLambdaBasicExecutionRole** 정책은 함수가 CloudWatch Logs에 로그를 쓰는 데 필요한 권한을 가집니다.

1. **이름 지정, 검토 및 생성(Name, review, and create)** 페이지에서 **역할 이름(Role name)**에 **LogAutoScalingEvent-role**을 입력하고 **역할 생성(Create role)**을 선택합니다.

## 2단계: Lambda 함수 생성
<a name="lambda-create-hello-world-function"></a>

이벤트의 대상 역할을 할 Lambda 함수를 생성합니다. Node.js 형식으로 작성된 샘플 Lambda 함수는 Amazon EC2 Auto Scaling에서 일치하는 이벤트가 발생할 때 EventBridge에서 호출합니다.

**Lambda 함수를 생성하려면**

1. Lambda 콘솔에서 [함수 페이지](https://console.aws.amazon.com/lambda/home#/functions)를 엽니다.

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

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

1. **런타임**에서 **Node.js 18.x**를 선택합니다.

1. 아래로 스크롤하여 **집행 역할 기본값 변경**을 선택하고 **집행 역할**에서 **기존 역할 사용**을 선택합니다.

1. **Existing role(기존 역할)**로 **LogAutoScalingEvent-role**을 선택합니다.

1. 나머지는 기본값을 그대로 사용합니다.

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

1. 콘솔에 `LogAutoScalingEvent` 함수를 여전히 열어둔 상태에서 편집기의 **코드 소스**에서 다음 샘플 코드를 index.mjs 파일에 붙여 넣습니다.

   ```
   import { AutoScalingClient, CompleteLifecycleActionCommand } from "@aws-sdk/client-auto-scaling";
   export const handler = async(event) => {
     console.log('LogAutoScalingEvent');
     console.log('Received event:', JSON.stringify(event, null, 2));
     var autoscaling = new AutoScalingClient({ region: event.region });
     var eventDetail = event.detail;
     var params = {
       AutoScalingGroupName: eventDetail['AutoScalingGroupName'], /* required */
       LifecycleActionResult: 'CONTINUE', /* required */
       LifecycleHookName: eventDetail['LifecycleHookName'], /* required */
       InstanceId: eventDetail['EC2InstanceId'],
       LifecycleActionToken: eventDetail['LifecycleActionToken']
     };
     var response;
     const command = new CompleteLifecycleActionCommand(params);
     try {
       var data = await autoscaling.send(command);
       console.log(data); // successful response
       response = {
         statusCode: 200,
         body: JSON.stringify('SUCCESS'),
       };
     } catch (err) {
       console.log(err, err.stack); // an error occurred
       response = {
         statusCode: 500,
         body: JSON.stringify('ERROR'),
       };
     }
     return response;
   };
   ```

   이 코드는 이벤트를 간단하게 로깅하므로 자습서를 마치면 이 Lambda 함수와 연결된 CloudWatch Logs 로그 스트림에 이벤트가 나타나는 것을 볼 수 있습니다.

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

## 3단계: EventBridge 규칙 생성
<a name="lambda-create-rule"></a>

Lambda 함수를 실행하는 EventBridge 규칙을 생성합니다. EventBridge 사용에 대한 자세한 설명은 [EventBridge를 사용하여 Auto Scaling 이벤트 처리](automating-ec2-auto-scaling-with-eventbridge.md) 섹션을 참조하세요.

**콘솔을 사용하여 규칙 생성**

1. [EventBridge 콘솔](https://console.aws.amazon.com/events/)을 엽니다.

1. 탐색 창에서 **규칙**을 선택합니다.

1. **규칙 생성**을 선택합니다.

1. **규칙 세부 정보 정의(Define rule detail)**에 대해 다음을 수행하십시오:

   1. **이름**에 **LogAutoScalingEvent-rule**를 입력합니다.

   1. **이벤트 버스**에서 **기본값**을 선택합니다. 계정 AWS 서비스 의가 이벤트를 생성하면 항상 계정의 기본 이벤트 버스로 이동합니다.

   1. **규칙 유형(Rule type)**에서 **이벤트 패턴이 있는 규칙(Rule with an event pattern)**을 생성합니다.

   1. **다음**을 선택합니다.

1. **이벤트 패턴 빌드(Build event pattern)**에서 다음을 수행합니다.

   1. **이벤트 소스(Event source)**에서 **AWS 이벤트 또는 EventBridge 파트너 이벤트( events or EventBridge partner events)**를 선택합니다.

   1. **이벤트 패턴**까지 아래로 스크롤하여 다음을 수행하십시오:

   1. 

      1. **이벤트 소스(Event source)**에서 **AWS 서비스**를 선택합니다.

      1. **AWS 서비스**에서 **Auto Scaling**을 선택합니다.

      1. **이벤트 유형**에서 **인스턴스 시작 및 해지**를 선택합니다.

      1. 기본적으로 규칙은 모든 스케일 인 또는 스케일 아웃 이벤트와 일치합니다. 스케일 아웃 이벤트가 있고 인스턴스가 수명 주기 후크로 인해 대기 상태가 될 때 알려주는 규칙을 생성하려면 **특정 인스턴스 이벤트(Specific instance event(s))**를 선택하고 **EC2 인스턴스 시작 수명 주기 작업(EC2 Instance-launch Lifecycle Action)**을 선택합니다.

      1. 기본적으로 규칙은 지역의 모든 Auto Scaling 그룹과 일치합니다. 규칙을 특정 Auto Scaling 그룹과 매칭시키려면 **특정 그룹 명칭**을 선택하고 해당 그룹을 선택합니다.

      1. **다음**을 선택합니다.

1. **대상 선택(Select target(s))**에서 다음을 수행하십시오:

   1. **대상 유형(Target types**)에서 **AWS 서비스**를 선택합니다.

   1. **대상 선택(Select a target)**에서 **Lambda 함수(Lambda function)**를 선택합니다.

   1. **함수(Function)**에서 **LogAutoScalingEvent**를 선택합니다.

   1. **다음**을 두 번 선택합니다

1. **검토 및 생성** 페이지에서 **규칙 생성**을 선택합니다.

## 4단계: 수명 주기 후크 추가
<a name="lambda-add-lifecycle-hook"></a>

이 섹션에서는 Lambda가 시작 시 인스턴스에 대해 함수를 실행할 수 있도록 수명 주기 후크를 추가합니다.

**수명 주기 후크 추가**

1. Amazon EC2 콘솔에서 [Auto Scaling 그룹](https://console.aws.amazon.com/ec2/v2/home?#AutoScalingGroups) 페이지를 엽니다.

1. Auto Scaling 그룹 옆의 확인란을 선택합니다. 페이지 하단에 분할 창이 열립니다.

1. 창 하단 **Instance management(인스턴스 관리)** 탭의 **Lifecycle hooks(수명 주기 후크)**에서 **Create lifecycle hook(수명 주기 후크 생성)**를 선택합니다.

1. 스케일 아웃(인스턴스 실행)을 위한 수명 주기 후크를 정의하려면 다음을 수행하세요.

   1. **Lifecycle hook name(수명 주기 후크 이름)**으로 **LogAutoScalingEvent-hook**를 입력합니다.

   1. **Lifecycle transition(수명 주기 전환)**에서 **Instance launch(인스턴스 시작)**를 선택합니다.

   1. **Heartbeat timeout(하트비트 시간 제한)**에 Lambda 함수에서 콜백을 기다리는 시간(초)으로 **300**을 입력합니다.

   1. **Default result(기본 결과)**로 **ABANDON(포기)**을 선택합니다. 즉, Lambda 함수에서 콜백을 수신하지 않았는데 후크가 시간 초과되면 Auto Scaling 그룹이 새 인스턴스를 해지합니다.

   1. (옵션)**Notification metadata(알림 메타데이터)**를 비워 둡니다. EventBridge로 전달하는 이벤트 데이터에는 Lambda 함수를 호출하는 데 필요한 모든 정보가 들어 있습니다.

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

## 5단계: 이벤트 테스트 및 확인
<a name="lambda-testing-hook-notifications"></a>

이벤트를 테스트하기 위해 Auto Scaling 그룹의 원하는 용량을 1씩 늘리면서 Auto Scaling 그룹을 업데이트합니다. 원하는 용량을 늘린 후 몇 초 내에 Lambda 함수가 호출됩니다.

**Auto Scaling 그룹 크기 증가**

1. Amazon EC2 콘솔에서 [Auto Scaling 그룹](https://console.aws.amazon.com/ec2/v2/home?#AutoScalingGroups) 페이지를 엽니다.

1. Auto Scaling 그룹 옆의 확인란을 선택하여 아래쪽 창에 세부 정보를 표시하고 위쪽 창의 맨 위 행을 계속 표시합니다.

1. 아래 창의 **Details(세부 정보)** 탭에서 **Group details(그룹 세부 정보)**, **Edit(편집)**을 선택합니다.

1. **원하는 용량**에 대해 현재 값을 1씩 늘립니다.

1. **Update(업데이트)**를 선택합니다. 인스턴스가 시작되는 동안 위쪽 창의 **Status(상태)** 열에 *Updating capacity(용량 업데이트 중)* 상태가 표시됩니다.

원하는 용량을 늘린 후 Lambda 함수가 호출되었는지 확인할 수 있습니다.

**Lambda 함수에서 출력 확인**

1. CloudWatch 콘솔에서 [로그 그룹 페이지](https://console.aws.amazon.com/cloudwatch/home#logs:)를 엽니다.

1. Lambda 함수에 대한 로그 그룹 명칭을 선택합니다(`/aws/lambda/LogAutoScalingEvent`).

1. 로그 스트림 이름을 선택하여 수명 주기 작업에 대해 해당 함수에서 제공하는 데이터를 확인합니다.

다음으로, 크기 조정 활동의 열거을 통해 인스턴스가 성공적으로 시작되었는지 확인할 수 있습니다.

**조정 활동을 보려면**

1. **Auto Scaling groups(Auto Scaling 그룹)** 페이지로 돌아가 그룹을 선택합니다.

1. **Activity(활동)** 탭의 **Activity history(활동 기록)**에 있는 **Status(상태)** 열에 Auto Scaling 그룹이 성공적으로 인스턴스를 시작했는지가 표시됩니다.
   + 작업에 성공하면 크기 조정 활동의 상태가 “성공”으로 표시됩니다.
   + 실패하면 몇 분이 지난 후 “Cancelled(취소됨)” 상태의 크기 조정 활동이 표시되고 “Instance failed to complete user's Lifecycle Action: Lifecycle Action with token e85eb647-4fe0-4909-b341-a6c42EXAMPLE was abandoned: Lifecycle Action Completed with ABANDON Result(인스턴스가 사용자의 수명 주기 작업을 완료하지 못함: 토큰이 e85eb647-4fe0-4909-b341-a6c42EXAMPLE인 수명 주기 작업이 중단됨: 수명 주기 작업 완료되었으나 결과가 중단임)”이라는 상태 메시지가 표시됩니다.

**Auto Scaling 그룹 크기 감소**  
이 테스트를 위해 시작한 추가 인스턴스가 필요하지 않으면 **Details(세부 정보)** 탭을 열고 **원하는 용량**을 1씩 줄일 수 있습니다.

## 6단계: 정리
<a name="lambda-lifecycle-hooks-tutorial-cleanup"></a>

이 자습서 전용으로 생성한 리소스 사용을 마친 경우, 다음 단계에 따라 리소스를 삭제합니다.

**수명 주기 후크 삭제**

1. Amazon EC2 콘솔에서 [Auto Scaling 그룹 페이지](https://console.aws.amazon.com/ec2/v2/home?#AutoScalingGroups)를 엽니다.

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

1. **Instance management(인스턴스 관리)** 탭의 **Lifecycle hooks(수명 주기 후크)**에서 수명 주기 후크(`LogAutoScalingEvent-hook`)를 선택합니다.

1. **작업**, **삭제**를 선택합니다.

1. 확인하려면 **Delete(삭제)**를 다시 선택합니다.

**Amazon EventBridge 규칙 삭제**

1. Amazon EventBridge 콘솔에서 [Rules(규칙)](https://console.aws.amazon.com/events/home?#/rules) 페이지를 엽니다.

1. **Event bus(이벤트 버스)**에서 규칙과 연결된 이벤트 버스(`Default`)를 선택합니다.

1. 규칙(`LogAutoScalingEvent-rule`) 옆에 있는 확인란을 선택합니다.

1. **삭제**를 선택합니다.

1. 확인 메시지가 나타나면 규칙의 이름을 입력한 다음 **Delete**(삭제)를 선택합니다.

예 함수를 사용한 작업이 완료되면 해당 함수를 삭제하세요. 함수의 로그를 저장하는 로그 그룹과 생성한 집행 역할 및 정책 권한을 삭제할 수도 있습니다.

**Lambda 함수 삭제**

1. Lambda 콘솔에서 [함수 페이지](https://console.aws.amazon.com/lambda/home#/functions)를 엽니다.

1. 함수(`LogAutoScalingEvent`)를 선택합니다.

1. **작업**, **삭제**를 선택합니다.

1. 확인 메시지가 표시되면 **delete**를 입력하여 지정된 함수 삭제를 확인한 다음 **Delete**(삭제)를 선택합니다.

**로그 그룹 삭제**

1. CloudWatch 콘솔에서 [로그 그룹 페이지](https://console.aws.amazon.com/cloudwatch/home#logs:)를 엽니다.

1. 함수의 로그 그룹(`/aws/lambda/LogAutoScalingEvent`)을 선택합니다.

1. **작업(Actions)**, **로그 그룹 삭제(Delete log group(s))**를 선택합니다.

1. **로그 그룹 삭제(Delete log group(s))** 대화 상자에서 **삭제(Delete)**를 선택합니다.

**집행 역할 삭제**

1. IAM 콘솔에서 [역할 페이지](https://console.aws.amazon.com/iam/home?#/roles)를 엽니다.

1. 함수의 역할(`LogAutoScalingEvent-role`)을 선택합니다.

1. **삭제**를 선택합니다.

1. 확인 메시지가 나타나면 역할의 이름을 입력한 다음 **Delete**(삭제)를 선택합니다.

**IAM 정책 삭제**

1. IAM 콘솔에서 [정책 페이지](https://console.aws.amazon.com/iam/home?#/policies)를 엽니다.

1. 생성한 정책을 선택합니다(`LogAutoScalingEvent-policy`).

1. **작업**, **삭제**를 선택합니다.

1. 확인 메시지가 나타나면 정책의 이름을 입력한 다음 **Delete**(삭제)를 선택합니다.

## 관련 리소스
<a name="lambda-lifecycle-hooks-tutorial-related-resources"></a>

Auto Scaling 그룹의 인스턴스에서 발생하는 이벤트에 근거하여 EventBridge 규칙을 만들 때 다음과 같은 관련 주제가 도움이 될 수 있습니다.
+ [EventBridge를 사용하여 Auto Scaling 이벤트 처리](automating-ec2-auto-scaling-with-eventbridge.md). 이 섹션에서는 스케일 인을 위한 이벤트를 포함하여 다른 사용 사례에 대한 이벤트의 예를 보여줍니다.
+ [수명 주기 후크 추가(콘솔)](adding-lifecycle-hooks.md#adding-lifecycle-hooks-console). 이 절차에서는 스케일 아웃(인스턴스 시작) 및 스케일 인(인스턴스 해지 또는 웜 풀로의 복귀)을 위해 수명 주기 후크를 추가하는 방법을 설명합니다.

인스턴스 메타데이터 서비스(IMDS)를 사용하여 인스턴스 자체 내에서 작업을 호출하는 방법을 보여주는 자습서은 [자습서: 데이터 스크립트와 인스턴스 메타데이터를 사용하여 수명 주기 상태 검색](tutorial-lifecycle-hook-instance-metadata.md)을 참조하세요.