

# 코드형 인프라를 사용하여 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)