创建 Lambda 持久性函数 - Amazon Lambda
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

创建 Lambda 持久性函数

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

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

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

提示

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

先决条件

如果您还没有,Amazon Web Services 账户请完成以下步骤来创建一个。

注册 Amazon Web Services 账户
  1. 打开 https://portal.aws.amazon.com/billing/signup

  2. 按照屏幕上的说明操作。

    在注册时,将接到电话或收到短信,要求使用电话键盘输入一个验证码。

    当您注册 Amazon Web Services 账户 时,系统将会创建一个。Amazon Web Services 账户根用户根用户有权访问该账户中的所有 Amazon Web Services 服务 和资源。作为最佳安全实践,请为用户分配管理访问权限,并且只使用根用户来执行需要根用户访问权限的任务

注册过程完成后,Amazon 会向您发送一封确认电子邮件。在任何时候,您都可以通过转至 https://aws.amazon.com/ 并选择我的账户来查看当前的账户活动并管理您的账户。

注册 Amazon Web Services 账户 后,启用多重身份验证(MFA)保护您的管理用户。有关说明,请参阅《IAM 用户指南》中的 为 IAM 用户启用虚拟 MFA 设备(控制台)

要授予其他用户访问您的 Amazon Web Services 账户资源的权限,请创建 IAM 用户。为了保护您的 IAM 用户,请启用 MFA 并仅向 IAM 用户授予执行任务所需的权限。

有关创建和保护 IAM 用户的更多信息,请参阅《IAM 用户指南》中的以下主题:

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

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

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

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

  2. 选择创建函数

  3. 选择从头开始编写

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

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

  6. 选择启用持久执行

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

注意

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

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

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

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

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

    import { DurableContext, 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。所有持久操作都是同步方法调用。

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

持久性函数需要使用限定的 ARN 才能调用。在您能够调用持久性函数之前,请先发布一个版本。

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

  2. 选择 새 버전 발행

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

  4. 选择发布

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

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

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

    在 Lambda 控制台代码编辑器中创建测试事件按钮
  2. 对于 Event Name (事件名称),输入 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 函数的日志流列表。

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

清理

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

删除 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. 打开 Amazon Identity and Access Management (IAM) 控制台的 Roles page(角色页面)。

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

  3. 选择删除

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

其他资源和后续步骤

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

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

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

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

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

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