

# Lambda 지속성 함수 생성
<a name="durable-getting-started"></a>

Lambda 지속성 함수를 시작하려면 Lambda 콘솔을 사용하여 지속성 함수를 생성합니다. 몇 분 안에 단계와 대기를 사용하여 체크포인트 기반 실행을 시연하는 지속성 함수를 생성하고 배포할 수 있습니다.

자습서를 따라 진행하면서 `DurableContext` 객체를 사용하고, 단계를 따라 체크포인트를 생성하고, 대기를 통해 실행을 일시 중지하는 방법과 같은 기본적인 지속성 함수 개념을 학습합니다. 또한 대기 후 함수가 재개될 때 재생이 작동하는 방식도 알아봅니다.

쉽게 알 수 있도록 이 자습서에서는 Python 또는 Node.js 런타임을 사용하여 함수를 생성하는 방법을 보여줍니다. 이러한 해석된 언어를 사용하면 콘솔의 기본 제공 코드 편집기에서 함수 코드를 직접 편집할 수 있습니다.

**참고**  
지속성 함수는 현재 Python, Node.js(JavaScript/TypeScript), Java 런타임 그리고 컨테이너 이미지(OCI)를 지원합니다. 지원되는 런타임 버전 및 컨테이너 이미지 옵션의 전체 목록을 보려면 [지속성 함수에 지원되는 런타임](durable-supported-runtimes.md)을 참조하세요. Lambda에서의 컨테이너 이미지 사용에 대한 자세한 내용은 Lambda 개발자 안내서에서 [Lambda 컨테이너 이미지 생성](https://docs.aws.amazon.com/lambda/latest/dg/images-create.html)을 참조하세요.

**작은 정보**  
**서버리스 솔루션**을 빌드하는 방법을 알아보려면 [서버리스 개발자 안내서](https://docs.aws.amazon.com/serverless/latest/devguide/)를 확인하세요.

## 사전 조건
<a name="durable-getting-started-prerequisites"></a>

### AWS 계정에 가입
<a name="sign-up-for-aws"></a>

AWS 계정이 없는 경우 다음 절차에 따라 계정을 생성합니다.

**AWS 계정에 가입하려면**

1. [https://portal.aws.amazon.com/billing/signup](https://portal.aws.amazon.com/billing/signup)을 엽니다.

1. 온라인 지시 사항을 따르세요.

   등록 절차 중 전화 또는 텍스트 메시지를 받고 전화 키패드로 확인 코드를 입력하는 과정이 있습니다.

   *AWS 계정 루트 사용자*에 가입하면 AWS 계정루트 사용자가 만들어집니다. 루트 사용자에게는 계정의 모든 AWS 서비스및 리소스에 액세스할 권한이 있습니다. 보안 모범 사례는 사용자에게 관리 액세스 권한을 할당하고, 루트 사용자만 사용하여 [루트 사용자 액세스 권한이 필요한 작업](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_root-user.html#root-user-tasks)을 수행하는 것입니다.

가입 프로세스가 완료되면 AWS은 사용자에게 확인 이메일을 전송합니다. 언제든지 [https://aws.amazon.com/](https://aws.amazon.com/)으로 이동하고 **내 계정**을 선택하여 현재 계정 활동을 확인하고 계정을 관리할 수 있습니다.

### 관리자 액세스 권한이 있는 사용자 생성
<a name="create-an-admin"></a>

AWS 계정에 가입하고 AWS 계정 루트 사용자에 보안 조치를 한 다음, AWS IAM Identity Center을 활성화하고 일상적인 작업에 루트 사용자를 사용하지 않도록 관리 사용자를 생성합니다.

**귀하의 AWS 계정 루트 사용자보호**

1.  **루트 사용자**를 선택하고 AWS 계정 이메일 주소를 입력하여 [AWS Management Console](https://console.aws.amazon.com/)에 계정 소유자로 로그인합니다. 다음 페이지에서 비밀번호를 입력합니다.

   루트 사용자를 사용하여 로그인하는 데 도움이 필요하면 *AWS 로그인사용 설명서*의 [루트 사용자로 로그인](https://docs.aws.amazon.com/signin/latest/userguide/console-sign-in-tutorials.html#introduction-to-root-user-sign-in-tutorial)을 참조하세요.

1. 루트 사용자의 다중 인증(MFA)을 활성화합니다.

   지침은 *IAM 사용 설명서*의 [AWS 계정루트 사용자용 가상 MFA 디바이스 활성화(콘솔)](https://docs.aws.amazon.com/IAM/latest/UserGuide/enable-virt-mfa-for-root.html)를 참조하세요.

**관리자 액세스 권한이 있는 사용자 생성**

1. IAM Identity Center를 활성화합니다.

   지침은 *AWS IAM Identity Center사용 설명서*의 [AWS IAM Identity Center설정](https://docs.aws.amazon.com//singlesignon/latest/userguide/get-set-up-for-idc.html)을 참조하세요.

1. IAM Identity Center에서 사용자에게 관리 액세스 권한을 부여합니다.

   IAM Identity Center 디렉터리를 ID 소스로 사용하는 방법에 대한 자습서는 *AWS IAM Identity Center사용 설명서*의 [기본 IAM Identity Center 디렉터리로 사용자 액세스 구성](https://docs.aws.amazon.com//singlesignon/latest/userguide/quick-start-default-idc.html)을 참조하세요.

**관리 액세스 권한이 있는 사용자로 로그인**
+ IAM IDentity Center 사용자로 로그인하려면 IAM Identity Center 사용자를 생성할 때 이메일 주소로 전송된 로그인 URL을 사용합니다.

  IAM Identity Center 사용자로 로그인하는 데 도움이 필요한 경우 *AWS 로그인 사용 설명서*의 [AWS액세스 포털에 로그인](https://docs.aws.amazon.com/signin/latest/userguide/iam-id-center-sign-in-tutorial.html)을 참조하세요.

**추가 사용자에게 액세스 권한 할당**

1. IAM Identity Center에서 최소 권한 적용 모범 사례를 따르는 권한 세트를 생성합니다.

   지침은 *AWS IAM Identity Center 사용 설명서*의 [Create a permission set](https://docs.aws.amazon.com//singlesignon/latest/userguide/get-started-create-a-permission-set.html)를 참조하세요.

1. 사용자를 그룹에 할당하고, 그룹에 Single Sign-On 액세스 권한을 할당합니다.

   지침은 *AWS IAM Identity Center 사용 설명서*의 [그룹 추가](https://docs.aws.amazon.com//singlesignon/latest/userguide/addgroups.html)를 참조하세요.

## 콘솔로 Lambda 지속성 함수 생성
<a name="getting-started-create-durable-function"></a>

이 예제에서는 지속성 함수가 자동 체크포인트 지정을 사용하여 여러 단계를 통해 주문을 처리합니다. 함수는 주문 ID가 포함된 JSON 객체를 가져와 주문을 검증하고, 결제를 처리하고, 주문을 확인합니다. 각 단계는 자동으로 체크포인트가 지정되므로 함수가 중단되면 마지막으로 완료된 단계부터 재개됩니다.

또한 함수에서는 대기 작업을 보여주며, 외부 확인 대기를 시뮬레이션하기 위해 잠시 동안 실행을 일시 중지합니다.

**콘솔을 사용하여 지속성 함수 생성**

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

1. **함수 생성**을 선택합니다.

1. **새로 작성**을 선택합니다.

1. **기본 정보** 창의 **함수 이름**에 `myDurableFunction`을 입력하세요.

1. **런타임**에서 **Node.js 24** 또는 **Python 3.14**을 선택합니다.

1. **지속성 실행 활성화**를 선택합니다.

Lambda는 체크포인트 작업(`lambda:CheckpointDurableExecution` 및 `lambda:GetDurableExecutionState`)에 대한 권한이 포함된 [실행 역할](lambda-intro-execution-role.md)을 사용하여 지속성 함수를 생성합니다.

**참고**  
Lambda 런타임에는 지속성 실행 SDK가 포함되어 있으므로 종속성을 패키징하지 않고도 지속성 함수를 테스트할 수 있습니다. 하지만 프로덕션용 배포 패키지에는 SDK를 포함하는 것이 좋습니다. 이를 통해 버전 일관성이 보장되고 함수에 영향을 미칠 수 있는 잠재적 런타임 업데이트를 방지할 수 있습니다.

콘솔에 내장된 코드 편집기를 사용하여 지속성 함수 코드를 추가합니다.

------
#### [ Node.js ]

**콘솔에서 코드 수정**

1. **코드** 탭을 선택합니다.

   콘솔의 기본 제공 코드 편집기에서 Lambda가 생성한 함수 코드를 볼 수 있습니다. 코드 편집기에 **index.mjs** 탭이 표시되지 않으면 다음 다이어그램과 같이 파일 탐색기에서 **index.mjs**를 선택합니다.  
![콘솔 코드 편집기 및 파일 탐색기의 index.mjs 파일을 보여주는 다이어그램](http://docs.aws.amazon.com/ko_kr/lambda/latest/dg/images/durable-nodejs.png)

1. 다음 코드를 **index.mjs** 탭에 붙여 넣고 Lambda가 생성한 코드를 바꿉니다.

   ```
   import {
     withDurableExecution,
   } from "@aws/durable-execution-sdk-js";
   
   export const handler = withDurableExecution(
     async (event, context) => {
       const orderId = event.orderId;
       
       // Step 1: Validate order
       const validationResult = await context.step(async (stepContext) => {
         stepContext.logger.info(`Validating order ${orderId}`);
         return { orderId, status: "validated" };
       });
       
       // Step 2: Process payment
       const paymentResult = await context.step(async (stepContext) => {
         stepContext.logger.info(`Processing payment for order ${orderId}`);
         return { orderId, status: "paid", amount: 99.99 };
       });
       
       // Wait for 10 seconds to simulate external confirmation
       await context.wait({ seconds: 10 });
       
       // Step 3: Confirm order
       const confirmationResult = await context.step(async (stepContext) => {
         stepContext.logger.info(`Confirming order ${orderId}`);
         return { orderId, status: "confirmed" };
       });
           
       return {
         orderId: orderId,
         status: "completed",
         steps: [validationResult, paymentResult, confirmationResult]
       };
     }
   );
   ```

1. **배포** 섹션에서 **배포**를 선택하여 함수의 코드를 업데이트하세요.  
![Lambda 콘솔 Code Editor에서의 배포 버튼](http://docs.aws.amazon.com/ko_kr/lambda/latest/dg/images/getting-started-tutorial/deploy-console.png)

**지속성 함수 코드 이해**  
다음 단계로 넘어가기 전에 함수 코드를 살펴보고 주요 지속성 함수 개념을 알아보겠습니다.
+ `withDurableExecution` 래퍼:

  지속성 함수는 `withDurableExecution`으로 래핑됩니다. 이 래퍼는 `DurableContext` 객체를 제공하고 체크포인트 작업을 관리하여 지속성 실행을 활성화합니다.
+ `DurableContext` 객체:

  함수는 표준 Lambda 컨텍스트 대신 `DurableContext`를 수신합니다. 이 객체는 체크포인트를 생성하는 `step()` 및 `wait()`과 같은 지속성 작업에 대한 메서드를 제공합니다.
+ 단계 및 체크포인트:

  각 `context.step()` 직접 호출 시 실행 전후에 체크포인트가 생성됩니다. 함수가 중단되면 마지막으로 완료된 체크포인트에서 재개됩니다. 함수는 완료된 단계를 다시 실행하지 않습니다. 대신 저장된 결과를 사용합니다.
+ 대기 작업:

  `context.wait()` 직접 호출은 컴퓨팅 리소스를 소비하지 않고 실행을 일시 중지합니다. 대기가 완료되면 Lambda는 함수를 다시 간접 호출하고 체크포인트 로그를 재생하여 저장된 값을 완료된 단계로 대체합니다.
+ 재생 메커니즘:

  대기 또는 중단 후 함수가 재개되면 Lambda는 처음부터 코드를 실행합니다. 하지만 완료된 단계는 다시 실행되지 않습니다. Lambda는 체크포인트 로그에서 결과를 재생합니다. 따라서 코드가 결정론적이어야 합니다.

------
#### [ Python ]

**콘솔에서 코드 수정**

1. **코드** 탭을 선택합니다.

   콘솔의 기본 제공 코드 편집기에서 Lambda가 생성한 함수 코드를 볼 수 있습니다. 코드 편집기에 **lambda\_function.py** 탭이 표시되지 않으면 다음 다이어그램과 같이 파일 탐색기에서 **lambda\_function.py**를 선택합니다.  
![콘솔 코드 편집기 및 파일 탐색기의 lambda_function.py 파일을 보여주는 다이어그램](http://docs.aws.amazon.com/ko_kr/lambda/latest/dg/images/durable-python.png)

1. 다음 코드를 **lambda\_function.py** 탭에 붙여 넣고 Lambda가 생성한 코드를 바꿉니다.

   ```
   from aws_durable_execution_sdk_python import (
       DurableContext,
       durable_execution,
       durable_step,
   )
   from aws_durable_execution_sdk_python.config import Duration
   
   @durable_step
   def validate_order(step_context, order_id):
       step_context.logger.info(f"Validating order {order_id}")
       return {"orderId": order_id, "status": "validated"}
   
   @durable_step
   def process_payment(step_context, order_id):
       step_context.logger.info(f"Processing payment for order {order_id}")
       return {"orderId": order_id, "status": "paid", "amount": 99.99}
   
   @durable_step
   def confirm_order(step_context, order_id):
       step_context.logger.info(f"Confirming order {order_id}")
       return {"orderId": order_id, "status": "confirmed"}
   
   @durable_execution
   def lambda_handler(event, context: DurableContext):
       order_id = event['orderId']
       
       # Step 1: Validate order
       validation_result = context.step(validate_order(order_id))
       
       # Step 2: Process payment
       payment_result = context.step(process_payment(order_id))
       
       # Wait for 10 seconds to simulate external confirmation
       context.wait(Duration.from_seconds(10))
       
       # Step 3: Confirm order
       confirmation_result = context.step(confirm_order(order_id))
           
       return {
           "orderId": order_id,
           "status": "completed",
           "steps": [validation_result, payment_result, confirmation_result]
       }
   ```

1. **배포** 섹션에서 **배포**를 선택하여 함수의 코드를 업데이트하세요.  
![Lambda 콘솔 Code Editor에서의 배포 버튼](http://docs.aws.amazon.com/ko_kr/lambda/latest/dg/images/getting-started-tutorial/deploy-console.png)

**지속성 함수 코드 이해**  
다음 단계로 넘어가기 전에 함수 코드를 살펴보고 주요 지속성 함수 개념을 알아보겠습니다.
+ `@durable_execution` 데코레이터:

  핸들러 함수는 `@durable_execution`으로 데코레이션됩니다. 이 데코레이터는 `DurableContext` 객체를 제공하고 체크포인트 작업을 관리하여 지속성 실행을 활성화합니다.
+ `@durable_step` 데코레이터:

  각 단계 함수는 `@durable_step`으로 데코레이션됩니다. 이 데코레이터는 체크포인트를 생성하는 지속성 단계로 함수를 표시합니다.
+ `DurableContext` 객체:

  함수는 표준 Lambda 컨텍스트 대신 `DurableContext`를 수신합니다. 이 객체는 체크포인트를 생성하는 `step()` 및 `wait()`과 같은 지속성 작업에 대한 메서드를 제공합니다.
+ 단계 및 체크포인트:

  각 `context.step()` 직접 호출 시 실행 전후에 체크포인트가 생성됩니다. 함수가 중단되면 마지막으로 완료된 체크포인트에서 재개됩니다. 함수는 완료된 단계를 다시 실행하지 않습니다. 대신 저장된 결과를 사용합니다.
+ 대기 작업:

  `context.wait()` 직접 호출은 컴퓨팅 리소스를 소비하지 않고 실행을 일시 중지합니다. 대기가 완료되면 Lambda는 함수를 다시 간접 호출하고 체크포인트 로그를 재생하여 저장된 값을 완료된 단계로 대체합니다.
+ Python SDK는 동기식입니다.

  Python SDK는 `await`을 사용하지 않습니다. 모든 지속성 작업은 동기식 메서드 직접 호출입니다.

------

## 콘솔 코드 편집기를 사용하여 지속성 함수 간접 호출
<a name="get-started-invoke-durable-manually"></a>

명시적 버전이 지정(또는 게시)되지 않은 경우 콘솔은 `$LATEST` 버전 한정자를 사용하여 지속성 함수를 간접적으로 호출합니다. 하지만 코드를 결정론적으로 실행하려면 항상 안정적인 버전을 가리키는 정규화된 ARN을 사용해야 합니다.

**함수의 버전 게시**

1. **버전** 탭을 선택합니다.

1. [**새 버전 발행**]을 선택합니다.

1. **버전 설명**에 **Initial version**(선택 사항)을 입력합니다.

1. **게시**를 선택합니다.

1. Lambda는 함수 버전 1을 생성합니다. 이제 함수 ARN의 끝에 `:1`이 포함되어 버전 1임을 나타냅니다.

이제 함수로 전송할 테스트 이벤트를 생성합니다. 이벤트는 주문 ID가 포함된 JSON 형식의 문서입니다.

**테스트 이벤트 생성**

1. 콘솔 코드 편집기의 **테스트 이벤트** 섹션에서 **테스트 이벤트 생성**을 선택하세요.  
![Lambda 콘솔 코드 편집기에서의 테스트 이벤트 생성 버튼](http://docs.aws.amazon.com/ko_kr/lambda/latest/dg/images/getting-started-tutorial/test-event.png)

1. **Event Name(이벤트 이름)**에 **myTestEvent**를 입력합니다.

1. **이벤트 JSON** 섹션에서 기본 JSON을 다음으로 바꾸세요.

   ```
   {
     "orderId": "order-12345"
   }
   ```

1. **저장**을 선택합니다.

**지속성 함수 테스트 및 실행 보기**

콘솔 코드 편집기의 **테스트 이벤트** 섹션에서 테스트 이벤트 옆에 있는 실행 아이콘을 선택하세요.

![Lambda 콘솔 코드 편집기에서의 테스트 이벤트 실행 버튼](http://docs.aws.amazon.com/ko_kr/lambda/latest/dg/images/getting-started-tutorial/run-test-event.png)


지속성 함수 실행이 시작됩니다. 10초 대기가 포함되므로 최초 간접 호출이 빠르게 완료되고, 대기 기간 후에 함수가 재개됩니다. 실행 진행 상황은 **지속성 실행** 탭에서 확인할 수 있습니다.

**지속성 함수 실행 보기**

1. **지속성 실행** 탭을 선택합니다.

1. 목록에서 실행을 찾습니다. 실행에 현재 상태(실행 중, 성공 또는 실패)가 표시됩니다.

1. 실행 ID를 선택하여 다음을 포함한 세부 정보를 확인합니다.
   + 각 단계가 완료된 시간을 보여주는 실행 타임라인
   + 체크포인트 내역
   + 대기 기간
   + 단계 결과

CloudWatch Logs에서 함수의 로그를 보고 각 단계의 콘솔 출력을 볼 수도 있습니다.

**CloudWatch Logs에서 함수의 간접 호출 레코드 보기**

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

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

1. 아래로 스크롤하고 확인하고자 하는 함수 간접 호출의 **로그 스트림**을 선택합니다.  
![Lambda 함수에 대한 로그 스트림을 나열합니다.](http://docs.aws.amazon.com/ko_kr/lambda/latest/dg/images/log-stream.png)

   최초 실행 및 대기 후 재생을 포함하여 함수의 각 간접 호출에 대한 로그 항목이 표시될 것입니다.

**참고**  
`DurableContext`의 로거(예: `context.logger` 또는 `stepContext.logger`)를 사용하면 Lambda 콘솔의 지속성 실행 및 단계 뷰에도 로그가 표시됩니다. 이러한 로그는 로드하는 데 시간이 걸릴 수 있습니다.

## 정리
<a name="gettingstarted-durable-cleanup"></a>

지속성 함수 예제를 사용한 작업을 마치면 해당 함수를 삭제합니다. 함수의 로그를 저장하는 로그 그룹과 콘솔에서 생성된 [실행 역할](lambda-intro-execution-role.md)을 삭제할 수도 있습니다.

**Lambda 함수를 삭제하려면**

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

1. 생성한 함수를 선택합니다.

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

1. 텍스트 입력 필드에 **confirm**를 입력하고 **Delete**(삭제)를 선택합니다.

**로그 그룹 삭제**

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

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

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

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

**실행 역할을 삭제하려면**

1. AWS Identity and Access Management(IAM) 콘솔의 [역할 페이지](https://console.aws.amazon.com/iam/home?#/roles)를 엽니다.

1. 함수의 실행 역할(예: `myDurableFunction-role-{{31exxmpl}}`)을 선택합니다.

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

1. **역할 삭제** 대화 상자에 역할 이름을 입력하고 **삭제**를 선택하세요.

## 추가 리소스 및 다음 단계
<a name="durable-getting-started-more-resources"></a>

콘솔을 사용하여 간단한 지속성 함수를 생성하고 테스트했으니, 이제 다음 단계를 수행합니다.
+ 분산 트랜잭션, 주문 처리, 인적 검토 워크플로 등 지속성 함수의 일반적인 사용 사례에 대해 알아봅니다. [예제](durable-examples.md)를 참조하세요.
+ CloudWatch 지표 및 실행 내역을 사용하여 지속성 함수 실행을 모니터링하는 방법을 이해합니다. [모니터링 및 디버깅](durable-monitoring.md)을 참조하세요.
+ 지속성 함수를 동기식 및 비동기식으로 간접 호출하고, 장기 실행을 관리하는 방법을 알아봅니다. [지속성 함수 간접 호출](durable-invoking.md)을 참조하세요.
+ 결정론적 코드 작성, 체크포인트 크기 관리, 비용 최적화 모범 사례를 따릅니다. [모범 사례](durable-best-practices.md)를 참조하세요.
+ 로컬 및 클라우드에서 지속성 함수를 테스트하는 방법을 알아봅니다. [지속성 함수 테스트](durable-testing.md)를 참조하세요.
+ 지속성 함수와 Step Functions를 비교하여 각 접근 방식이 가장 효과적인 경우를 파악합니다. [지속성 함수 또는 Step Functions](durable-step-functions.md)를 참조하세요.