使用基础设施即代码部署 Lambda 持久性函数 - Amazon Lambda
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

使用基础设施即代码部署 Lambda 持久性函数

您可以使用基础设施即代码(IaC)工具(例如 Amazon CloudFormation、Amazon CDK 或 Amazon Serverless Application Model)部署 Lambda 持久性函数。这些工具允许您通过代码来定义函数、执行角色以及权限,从而使得部署过程可重复且能够进行版本控制。

这三种工具都要求您:

  • 对函数启用持久执行

  • 授予对执行角色的检查点权限

  • 发布版本或创建别名(持久性函数需要限定的 ARN)

Amazon CloudFormation

使用 Amazon 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/AWSLambdaBasicExecutionRole Policies: - PolicyName: DurableExecutionPolicy PolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Action: - lambda:CheckpointDurableExecutions - lambda:GetDurableExecutionState Resource: !GetAtt DurableFunction.Arn 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: 10 RetentionPeriodInDays: 1 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

Amazon CDK

Amazon 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) }, }); // Add checkpoint permissions durableFunction.addToRolePolicy(new iam.PolicyStatement({ actions: [ 'lambda:CheckpointDurableExecutions', 'lambda:GetDurableExecutionState', ], resources: [durableFunction.functionArn], })); // 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 checkpoint permissions durable_function.add_to_role_policy(iam.PolicyStatement( actions=[ 'lambda:CheckpointDurableExecutions', 'lambda:GetDurableExecutionState', ], resources=[durable_function.function_arn] )) # 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

Amazon Serverless Application Model

Amazon SAM 简化了无服务器应用程序的 Amazon CloudFormation 模板。以下模板使用 Amazon 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: 10 RetentionPeriodInDays: 1 Policies: - Version: '2012-10-17' Statement: - Effect: Allow Action: - lambda:CheckpointDurableExecutions - lambda:GetDurableExecutionState Resource: !Sub 'arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:${DurableFunction}' 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

常见配置模式

无论您使用哪种 IaC 工具,都要遵循持久性函数的以下模式:

启用持久执行

DurableExecution.Enabled 属性设置为 true。此属性仅在创建函数时可用,您无法对现有函数启用持久执行。

授予检查点权限

lambda:CheckpointDurableExecutionslambda:GetDurableExecutionState 添加到执行角色。将这些权限的范围限定为特定函数 ARN。

使用限定的 ARN

为您的函数创建版本或别名。持久性函数需要使用限定的 ARN(带有版本或别名)才能调用。在 Amazon SAM 中使用 AutoPublishAlias 或在 Amazon CloudFormation 和 Amazon CDK 中创建显式版本。

软件包依赖项

在您的部署包中包含持久执行 SDK。对于 Node.js,请安装 @aws/durable-execution-sdk-js。对于 Python,请安装 aws-durable-execution-sdk-python

后续步骤

部署您的持久性函数后:

  • 使用限定的 ARN(版本或别名)测试您的函数

  • 在 Lambda 控制台的“持久执行”选项卡下监控执行进度

  • 查看 Amazon CloudTrail 数据事件中的检查点操作

  • 查看 CloudWatch Logs 以了解函数输出和重放行为

有关使用 IaC 工具部署 Lambda 函数的更多信息,请参阅: