View a markdown version of this page

创建 Lambda 持久性函数 - AWS Lambda

创建 Lambda 持久性函数

要开始使用 Lambda 持久性函数,请使用 Lambda 控制台创建持久性函数。您可以在几分钟内创建并部署一个持久性函数,该函数使用步骤和等待来演示基于检查点的执行。

您还可以使用 AWS CLI 或基础设施即代码(IaC)创建持久函数。

在您执行教程的过程中,您将学习一些基本的持久性函数概念,例如如何使用 DurableContext 对象、如何通过步骤创建检查点以及如何使用等待功能来暂停执行。您还将了解到在您的函数在等待结束后恢复时,重放机制是如何运作的。

为了简单起见,本教程将向您展示如何使用 Python 或 Node.js 运行时创建函数。您可以使用这些解释性语言,在控制台的内置代码编辑器中直接编辑函数代码。

注意

持久性函数目前支持 Python、Node.js(JavaScript/TypeScript)和 Java 运行时,以及容器映像(OCI)。有关支持的运行时版本和容器映像选项的完整列表,请参阅持久性函数支持的运行时。有关将容器映像与 Lambda 结合使用的更多信息,请参阅《Lambda 开发人员指南》中的创建 Lambda 容器映像。

提示

要了解如何构建无服务器解决方案,请查看无服务器开发人员指南。

使用控制台创建 Lambda 持久性函数

在此示例中,您的持久性函数通过多个步骤处理订单,并具有自动检查点机制。该函数采用包含订单 ID 的 JSON 对象,对其进行验证,处理付款,然后确认订单。每个步骤都会自动进行检查点操作,因此如果函数被中断,它会从最后完成的步骤处恢复执行。

您的函数还演示了一个等待操作,它会暂停执行一小段时间,以此来模拟等待外部确认的过程。

要使用控制台创建持久性函数
  1. 打开 Lamba 控制台的 Functions page(函数页面)。

  2. 选择创建函数。

  3. 选择从头开始编写。

  4. 在基本信息窗格中,为函数名称输入 myDurableFunction。

  5. 对于运行时,选择 Node.js 24 或 Python 3.14。

  6. 选择启用持久执行。

Lambda 使用包含检查点操作(lambda:CheckpointDurableExecution 和 lambda:GetDurableExecutionState)权限的执行角色创建您的持久性函数。

注意

Lambda 运行时包括持久执行 SDK,因此您无需打包依赖项即可测试持久性函数。但是,我们建议将 SDK 包含在您的生产部署包中。这样可以确保版本一致性,并且可以避免可能影响函数的潜在运行时更新。

使用控制台的内置代码编辑器添加您的持久性函数代码。

Node.js
在控制台中修改代码
  1. 选择节点选项卡。

    在控制台的内置代码编辑器中,会显示 Lambda 创建的函数代码。如果代码编辑器中没有显示 index.mjs 选项卡,请在文件资源管理器中选择 index.mjs,如下图所示。

    该示意图显示了控制台代码编辑器和文件资源管理器中的 index.mjs 文件。
  2. 将以下代码粘贴到 index.mjs 选项卡中,替换 Lambda 创建的代码。

    import { 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] }; } );
  3. 在部署部分,选择部署以更新函数的代码:

    Lambda 控制台代码编辑器中的“部署”按钮
了解持久性函数代码

在继续执行下一步之前,我们来查看一下函数代码并了解一些关键的持久性函数概念。

  • withDurableExecution 封装器:

    您的持久性函数使用 withDurableExecution 进行封装。此封装器通过提供 DurableContext 对象和管理检查点操作来实现持久执行。

  • DurableContext 对象:

    您的函数会接收 DurableContext 而不是标准的 Lambda 上下文。此对象提供了用于执行诸如 step() 和 wait() 等持久操作的方法,这些操作会创建检查点。

  • 步骤和检查点:

    每次 context.step() 调用都会在执行前后创建一个检查点。如果您的函数被中断,它将从上次完成的检查点恢复。该函数不会重新执行已完成的步骤。它会改用它们存储的结果。

  • 等待操作:

    context.wait() 调用将暂停执行,但不会消耗计算资源。当等待完成时,Lambda 会再次调用您的函数并重放检查点日志,从而用存储的值替代已完成的步骤。

  • 重放机制:

    当您的函数在等待或中断后恢复时,Lambda 会从头开始运行您的代码。但是,已完成的步骤不会重新执行。Lambda 会从检查点日志中重放其结果。这就是为什么您的代码必须是确定性的。

Python
在控制台中修改代码
  1. 选择节点选项卡。

    在控制台的内置代码编辑器中,会显示 Lambda 创建的函数代码。如果代码编辑器中没有显示 lambda_function.py 选项卡,请在文件资源管理器中选择 lambda_function.py,如下图所示。

    该示意图显示了控制台代码编辑器和文件资源管理器中的 lambda_function.py 文件。
  2. 将以下代码粘贴到 lambda_function.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] }
  3. 在部署部分,选择部署以更新函数的代码:

    Lambda 控制台代码编辑器中的“部署”按钮
了解持久性函数代码

