

# 使用 Amazon CLI 部署和调用 Lambda 持久性函数
<a name="durable-getting-started-cli"></a>

使用 Amazon CLI 通过强制性命令创建和部署 Lambda 持久性函数。这种方法能让您直接控制部署过程的每一个步骤。

## 先决条件
<a name="durable-cli-prerequisites"></a>
+ 安装和配置 Amazon CLI。有关说明，请参阅[安装 Amazon CLI](https://docs.amazonaws.cn/cli/latest/userguide/getting-started-install.html)。
+ 创建包含函数代码和持久执行 SDK 的部署包。
+ 创建具有检查点权限的 IAM 执行角色。

## 创建执行角色
<a name="durable-cli-create-role"></a>

创建一个 IAM 角色，赋予其执行基本 Lambda 任务和进行检查点操作的权限。

**创建执行角色**

1. 创建一个信任策略文档，该文档允许 Lambda 代入该角色。将其另存为 `trust-policy.json`：

   ```
   {
     "Version": "2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Principal": {
           "Service": "lambda.amazonaws.com"
         },
         "Action": "sts:AssumeRole"
       }
     ]
   }
   ```

1. 创建该角色：

   ```
   aws iam create-role \
     --role-name {{durable-function-role}} \
     --assume-role-policy-document file://trust-policy.json
   ```

1. 为检查点操作和基本执行附加持久执行策略：

   ```
   aws iam attach-role-policy \
     --role-name {{durable-function-role}} \
     --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicDurableExecutionRolePolicy
   ```

`AWSLambdaBasicDurableExecutionRolePolicy` 托管式策略包括检查点操作（`lambda:CheckpointDurableExecution` 和 `lambda:GetDurableExecutionState`）和基本 Lambda 执行所需的权限。

## 创建持久性函数
<a name="durable-cli-create-function"></a>

使用 `--durable-config` 参数创建您的持久性函数。

**要创建持久性函数**

1. 将包含依赖项的函数代码打包到 .zip 文件中：

   ```
   zip -r function.zip index.mjs node_modules/
   ```
**注意**  
对于基于 Java 的持久性函数，需将函数代码和依赖项编译为单个 .zip 文件或 Java Archive（JAR）文件。有关更多信息，请参阅[使用 .zip 或 JAR 文件归档部署 Java Lambda 函数](java-package.md)。

1. 创建启用了持久执行的函数：

   ```
   aws lambda create-function \
     --function-name {{myDurableFunction}} \
     --runtime nodejs22.x \
     --role {{arn:aws:iam::123456789012:role/durable-function-role}} \
     --handler index.handler \
     --zip-file fileb://function.zip \
     --durable-config '{"ExecutionTimeout": 3600, "RetentionPeriodInDays": 7}'
   ```

**注意**  
您只能在创建函数时启用持久执行。您无法对现有函数启用它。

## 发布版本
<a name="durable-cli-publish-version"></a>

虽然可以使用 `$LATEST` 版本限定符调用持久性函数，但是您必须始终使用指向稳定版本的限定 ARN，以确保代码的确定性执行。

```
aws lambda publish-version \
  --function-name {{myDurableFunction}} \
  --description "Initial version"
```

该命令将返回版本 ARN。注意 ARN 末尾的版本号（例如 `:1`）。

或者，创建指向版本的别名：

```
aws lambda create-alias \
  --function-name {{myDurableFunction}} \
  --name prod \
  --function-version 1
```

## 调用持久性函数
<a name="durable-cli-invoke"></a>

使用限定的 ARN（版本或别名）调用您的持久性函数。

**注意**  
**幂等调用：**为防止在重试失败的调用时重复执行，您可以提供一个执行名称来确保最多一次执行语义。有关详细信息，请参阅[幂等性](durable-execution-idempotency.md)。

**同步调用**  
对于在 15 分钟内完成的执行，请使用同步调用：

```
aws lambda invoke \
  --function-name {{myDurableFunction:1}} \
  --payload '{"orderId": "order-12345"}' \
  --cli-binary-format raw-in-base64-out \
  response.json
```

或者使用别名：

```
aws lambda invoke \
  --function-name {{myDurableFunction:prod}} \
  --payload '{"orderId": "order-12345"}' \
  --cli-binary-format raw-in-base64-out \
  response.json
```

**异步调用**  
对于长时间运行的执行，请使用异步调用：

```
aws lambda invoke \
  --function-name {{myDurableFunction:prod}} \
  --invocation-type Event \
  --payload '{"orderId": "order-12345"}' \
  --cli-binary-format raw-in-base64-out \
  response.json
```

通过异步调用方式，Lambda 会立即返回。函数将继续在后台执行。

**注意**  
您可以使用 `$LATEST` 在控制台中进行原型设计和测试。对于生产工作负载，请使用发布的版本或别名。

## 管理持久执行
<a name="durable-cli-manage-executions"></a>

使用以下命令管理和监控持久性函数执行。

**列出执行**  
列出持久性函数的所有执行情况：

```
aws lambda list-durable-executions-by-function \
  --function-name {{myDurableFunction}}
```

**获取执行详细信息**  
获取有关特定执行的详细信息：

```
aws lambda get-durable-execution \
  --durable-execution-arn {{arn:aws:lambda:us-east-1:123456789012:function:myDurableFunction:my-function-version/durable-execution/my-execution-name/my-execution-id}}
```

**获取执行历史记录**  
查看执行的检查点历史记录：

```
aws lambda get-durable-execution-history \
  --durable-execution-arn {{arn:aws:lambda:us-east-1:123456789012:function:myDurableFunction:my-function-version/durable-execution/my-execution-name/my-execution-id}}
```

**停止执行**  
停止正在运行的持久执行：

```
aws lambda stop-durable-execution \
  --durable-execution-arn {{arn:aws:lambda:us-east-1:123456789012:function:myDurableFunction:my-function-version/durable-execution/my-execution-name/my-execution-id}}
```

## 更新函数代码
<a name="durable-cli-update-function"></a>

更新您的持久性函数代码并发布新版本：

**要更新并发布新版本**

1. 更新函数代码：

   ```
   aws lambda update-function-code \
     --function-name {{myDurableFunction}} \
     --zip-file fileb://function.zip
   ```

1. 等待更新完成：

   ```
   aws lambda wait function-updated \
     --function-name {{myDurableFunction}}
   ```

1. 发布新版本：

   ```
   aws lambda publish-version \
     --function-name {{myDurableFunction}} \
     --description "Updated order processing logic"
   ```

1. 更新别名以指向新版本：

   ```
   aws lambda update-alias \
     --function-name {{myDurableFunction}} \
     --name prod \
     --function-version 2
   ```

**重要**  
正在运行的执行继续使用其最初的版本。新的调用将使用更新的别名版本。

## 查看函数日志
<a name="durable-cli-view-logs"></a>

在 CloudWatch Logs 中查看您的持久性函数日志：

```
aws logs tail /aws/lambda/myDurableFunction --follow
```

筛选特定执行的日志：

```
aws logs filter-log-events \
  --log-group-name /aws/lambda/myDurableFunction \
  --filter-pattern "exec-abc123"
```

## 清理资源
<a name="durable-cli-cleanup"></a>

删除您的持久性函数和相关资源：

```
# Delete the function
aws lambda delete-function --function-name {{myDurableFunction}}

# Delete the IAM role policies
aws iam detach-role-policy \
  --role-name {{durable-function-role}} \
  --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole

aws iam detach-role-policy \
  --role-name {{durable-function-role}} \
  --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicDurableExecutionRolePolicy

# Delete the role
aws iam delete-role --role-name {{durable-function-role}}
```

## 后续步骤
<a name="durable-cli-next-steps"></a>

使用 Amazon CLI 命令部署您的持久性函数后：
+ 使用 `list-durable-executions-by-function` 和 `get-durable-execution` 命令监控执行情况
+ 查看 Amazon CloudTrail 数据事件中的检查点操作
+ 为执行故障或长时间运行的执行设置 CloudWatch 警报
+ 使用 shell 脚本或 CI/CD 管道自动部署

有关 Lambda 的 Amazon CLI 命令的更多信息，请参阅 [Amazon CLI 命令参考](https://docs.amazonaws.cn/cli/latest/reference/lambda/index.html)。