

# 创建 Lambda 持久性函数
<a name="durable-getting-started"></a>

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

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

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

Java（预览）中的持久性函数目前只能通过容器映像部署。有关通过容器映像创建持久性函数的更多信息，请参阅[持久性函数支持的运行时](durable-supported-runtimes.md)或[使用基础设施即代码部署 Lambda 持久性函数](durable-getting-started-iac.md)。

**注意**  
持久性函数目前支持 Python 和 Node.js（JavaScript/TypeScript）运行时和容器映像（OCI），如 Java。有关支持的运行时版本和容器映像选项的完整列表，请参阅[持久性函数支持的运行时](durable-supported-runtimes.md)。有关将容器映像与 Lambda 结合使用的更多信息，请参阅《Lambda 开发人员指南》中的[创建 Lambda 容器映像](https://docs.amazonaws.cn/lambda/latest/dg/images-create.html)。

**提示**  
要了解如何构建**无服务器解决方案**，请查看[无服务器开发人员指南](https://docs.amazonaws.cn/serverless/latest/devguide/)。

## 先决条件
<a name="durable-getting-started-prerequisites"></a>

### 注册 Amazon Web Services 账户
<a name="sign-up-for-aws"></a>

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

**注册 Amazon Web Services 账户**

1. 打开 [https://portal.aws.amazon.com/billing/signup](https://portal.amazonaws.cn/billing/signup)。

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

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

   当您注册 Amazon Web Services 账户 时，系统将会创建一个。*Amazon Web Services 账户根用户*根用户有权访问该账户中的所有 Amazon Web Services 服务 和资源。作为最佳安全实践，请为用户分配管理访问权限，并且只使用根用户来执行[需要根用户访问权限的任务](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_root-user.html#root-user-tasks)。

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

### 保护 IAM 用户
<a name="secure-an-admin"></a>

注册 Amazon Web Services 账户 后，启用多重身份验证（MFA）保护您的管理用户。有关说明，请参阅《IAM 用户指南》**中的 [为 IAM 用户启用虚拟 MFA 设备（控制台）](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_credentials_mfa_enable_virtual.html#enable-virt-mfa-for-iam-user)。

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

有关创建和保护 IAM 用户的更多信息，请参阅《IAM 用户指南》中的以下主题：**
+ [在您的 Amazon Web Services 账户中创建 IAM 用户](https://docs.amazonaws.cn//IAM/latest/UserGuide/id_users_create.html)
+ [适用于 Amazon 资源的访问权限管理](https://docs.amazonaws.cn/IAM/latest/UserGuide/access.html)
+ [基于 IAM 身份的策略示例](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies_examples.html)

## 使用控制台创建 Lambda 持久性函数
<a name="getting-started-create-durable-function"></a>

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

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

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

1. 打开 Lamba 控制台的 [Functions page](https://console.amazonaws.cn/lambda/home#/functions)（函数页面）。

1. 选择**创建函数**。

1. 选择**从头开始编写**。

1. 在**基本信息**窗格中，为**函数名称**输入 `myDurableFunction`。

1. 对于**运行时**，选择 **Node.js 24** 或 **Python 3.14**。

1. 选择**启用持久执行**。

Lambda 使用包含检查点操作（`lambda:CheckpointDurableExecutions` 和 `lambda:GetDurableExecutionState`）权限的[执行角色](lambda-intro-execution-role.md)创建您的持久性函数。

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

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

------
#### [ Node.js ]

**在控制台中修改代码**

1. 选择**节点**选项卡。

   在控制台的内置代码编辑器中，会显示 Lambda 创建的函数代码。如果代码编辑器中没有显示 **index.mjs** 选项卡，请在文件资源管理器中选择 **index.mjs**，如下图所示。  
![\[\]](http://docs.amazonaws.cn/lambda/latest/dg/images/durable-nodejs.png)

1. 将以下代码粘贴到 **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]
       };
     }
   );
   ```

1. 在**部署**部分，选择**部署**以更新函数的代码：  
![\[\]](http://docs.amazonaws.cn/lambda/latest/dg/images/getting-started-tutorial/deploy-console.png)

**了解持久性函数代码**  
在继续执行下一步之前，我们来查看一下函数代码并了解一些关键的持久性函数概念。
+ `withDurableExecution` 封装器：

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

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

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

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

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

------
#### [ Python ]

**在控制台中修改代码**

1. 选择**节点**选项卡。

   在控制台的内置代码编辑器中，会显示 Lambda 创建的函数代码。如果代码编辑器中没有显示 **lambda\$1function.py** 选项卡，请在文件资源管理器中选择 **lambda\$1function.py**，如下图所示。  
![\[\]](http://docs.amazonaws.cn/lambda/latest/dg/images/durable-python.png)

1. 将以下代码粘贴到 **lambda\$1function.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]
       }
   ```

1. 在**部署**部分，选择**部署**以更新函数的代码：  
![\[\]](http://docs.amazonaws.cn/lambda/latest/dg/images/getting-started-tutorial/deploy-console.png)

**了解持久性函数代码**  
在继续执行下一步之前，我们来查看一下函数代码并了解一些关键的持久性函数概念。
+ `@durable_execution` 修饰器：

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

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

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

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

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

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

------

## 使用控制台代码编辑器调用持久性函数
<a name="get-started-invoke-durable-manually"></a>

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

**要发布您的函数的版本**

1. 选择**版本**选项卡。

1. 选择 **새 버전 발행**。

1. 在**版本描述**中，输入 **Initial version**（可选）。

1. 选择**发布**。

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

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

**创建测试事件**

1. 在控制台代码编辑器的**测试事件**部分中，选择**创建测试事件**。  
![\[\]](http://docs.amazonaws.cn/lambda/latest/dg/images/getting-started-tutorial/test-event.png)

1. 对于**事件名称**，输入 **myTestEvent**。

1. 在**事件 JSON** 部分中，使用以下内容替换默认 JSON：

   ```
   {
     "orderId": "order-12345"
   }
   ```

1. 选择**保存**。

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

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

![\[\]](http://docs.amazonaws.cn/lambda/latest/dg/images/getting-started-tutorial/run-test-event.png)


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

**要查看您的持久性函数执行情况**

1. 选择**持久执行**选项卡。

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

1. 选择执行 ID 以查看详细信息，其中包括：
   + 显示每个步骤完成时间的执行时间表
   + 检查点历史记录
   + 等待期
   + 步骤结果

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

**在 CloudWatch Logs 中查看函数的调用记录**

1. 打开 CloudWatch 控制台的 [Log groups page](https://console.amazonaws.cn/cloudwatch/home#logs:)（日志组页面）。

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

1. 向下滚动，选择要查看的函数调用的**日志流**。  
![\[\]](http://docs.amazonaws.cn/lambda/latest/dg/images/log-stream.png)

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

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

## 清理
<a name="gettingstarted-durable-cleanup"></a>

使用完示例持久性函数后，请将其删除。您还可以删除存储函数日志的日志组以及控制台创建的[执行角色](lambda-intro-execution-role.md)。

**删除 Lambda 函数**

1. 打开 Lamba 控制台的 [Functions（函数）页面](https://console.amazonaws.cn/lambda/home#/functions)。

1. 选择您创建的函数。

1. 依次选择**操作**和**删除**。

1. 在文本输入字段中键入 **confirm**，然后选择**删除**。

**删除日志组**

1. 打开 CloudWatch 控制台的 [Log groups page](https://console.amazonaws.cn/cloudwatch/home#logs:)（日志组页面）。

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

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

1. 在 **Delete log group(s)**（删除日志组）对话框中，选择 **Delete**（删除）。

**删除执行角色**

1. 打开 Amazon Identity and Access Management (IAM) 控制台的 [Roles page](https://console.amazonaws.cn/iam/home?#/roles)（角色页面）。

1. 选择函数的执行角色（例如 `myDurableFunction-role-31exxmpl`）。

1. 选择**删除**。

1. 在**删除角色**对话框中，输入角色名称，然后选择**删除**。

## 其他资源和后续步骤
<a name="durable-getting-started-more-resources"></a>

现在，您已经使用控制台创建并测试了一个简单的持久性函数，请继续执行以下后续步骤：
+ 了解持久性函数的常见使用案例，包括分布式事务、订单处理和人工审查工作流程。请参见[示例](durable-examples.md)。
+ 了解如何使用 CloudWatch 指标和执行历史记录监控持久性函数的执行情况。请参见[监控和调试](durable-monitoring.md)。
+ 了解如何以同步和异步方式调用持久性函数，并管理长时间运行的执行过程。请参见[调用持久性函数](durable-invoking.md)。
+ 遵循编写确定性代码、管理检查点大小和优化成本的最佳实践。请参见[最佳实践](durable-best-practices.md)。
+ 了解如何在本地和云端测试持久性函数。请参见[测试持久性函数](durable-testing.md)。
+ 比较持久性函数与 Step Functions，了解每种方法何时最有效。请参阅[持久性函数或 Step Functions](durable-step-functions.md)。