在继续执行下一步之前,我们来查看一下函数代码并了解一些关键的持久性函数概念。

  • @durable_execution 修饰器:

    您的处理函数使用 @durable_execution 进行修饰。此修饰器通过提供 DurableContext 对象和管理检查点操作来实现持久执行。

  • @durable_step 修饰器:

    每个步骤函数都使用 @durable_step 进行修饰。此修饰器将该函数标记为创建检查点的持久步骤。

  • DurableContext 对象:

    您的函数会接收 DurableContext 而不是标准的 Lambda 上下文。此对象提供了用于执行诸如 step() 和 wait() 等持久操作的方法,这些操作会创建检查点。

  • 步骤和检查点:

    每次 context.step() 调用都会在执行前后创建一个检查点。如果您的函数被中断,它将从上次完成的检查点恢复。该函数不会重新执行已完成的步骤。它会改用它们存储的结果。

  • 等待操作:

    context.wait() 调用将暂停执行,但不会消耗计算资源。当等待完成时,Lambda 会再次调用您的函数并重放检查点日志,从而用存储的值替代已完成的步骤。

  • Python SDK 是同步的:

    请注意,Python SDK 不使用 await。所有持久操作都是同步方法调用。

使用控制台代码编辑器调用持久性函数

如果未指定(或发布)显式版本,则控制台使用 $LATEST 版本限定符调用持久性函数。但是,为了确定性地执行代码,必须始终使用指向稳定版本的限定 ARN。

要发布您的函数的版本
  1. 选择版本选项卡。

  2. 选择 새 버전 발행。

  3. 在版本描述中,输入 Initial version(可选)。

  4. 选择发布。

  5. Lambda 会创建您的函数的版本 1。请注意,函数 ARN 现在在末尾包含 :1,表示这是版本 1。

现在,创建一个测试事件以发送到您的函数。该事件是一个 JSON 格式的文档,其中包含订单 ID。

创建测试事件
  1. 在控制台代码编辑器的测试事件部分中,选择创建测试事件。

    在 Lambda 控制台代码编辑器中创建测试事件按钮
  2. 对于事件名称,输入 myTestEvent。

  3. 在事件 JSON 部分中,使用以下内容替换默认 JSON:

    { "orderId": "order-12345" }
  4. 选择保存。

要测试您的持久性函数并查看执行情况

在控制台代码编辑器的测试事件部分中,选择测试事件旁边的运行图标:

在 Lambda 控制台代码编辑器中运行测试事件按钮。

您的持久性函数开始执行。因为该函数包含一段10秒的等待时间,所以初始调用会快速完成,函数将在等待期结束后恢复执行。您可以在持久执行选项卡中查看执行进度。

要查看您的持久性函数执行情况
  1. 选择持久执行选项卡。

  2. 在列表中找到执行。执行将显示当前状态(正在运行、成功或失败)。

  3. 选择执行 ID 以查看详细信息,其中包括:

    • 显示每个步骤完成时间的执行时间表

    • 检查点历史记录

    • 等待期

    • 步骤结果

您还可以在 CloudWatch Logs 中查看函数的日志,以查看每个步骤的控制台输出。

在 CloudWatch Logs 中查看函数的调用记录
  1. 打开 CloudWatch 控制台的 Log groups page(日志组页面)。

  2. 选择函数 (/aws/lambda/myDurableFunction) 的日志组。

  3. 向下滚动,选择要查看的函数调用的日志流。

    Lambda 函数的日志流列表。

    您应该能看到每次调用该函数时产生的日志条目,包括首次执行时的记录以及等待结束后进行的重放记录。

注意

当您使用 DurableContext 中的记录器(如 context.logger 或 stepContext.logger)时,日志还会显示在 Lambda 控制台的持久执行和步骤视图中。这些日志可能需要一些时间才能加载。

清理

使用完示例持久性函数后,请将其删除。您还可以删除存储函数日志的日志组以及控制台创建的执行角色。

删除 Lambda 函数
  1. 打开 Lamba 控制台的 Functions(函数)页面。

  2. 选择您创建的函数。

  3. 依次选择操作和删除。

  4. 在文本输入字段中键入 confirm,然后选择删除。

删除日志组
  1. 打开 CloudWatch 控制台的 Log groups page(日志组页面)。

  2. 选择函数的日志组 (/aws/lambda/myDurableFunction)。

  3. 依次选择 Actions(操作)和 Delete log group(s)(删除日志组)。

  4. 在 Delete log group(s)(删除日志组)对话框中,选择 Delete(删除)。

删除执行角色
  1. 打开 AWS Identity and Access Management (IAM) 控制台的 Roles page(角色页面)。

  2. 选择函数的执行角色(例如 myDurableFunction-role-31exxmpl)。

  3. 选择删除。

  4. 在删除角色对话框中,输入角色名称,然后选择删除。

其他资源和后续步骤

现在,您已经使用控制台创建并测试了一个简单的持久性函数,请继续执行以下后续步骤:

  • 了解持久性函数的常见使用案例,包括分布式事务、订单处理和人工审查工作流程。请参见示例。

  • 了解如何使用 CloudWatch 指标和执行历史记录监控持久性函数的执行情况。请参见监控和调试。

  • 了解如何以同步和异步方式调用持久性函数,并管理长时间运行的执行过程。请参见调用持久性函数。

  • 遵循编写确定性代码、管理检查点大小和优化成本的最佳实践。请参见最佳实践。

  • 了解如何在本地和云端测试持久性函数。请参见测试持久性函数。

  • 比较持久性函数与 Step Functions,了解每种方法何时最有效。请参阅持久性函数或 Step Functions。