

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

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

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

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

Java(미리 보기)의 지속성 함수는 현재 컨테이너 이미지를 통해서만 배포할 수 있습니다. 컨테이너 이미지에서 지속성 함수를 생성하는 방법에 대한 자세한 내용은 [지속성 함수에 지원되는 런타임](durable-supported-runtimes.md) 또는 [코드형 인프라를 사용하여 Lambda 지속성 함수 배포](durable-getting-started-iac.md)를 참조하세요.

**참고**  
지속성 함수는 현재 Python, Node.js(JavaScript/TypeScript) 런타임 및 컨테이너 이미지(OCI)를 지원합니다(예: Java). 지원되는 런타임 버전 및 컨테이너 이미지 옵션의 전체 목록을 보려면 [지속성 함수에 지원되는 런타임](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 Sign-In사용 설명서*의 [루트 사용자로 로그인](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 Sign-In 사용 설명서*의 [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:CheckpointDurableExecutions` 및 `lambda:GetDurableExecutionState`)에 대한 권한이 포함된 [실행 역할](lambda-intro-execution-role.md)을 사용하여 지속성 함수를 생성합니다.

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

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

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

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

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

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

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

   ```
   import {
     DurableContext,
     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. **배포** 섹션에서 **배포**를 선택하여 함수의 코드를 업데이트하세요.  
![\[\]](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\$1function.py** 탭이 표시되지 않으면 다음 다이어그램과 같이 파일 탐색기에서 **lambda\$1function.py**를 선택합니다.  
![\[\]](http://docs.aws.amazon.com/ko_kr/lambda/latest/dg/images/durable-python.png)

1. 다음 코드를 **lambda\$1function.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. **배포** 섹션에서 **배포**를 선택하여 함수의 코드를 업데이트하세요.  
![\[\]](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. 콘솔 코드 편집기의 **테스트 이벤트** 섹션에서 **테스트 이벤트 생성**을 선택하세요.  
![\[\]](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. **저장**을 선택합니다.

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

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

![\[\]](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. 아래로 스크롤하고 확인하고자 하는 함수 간접 호출의 **로그 스트림**을 선택합니다.  
![\[\]](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)를 참조하세요.

# AWS CLI를 사용하여 Lambda 지속성 함수 배포 및 간접 호출
<a name="durable-getting-started-cli"></a>

AWS CLI를 사용하여 필수 명령으로 Lambda 지속성 함수를 생성 및 배포합니다. 이 접근 방식을 사용하면 배포 프로세스의 각 단계를 직접 제어할 수 있습니다.

## 사전 조건
<a name="durable-cli-prerequisites"></a>
+ AWS CLI를 설치하고 구성합니다. 지침은 [AWS CLI 설치](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)를 참조하세요.
+ 함수 코드와 지속성 실행 SDK를 사용하여 배포 패키지를 생성합니다.
+ 체크포인트 권한을 가진 IAM 실행 역할을 생성합니다.

## 실행 역할 생성
<a name="durable-cli-create-role"></a>

기본 Lambda 실행 및 체크포인트 작업에 대한 권한이 있는 IAM 역할을 생성합니다.

**실행 역할을 만들려면**

1. Lambda의 역할 수임을 허용하는 신뢰 정책 문서를 생성합니다. `trust-policy.json`으로 저장합니다.

   ```
   {
     "Version": "2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Principal": {
           "Service": "lambda.amazonaws.com"
         },
         "Action": "sts:AssumeRole"
       }
     ]
   }
   ```

1. 역할을 생성합니다.

   ```
   aws iam create-role \
     --role-name durable-function-role \
     --assume-role-policy-document file://trust-policy.json
   ```

1. 체크포인트 작업 및 기본 실행을 위한 지속성 실행 정책을 연결합니다.

   ```
   aws iam attach-role-policy \
     --role-name durable-function-role \
     --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicDurableExecutionRolePolicy
   ```

`AWSLambdaBasicDurableExecutionRolePolicy` 관리형 정책에는 체크포인트 작업(`lambda:CheckpointDurableExecutions` 및 `lambda:GetDurableExecutionState`)과 기본 Lambda 실행에 필요한 권한이 포함됩니다.

## 지속성 함수 생성
<a name="durable-cli-create-function"></a>

`--durable-config` 파라미터를 사용하여 지속성 함수를 생성합니다.

**지속성 함수 생성**

1. 종속성이 포함된 함수 코드를 .zip 파일로 패키징합니다.

   ```
   zip -r function.zip index.mjs node_modules/
   ```

1. 지속성 실행이 활성화된 함수를 생성합니다.

   ```
   aws lambda create-function \
     --function-name myDurableFunction \
     --runtime nodejs22.x \
     --role arn:aws:iam::123456789012:role/durable-function-role \
     --handler index.handler \
     --zip-file fileb://function.zip \
     --durable-config '{"ExecutionTimeout": 3600, "RetentionPeriodInDays": 7}'
   ```

**참고**  
함수를 생성할 때만 지속성 실행을 활성화할 수 있습니다. 기존 함수에서는 활성화할 수 없습니다.

**참고**  
현재 Java(미리 보기)의 지속성 함수는 현재 컨테이너 이미지를 통해서만 생성할 수 있습니다. 컨테이너 이미지에서 지속성 함수를 생성하는 방법에 대한 자세한 내용은 [지속성 함수에 지원되는 런타임](durable-supported-runtimes.md)을 참조하세요.

## 버전 게시
<a name="durable-cli-publish-version"></a>

지속성 함수는 `$LATEST` 버전 한정자를 사용하여 간접적으로 호출할 수 있지만, 코드를 결정론적으로 실행하려면 항상 안정적인 버전을 가리키는 정규화된 ARN을 사용해야 합니다.

```
aws lambda publish-version \
  --function-name myDurableFunction \
  --description "Initial version"
```

명령은 버전 ARN을 반환합니다. ARN 끝에 있는 버전 번호(예: `:1`)를 기록해 둡니다.

버전을 가리키는 별칭을 생성합니다(선택 사항).

```
aws lambda create-alias \
  --function-name myDurableFunction \
  --name prod \
  --function-version 1
```

## 지속성 함수 간접 호출
<a name="durable-cli-invoke"></a>

정규화된 ARN(버전 또는 별칭)을 사용하여 지속성 함수를 간접 호출합니다.

**참고**  
**멱등적 간접 호출:** 실패한 간접 호출을 재시도할 때 중복 실행을 방지하려면 최대 1회 실행 의미 체계를 보장하는 실행 이름을 제공할 수 있습니다. 자세한 내용은 [멱등성](durable-execution-idempotency.md)을 참조하세요.

**동기식 간접 호출**  
15분 이내에 완료되는 실행의 경우 동기식 간접 호출을 사용합니다.

```
aws lambda invoke \
  --function-name myDurableFunction:1 \
  --payload '{"orderId": "order-12345"}' \
  --cli-binary-format raw-in-base64-out \
  response.json
```

또는 별칭을 사용합니다.

```
aws lambda invoke \
  --function-name myDurableFunction:prod \
  --payload '{"orderId": "order-12345"}' \
  --cli-binary-format raw-in-base64-out \
  response.json
```

**비동기식 간접 호출**  
장기 실행의 경우 비동기식 간접 호출을 사용합니다.

```
aws lambda invoke \
  --function-name myDurableFunction:prod \
  --invocation-type Event \
  --payload '{"orderId": "order-12345"}' \
  --cli-binary-format raw-in-base64-out \
  response.json
```

비동기식 간접 호출을 사용하면 Lambda는 즉시 반환합니다. 함수는 백그라운드에서 계속 실행됩니다.

**참고**  
콘솔에서 프로토타입 생성 및 테스트를 위해 `$LATEST`를 사용할 수 있습니다. 프로덕션 워크로드의 경우 게시된 버전 또는 별칭을 사용합니다.

## 지속성 실행 관리
<a name="durable-cli-manage-executions"></a>

다음 명령을 사용하여 지속성 함수 실행을 관리하고 모니터링합니다.

**실행 나열**  
지속성 함수에 대한 모든 실행을 나열합니다.

```
aws lambda list-durable-executions-by-function \
  --function-name myDurableFunction
```

**실행 세부 정보 가져오기**  
특정 실행에 대한 세부 정보를 가져옵니다.

```
aws lambda get-durable-execution \
  --durable-execution-arn arn:aws:lambda:us-east-1:123456789012:function:myDurableFunction:my-function-version/durable-execution/my-execution-name/my-execution-id
```

**실행 내역 가져오기**  
실행에 대한 체크포인트 내역을 확인합니다.

```
aws lambda get-durable-execution-history \
  --durable-execution-arn arn:aws:lambda:us-east-1:123456789012:function:myDurableFunction:my-function-version/durable-execution/my-execution-name/my-execution-id
```

**실행 중지**  
지속성 실행을 중지합니다.

```
aws lambda stop-durable-execution \
  --durable-execution-arn arn:aws:lambda:us-east-1:123456789012:function:myDurableFunction:my-function-version/durable-execution/my-execution-name/my-execution-id
```

## 함수 코드 업데이트
<a name="durable-cli-update-function"></a>

지속성 함수 코드를 업데이트하고 새 버전을 게시합니다.

**새 버전 업데이트 및 게시**

1. 함수 코드를 업데이트합니다.

   ```
   aws lambda update-function-code \
     --function-name myDurableFunction \
     --zip-file fileb://function.zip
   ```

1. 업데이트가 완료될 때까지 대기합니다.

   ```
   aws lambda wait function-updated \
     --function-name myDurableFunction
   ```

1. 새 버전을 게시합니다.

   ```
   aws lambda publish-version \
     --function-name myDurableFunction \
     --description "Updated order processing logic"
   ```

1. 새 버전을 가리키도록 별칭을 업데이트합니다.

   ```
   aws lambda update-alias \
     --function-name myDurableFunction \
     --name prod \
     --function-version 2
   ```

**중요**  
진행 중인 실행에서 시작된 버전을 계속 사용합니다. 새 간접 호출은 업데이트된 별칭 버전을 사용합니다.

## 함수 로그 보기
<a name="durable-cli-view-logs"></a>

CloudWatch Logs에서 지속성 함수의 로그를 봅니다.

```
aws logs tail /aws/lambda/myDurableFunction --follow
```

특정 실행에 대해 로그를 필터링합니다.

```
aws logs filter-log-events \
  --log-group-name /aws/lambda/myDurableFunction \
  --filter-pattern "exec-abc123"
```

## 리소스 정리
<a name="durable-cli-cleanup"></a>

지속성 함수 및 관련 리소스를 삭제합니다.

```
# Delete the function
aws lambda delete-function --function-name myDurableFunction

# Delete the IAM role policies
aws iam detach-role-policy \
  --role-name durable-function-role \
  --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole

aws iam detach-role-policy \
  --role-name durable-function-role \
  --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicDurableExecutionRolePolicy

# Delete the role
aws iam delete-role --role-name durable-function-role
```

## 다음 단계
<a name="durable-cli-next-steps"></a>

AWS CLI를 사용하여 지속성 함수를 배포하면 다음 작업을 할 수 있습니다.
+ `list-durable-executions` 및 `get-durable-execution` 명령을 사용하여 실행 모니터링
+ AWS CloudTrail 데이터 이벤트에서 체크포인트 작업 보기
+ 실행 실패 또는 장기 실행에 대한 CloudWatch 경보 설정
+ 쉘 스크립트 또는 CI/CD 파이프라인을 사용하여 배포 자동화

Lambda에 대해 사용 가능한 AWS CLI 명령에 대한 자세한 내용은 [AWS CLI 명령 레퍼런스](https://docs.aws.amazon.com/cli/latest/reference/lambda/index.html)를 참조하세요.

# 코드형 인프라를 사용하여 Lambda 지속성 함수 배포
<a name="durable-getting-started-iac"></a>

AWS CloudFormation, AWS CDK, AWS Serverless Application Model, Terraform과 같은 코드형 인프라(IaC) 도구를 사용하여 Lambda 지속성 함수를 배포할 수 있습니다. 이러한 도구를 사용하면 코드에서 함수, 실행 역할 및 권한을 정의하여 배포를 반복하고 버전을 관리할 수 있습니다.

3가지 도구 모두에서 다음을 수행해야 합니다.
+ 함수에서 지속성 실행 활성화
+ 실행 역할에 체크포인트 권한 부여
+ 버전 게시 또는 별칭 생성(지속성 함수에는 정규화된 ARN 필요)

## ZIP의 지속성 함수
<a name="durable-iac-zip"></a>

### AWS CloudFormation
<a name="durable-iac-cloudformation"></a>

CloudFormation을 사용하여 템플릿에서 지속성 함수를 정의합니다. 다음 예제에서는 필요한 권한을 가진 지속성 함수를 생성합니다.

```
AWSTemplateFormatVersion: '2010-09-09'
Description: Lambda durable function example

Resources:
  DurableFunctionRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: '2012-10-17'		 	 	 
        Statement:
          - Effect: Allow
            Principal:
              Service: lambda.amazonaws.com
            Action: sts:AssumeRole
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/service-role/AWSLambdaBasicDurableExecutionRolePolicy

  DurableFunction:
    Type: AWS::Lambda::Function
    Properties:
      FunctionName: myDurableFunction
      Runtime: nodejs22.x
      Handler: index.handler
      Role: !GetAtt DurableFunctionRole.Arn
      Code:
        ZipFile: |
          // Your durable function code here
          export const handler = async (event, context) => {
            return { statusCode: 200 };
          };
      DurableConfig:
        ExecutionTimeout: 3600
        RetentionPeriodInDays: 7

  DurableFunctionVersion:
    Type: AWS::Lambda::Version
    Properties:
      FunctionName: !Ref DurableFunction
      Description: Initial version

  DurableFunctionAlias:
    Type: AWS::Lambda::Alias
    Properties:
      FunctionName: !Ref DurableFunction
      FunctionVersion: !GetAtt DurableFunctionVersion.Version
      Name: prod

Outputs:
  FunctionArn:
    Description: Durable function ARN
    Value: !GetAtt DurableFunction.Arn
  AliasArn:
    Description: Function alias ARN (use this for invocations)
    Value: !Ref DurableFunctionAlias
```

**템플릿을 배포하려면**

```
aws cloudformation deploy \
  --template-file template.yaml \
  --stack-name my-durable-function-stack \
  --capabilities CAPABILITY_IAM
```

### AWS CDK
<a name="durable-iac-cdk"></a>

AWS CDK를 사용하면 프로그래밍 언어로 인프라를 정의할 수 있습니다. 다음 예제에서는 TypeScript 및 Python을 사용하여 지속성 함수를 생성하는 방법을 보여줍니다.

------
#### [ TypeScript ]

```
import * as cdk from 'aws-cdk-lib';
import * as lambda from 'aws-cdk-lib/aws-lambda';
import * as iam from 'aws-cdk-lib/aws-iam';
import { Construct } from 'constructs';

export class DurableFunctionStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    // Create the durable function
    const durableFunction = new lambda.Function(this, 'DurableFunction', {
      runtime: lambda.Runtime.NODEJS_22_X,
      handler: 'index.handler',
      code: lambda.Code.fromAsset('lambda'),
      functionName: 'myDurableFunction',
      durableConfig: { executionTimeout: Duration.hours(1), retentionPeriod: Duration.days(30) },
    });

    // Create version and alias
    const version = durableFunction.currentVersion;
    const alias = new lambda.Alias(this, 'ProdAlias', {
      aliasName: 'prod',
      version: version,
    });

    // Output the alias ARN
    new cdk.CfnOutput(this, 'FunctionAliasArn', {
      value: alias.functionArn,
      description: 'Use this ARN to invoke the durable function',
    });
  }
}
```

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

```
from aws_cdk import (
    Stack,
    aws_lambda as lambda_,
    aws_iam as iam,
    CfnOutput,
)
from constructs import Construct

class DurableFunctionStack(Stack):
    def __init__(self, scope: Construct, id: str, **kwargs):
        super().__init__(scope, id, **kwargs)

        # Create the durable function
        durable_function = lambda_.Function(
            self, 'DurableFunction',
            runtime=lambda_.Runtime.NODEJS_22_X,
            handler='index.handler',
            code=lambda_.Code.from_asset('lambda'),
            function_name='myDurableFunction',
            durable_execution={execution_timeout: Duration.hours(1), retention_period: Duration.days(30)}
        )

        # Add durable execution managed policy for checkpoint permissions
        durable_function.role.add_managed_policy(
            iam.ManagedPolicy.from_aws_managed_policy_name('service-role/AWSLambdaBasicDurableExecutionRolePolicy')
        )

        # Create version and alias
        version = durable_function.current_version
        alias = lambda_.Alias(
            self, 'ProdAlias',
            alias_name='prod',
            version=version
        )

        # Output the alias ARN
        CfnOutput(
            self, 'FunctionAliasArn',
            value=alias.function_arn,
            description='Use this ARN to invoke the durable function'
        )
```

------

**CDK 스택 배포**

```
cdk deploy
```

### AWS Serverless Application Model
<a name="durable-iac-sam"></a>

AWS SAM은 서버리스 애플리케이션의 CloudFormation 템플릿을 간소화합니다. 다음 템플릿은 AWS SAM을 사용하여 지속성 함수를 생성합니다.

```
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: Lambda durable function with SAM

Resources:
  DurableFunction:
    Type: AWS::Serverless::Function
    Properties:
      FunctionName: myDurableFunction
      Runtime: nodejs22.x
      Handler: index.handler
      CodeUri: ./src
      DurableConfig:
        ExecutionTimeout: 3600
        RetentionPeriodInDays: 7
      Policies:
        - arn:aws:iam::aws:policy/service-role/AWSLambdaBasicDurableExecutionRolePolicy
      AutoPublishAlias: prod

Outputs:
  FunctionArn:
    Description: Durable function ARN
    Value: !GetAtt DurableFunction.Arn
  AliasArn:
    Description: Function alias ARN (use this for invocations)
    Value: !Ref DurableFunction.Alias
```

**SAM 템플릿 배포**

```
sam build
sam deploy --guided
```

### Terraform
<a name="durable-iac-terraform"></a>

Terraform은 AWS 리소스를 지원하는 인기 있는 오픈 소스 IaC 도구입니다. 다음 예제에서는 Terraform에서 AWS 공급자 버전 6.25.0 이상을 사용하여 지속성 함수를 생성합니다.

```
terraform {
  required_version = ">= 1.0"
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = ">= 6.25.0"
    }
  }
}

provider "aws" {
  region = "us-east-2"
}

# IAM Role for Lambda Function
resource "aws_iam_role" "lambda_role" {
  name = "durable-function-role"

  assume_role_policy = jsonencode({
    Version = "2012-10-17"
    Statement = [{
      Action = "sts:AssumeRole"
      Effect = "Allow"
      Principal = {
        Service = "lambda.amazonaws.com"
      }
    }]
  })
}

# Attach durable execution policy for checkpoint operations
resource "aws_iam_role_policy_attachment" "lambda_durable" {
  policy_arn = "arn:aws:iam::aws:policy/service-role/AWSLambdaBasicDurableExecutionRolePolicy"
  role       = aws_iam_role.lambda_role.name
}

# Lambda Function with Durable Execution enabled
resource "aws_lambda_function" "durable_function" {
  filename      = "function.zip"
  function_name = "myDurableFunction"
  role          = aws_iam_role.lambda_role.arn
  handler       = "index.handler"
  runtime       = "nodejs22.x"
  timeout       = 30
  memory_size   = 512

  durable_config {
    execution_timeout = 900
    retention_period  = 7
  }
}

# Publish a version
resource "aws_lambda_alias" "prod" {
  name             = "prod"
  function_name    = aws_lambda_function.durable_function.function_name
  function_version = aws_lambda_function.durable_function.version
}

output "function_arn" {
  description = "ARN of the Lambda function"
  value       = aws_lambda_function.durable_function.arn
}

output "alias_arn" {
  description = "ARN of the function alias (use this for invocations)"
  value       = aws_lambda_alias.prod.arn
}
```

**Terraform을 사용하여 배포하려면**

```
terraform init
terraform plan
terraform apply
```

**참고**  
Lambda 지속성 함수에 대한 Terraform 지원에 AWS 공급자 버전 6.25.0 이상이 필요합니다. 이전 공급자 버전을 사용하는 경우 버전을 업데이트하세요.

## OCI 컨테이너 이미지의 지속성 함수
<a name="durable-iac-oci"></a>

컨테이너 이미지를 기반으로 지속성 함수를 생성할 수도 있습니다. 컨테이너 이미지를 빌드하는 방법에 대한 지침은 [지속성 함수에 지원되는 런타임](durable-supported-runtimes.md)을 참조하세요.

### AWS CDK
<a name="durable-iac-oci-cdk"></a>

AWS CDK를 사용하면 프로그래밍 언어로 인프라를 정의할 수 있습니다. 다음 예제에서는 컨테이너 이미지의 TypeScript를 사용하여 지속성 함수를 생성하는 방법을 보여줍니다.

```
import * as cdk from 'aws-cdk-lib';
import * as lambda from 'aws-cdk-lib/aws-lambda';
import * as iam from 'aws-cdk-lib/aws-iam';
import { Construct } from 'constructs';

export class DurableFunctionStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    // Create the durable function
    const durableFunction = new lambda.DockerImageFunction(this, 'DurableFunction', {
      code: lambda.DockerImageCode.fromImageAsset('./lambda', {
        platform: cdk.aws_ecr_assets.Platform.LINUX_AMD64,
      }),
      functionName: 'myDurableFunction',
      memorySize: 512,
      timeout: cdk.Duration.seconds(30),
      durableConfig: { executionTimeout: cdk.Duration.hours(1), retentionPeriod: cdk.Duration.days(30) },
    });

    // Create version and alias
    const version = durableFunction.currentVersion;
    const alias = new lambda.Alias(this, 'ProdAlias', {
      aliasName: 'prod',
      version: version,
    });

    // Output the alias ARN
    new cdk.CfnOutput(this, 'FunctionAliasArn', {
      value: alias.functionArn,
      description: 'Use this ARN to invoke the durable function',
    });
  }
}
```

**CDK 스택 배포**

```
cdk deploy
```

### AWS Serverless Application Model
<a name="durable-iac-oci-sam"></a>

AWS SAM은 서버리스 애플리케이션의 CloudFormation 템플릿을 간소화합니다. 다음 템플릿은 AWS SAM을 사용하여 지속성 함수를 생성합니다.

```
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: Lambda durable function with SAM

Resources:
  DurableFunction:
    Type: AWS::Serverless::Function
    Properties:
      FunctionName: myDurableFunction
      PackageType: Image
      ImageUri: ./src
      DurableConfig:
        ExecutionTimeout: 3600
        RetentionPeriodInDays: 7
      Policies:
        - arn:aws:iam::aws:policy/service-role/AWSLambdaBasicDurableExecutionRolePolicy
      AutoPublishAlias: prod
    Metadata:
      DockerTag: latest
      DockerContext: ./src
      Dockerfile: Dockerfile

Outputs:
  FunctionArn:
    Description: Durable function ARN
    Value: !GetAtt DurableFunction.Arn
  AliasArn:
    Description: Function alias ARN (use this for invocations)
    Value: !Ref DurableFunction.Alias
```

**SAM 템플릿 배포**

```
sam build
sam deploy --guided
```

## 일반적인 구성 패턴
<a name="durable-iac-common-patterns"></a>

사용하는 IaC 도구와 무관하게 지속성 함수에 대해 다음 패턴을 따릅니다.

**지속성 실행 활성화**  
함수의 `DurableConfig` 속성을 설정하여 지속성 실행을 활성화합니다. 이 속성은 함수 생성 시에만 사용할 수 있습니다. 기존 함수에서는 지속성 실행을 활성화할 수 없습니다.

**체크포인트 권한 부여**  
`AWSLambdaBasicDurableExecutionRolePolicy` 관리형 정책을 실행 역할에 연결합니다. 이 정책에는 필요한 `lambda:CheckpointDurableExecutions` 및 `lambda:GetDurableExecutionState` 권한이 포함되어 있습니다.

**정규화된 ARN 사용**  
함수의 버전 또는 별칭을 생성합니다. 지속성 함수는 간접 호출에 정규화된 ARN(버전 또는 별칭 포함)이 필요합니다. AWS SAM에서 `AutoPublishAlias`를 사용하거나 CloudFormation, AWS CDK 및 Terraform에서 명시적 버전을 생성합니다.

**패키지 종속성**  
배포 패키지에 지속성 실행 SDK를 포함합니다. Node.js의 경우 `@aws/durable-execution-sdk-js`를 설치합니다. Python의 경우 `aws-durable-execution-sdk-python`을 설치합니다.

## 다음 단계
<a name="durable-iac-next-steps"></a>

지속성 함수 배포 후에 다음을 진행합니다.
+ 정규화된 ARN(버전 또는 별칭)을 사용하여 함수 테스트
+ Lambda 콘솔의 지속성 실행 탭에서 실행 진행 상황 모니터링
+ AWS CloudTrail 데이터 이벤트에서 체크포인트 작업 보기
+ CloudWatch Logs에서 함수 출력 및 재생 동작 검토

IaC 도구를 사용하여 Lambda 함수를 배포하는 방법에 대한 자세한 내용은 다음 항목을 참조하세요.
+ [CloudFormation AWS::Lambda::Function 참조](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-function.html)
+ [AWS CDK Lambda 모듈 설명서](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_lambda-readme.html)
+ [AWS SAM 개발자 안내서](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/what-is-sam.html)