创建 Lambda 持久性函数
要开始使用 Lambda 持久性函数,请使用 Lambda 控制台创建持久性函数。您可以在几分钟内创建并部署一个持久性函数,该函数使用步骤和等待来演示基于检查点的执行。
在您执行教程的过程中,您将学习一些基本的持久性函数概念,例如如何使用 DurableContext 对象、如何通过步骤创建检查点以及如何使用等待功能来暂停执行。您还将了解到在您的函数在等待结束后恢复时,重放机制是如何运作的。
为了简单起见,本教程将向您展示如何使用 Python 或 Node.js 运行时创建函数。您可以使用这些解释性语言,在控制台的内置代码编辑器中直接编辑函数代码。
持久性函数目前支持 Python、Node.js(JavaScript/TypeScript)和 Java 运行时,以及容器映像(OCI)。有关支持的运行时版本和容器映像选项的完整列表,请参阅持久性函数支持的运行时。有关将容器映像与 Lambda 结合使用的更多信息,请参阅《Lambda 开发人员指南》中的创建 Lambda 容器映像。
使用控制台创建 Lambda 持久性函数
在此示例中,您的持久性函数通过多个步骤处理订单,并具有自动检查点机制。该函数采用包含订单 ID 的 JSON 对象,对其进行验证,处理付款,然后确认订单。每个步骤都会自动进行检查点操作,因此如果函数被中断,它会从最后完成的步骤处恢复执行。
您的函数还演示了一个等待操作,它会暂停执行一小段时间,以此来模拟等待外部确认的过程。
要使用控制台创建持久性函数
打开 Lamba 控制台的 Functions page(函数页面)。
-
选择创建函数。
-
选择从头开始编写。
-
在基本信息窗格中,为函数名称输入 myDurableFunction。
-
对于运行时,选择 Node.js 24 或 Python 3.14。
-
选择启用持久执行。
Lambda 使用包含检查点操作(lambda:CheckpointDurableExecution 和 lambda:GetDurableExecutionState)权限的执行角色创建您的持久性函数。
Lambda 运行时包括持久执行 SDK,因此您无需打包依赖项即可测试持久性函数。但是,我们建议将 SDK 包含在您的生产部署包中。这样可以确保版本一致性,并且可以避免可能影响函数的潜在运行时更新。
使用控制台的内置代码编辑器添加您的持久性函数代码。
- Node.js
-
在控制台中修改代码
-
选择节点选项卡。
在控制台的内置代码编辑器中,会显示 Lambda 创建的函数代码。如果代码编辑器中没有显示 index.mjs 选项卡,请在文件资源管理器中选择 index.mjs,如下图所示。
-
将以下代码粘贴到 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]
};
}
);
-
在部署部分,选择部署以更新函数的代码:
了解持久性函数代码
在继续执行下一步之前,我们来查看一下函数代码并了解一些关键的持久性函数概念。
-
withDurableExecution 封装器:
您的持久性函数使用 withDurableExecution 进行封装。此封装器通过提供 DurableContext 对象和管理检查点操作来实现持久执行。
-
DurableContext 对象:
您的函数会接收 DurableContext 而不是标准的 Lambda 上下文。此对象提供了用于执行诸如 step() 和 wait() 等持久操作的方法,这些操作会创建检查点。
-
步骤和检查点:
每次 context.step() 调用都会在执行前后创建一个检查点。如果您的函数被中断,它将从上次完成的检查点恢复。该函数不会重新执行已完成的步骤。它会改用它们存储的结果。
-
等待操作:
context.wait() 调用将暂停执行,但不会消耗计算资源。当等待完成时,Lambda 会再次调用您的函数并重放检查点日志,从而用存储的值替代已完成的步骤。
-
重放机制:
当您的函数在等待或中断后恢复时,Lambda 会从头开始运行您的代码。但是,已完成的步骤不会重新执行。Lambda 会从检查点日志中重放其结果。这就是为什么您的代码必须是确定性的。
- Python
-
在控制台中修改代码
-
选择节点选项卡。
在控制台的内置代码编辑器中,会显示 Lambda 创建的函数代码。如果代码编辑器中没有显示 lambda_function.py 选项卡,请在文件资源管理器中选择 lambda_function.py,如下图所示。
-
将以下代码粘贴到 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]
}
-
在部署部分,选择部署以更新函数的代码:
了解持久性函数代码
在继续执行下一步之前,我们来查看一下函数代码并了解一些关键的持久性函数概念。
-
@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。
要发布您的函数的版本
-
选择版本选项卡。
-
选择 새 버전 발행。
-
在版本描述中,输入 Initial version(可选)。
-
选择发布。
-
Lambda 会创建您的函数的版本 1。请注意,函数 ARN 现在在末尾包含 :1,表示这是版本 1。
现在,创建一个测试事件以发送到您的函数。该事件是一个 JSON 格式的文档,其中包含订单 ID。
创建测试事件
-
在控制台代码编辑器的测试事件部分中,选择创建测试事件。
-
对于事件名称,输入 myTestEvent。
-
在事件 JSON 部分中,使用以下内容替换默认 JSON:
{
"orderId": "order-12345"
}
-
选择保存。
要测试您的持久性函数并查看执行情况
在控制台代码编辑器的测试事件部分中,选择测试事件旁边的运行图标:
您的持久性函数开始执行。因为该函数包含一段10秒的等待时间,所以初始调用会快速完成,函数将在等待期结束后恢复执行。您可以在持久执行选项卡中查看执行进度。
要查看您的持久性函数执行情况
-
选择持久执行选项卡。
-
在列表中找到执行。执行将显示当前状态(正在运行、成功或失败)。
-
选择执行 ID 以查看详细信息,其中包括:
显示每个步骤完成时间的执行时间表
检查点历史记录
等待期
步骤结果
您还可以在 CloudWatch Logs 中查看函数的日志,以查看每个步骤的控制台输出。
在 CloudWatch Logs 中查看函数的调用记录
-
打开 CloudWatch 控制台的 Log groups page(日志组页面)。
-
选择函数 (/aws/lambda/myDurableFunction) 的日志组。
-
向下滚动,选择要查看的函数调用的日志流。
您应该能看到每次调用该函数时产生的日志条目,包括首次执行时的记录以及等待结束后进行的重放记录。
当您使用 DurableContext 中的记录器(如 context.logger 或 stepContext.logger)时,日志还会显示在 Lambda 控制台的持久执行和步骤视图中。这些日志可能需要一些时间才能加载。
清理
使用完示例持久性函数后,请将其删除。您还可以删除存储函数日志的日志组以及控制台创建的执行角色。
删除 Lambda 函数
-
打开 Lamba 控制台的 Functions(函数)页面。
-
选择您创建的函数。
-
依次选择操作和删除。
-
在文本输入字段中键入 confirm,然后选择删除。
删除日志组
-
打开 CloudWatch 控制台的 Log groups page(日志组页面)。
-
选择函数的日志组 (/aws/lambda/myDurableFunction)。
-
依次选择 Actions(操作)和 Delete log group(s)(删除日志组)。
-
在 Delete log group(s)(删除日志组)对话框中,选择 Delete(删除)。
删除执行角色
-
打开 AWS Identity and Access Management (IAM) 控制台的 Roles page(角色页面)。
-
选择函数的执行角色(例如 myDurableFunction-role-31exxmpl)。
-
选择删除。
-
在删除角色对话框中,输入角色名称,然后选择删除。
其他资源和后续步骤
现在,您已经使用控制台创建并测试了一个简单的持久性函数,请继续执行以下后续步骤:
-
了解持久性函数的常见使用案例,包括分布式事务、订单处理和人工审查工作流程。请参见示例。
-
了解如何使用 CloudWatch 指标和执行历史记录监控持久性函数的执行情况。请参见监控和调试。
-
了解如何以同步和异步方式调用持久性函数,并管理长时间运行的执行过程。请参见调用持久性函数。
-
遵循编写确定性代码、管理检查点大小和优化成本的最佳实践。请参见最佳实践。
-
了解如何在本地和云端测试持久性函数。请参见测试持久性函数。
-
比较持久性函数与 Step Functions,了解每种方法何时最有效。请参阅持久性函数或 Step Functions。