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이 필요해요)
본문
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)을 익혀 보세요.