Infrastructure as Code로 Lambda 지속 함수(durable functions) 배포

Infrastructure as Code로 Lambda 지속 함수(durable functions) 배포

AWS CloudFormation, AWS CDK, AWS Serverless Application Model 또는 Terraform 같은 Infrastructure as Code(IaC) 도구로 Lambda 지속 함수를 배포할 수 있어요. 이러한 도구는 함수, 실행 역할, 권한을 코드로 정의하게 해줘서 배포를 반복 가능하고 버전 관리되게 만들어요.

세 도구 모두 다음을 요구해요:

  • 함수에서 지속 실행(durable execution) 활성화
  • 실행 역할에 체크포인트 권한 부여
  • 버전 게시 또는 별칭 생성 (지속 함수는 qualified ARN이 필요해요)

출처: AWS Lambda 개발자 안내서

본문

ZIP에서 지속 함수 만들기

AWS CloudFormation

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

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

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

Terraform은 AWS 리소스를 지원하는 인기 있는 오픈소스 IaC 도구예요. 다음 예제는 AWS provider version 6.25.0 이상을 사용해 Terraform으로 지속 함수를 만들어요.

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 provider version 6.25.0 이상이 필요해요. 이전 버전을 사용 중이라면 provider 버전을 업데이트하세요.

OCI 컨테이너 이미지에서 지속 함수 만들기

컨테이너 이미지를 기반으로 지속 함수를 만들 수도 있어요. 컨테이너 이미지 빌드 방법은 지속 함수용 지원 런타임을 참고하세요.

AWS CDK

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

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

공통 구성 패턴

어떤 IaC 도구를 쓰든 지속 함수에 대해 다음 패턴을 따르세요:

지속 실행 활성화
함수에 DurableConfig 속성을 설정해 지속 실행을 활성화하세요. 이 속성은 함수를 만들 때만 사용할 수 있어요. 기존 함수에서는 지속 실행을 활성화할 수 없습니다.

체크포인트 권한 부여
실행 역할에 AWSLambdaBasicDurableExecutionRolePolicy 관리형 정책을 연결하세요. 이 정책은 필수 lambda:CheckpointDurableExecution 및 lambda:GetDurableExecutionState 권한을 포함해요.

Qualified ARN 사용
함수용 버전 또는 별칭을 만드세요. 지속 함수는 호출 시 qualified ARN(버전 또는 별칭 포함)이 필요해요. AWS SAM에서는 AutoPublishAlias를 사용하고, CloudFormation·AWS CDK·Terraform에서는 명시적 버전을 만드세요.

의존성 패키징
배포 패키지에 지속 실행 SDK를 포함하세요. Node.js는 @aws/durable-execution-sdk-js를 설치하고, Python은 aws-durable-execution-sdk-python을 설치하세요.

다음 단계

지속 함수를 배포한 후:

  • qualified ARN(버전 또는 별칭)으로 함수를 테스트하세요
  • Lambda 콘솔의 Durable executions 탭에서 실행 진행 상황을 모니터링하세요
  • AWS CloudTrail 데이터 이벤트에서 체크포인트 작업을 확인하세요
  • 함수 출력과 재생(replay) 동작을 위해 CloudWatch Logs를 검토하세요

IaC 도구로 Lambda 함수를 배포하는 방법에 대한 자세한 내용은 다음을 참고하세요:

더 알아보기 (Learn more)

  • CloudFormation·CDK·SAM·Terraform으로 지속 함수를 ZIP 또는 OCI 컨테이너 이미지에서 배포하고, 공통 구성 패턴(지속 실행·체크포인트 권한·qualified ARN)을 익혀 보세요.