

# Lambda 持久性函数的安全性和权限
<a name="durable-security"></a>

Lambda 持久性函数需要特定的 IAM 权限来管理检查点操作。遵循‌最低权限原则‌，仅授予您的函数所需的权限。

## 执行角色权限
<a name="durable-execution-role"></a>

您的持久性函数的执行角色需要具备创建检查点和检索执行状态的权限。以下策略显示了所需的最低权限：

```
{
    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "lambda:CheckpointDurableExecution",
                "lambda:GetDurableExecutionState"
            ],
            "Resource": "arn:aws:lambda:region:account-id:function:function-name:*"
        }
    ]
}
```

使用控制台创建持久性函数时，Lambda 会自动将这些权限添加到执行角色中。如果您使用 AWS CLI 或 AWS CloudFormation 创建函数，请将这些权限添加到您的执行角色中。

**最低权限原则**  
将 `Resource` 元素范围限定为特定的函数 ARN，而不是使用通配符。这使得执行角色仅限于对那些需要进行检查点操作的函数执行此类操作。

**示例：多个函数的限定范围权限**

```
{
    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "lambda:CheckpointDurableExecution",
                "lambda:GetDurableExecutionState"
            ],
            "Resource": [
                "arn:aws:lambda:us-east-1:123456789012:function:orderProcessor:*",
                "arn:aws:lambda:us-east-1:123456789012:function:paymentHandler:*"
            ]
        }
    ]
}
```

或者，您可以使用 AWS 托管策略 `AWSLambdaBasicDurableExecutionRolePolicy`，其中包括所需的持久执行权限以及 Amazon CloudWatch Logs 的基本 Lambda 执行权限。

## 状态加密
<a name="durable-state-encryption"></a>

Lambda 持久性函数自动使用 AWS 拥有的密钥启用静态加密，且不收取任何费用。每个函数执行都会保持独立的状态，其他执行无法访问该状态。客户自主管理型密钥（CMK）不受支持。

检查点数据包括：
+ 步骤结果和返回值
+ 执行进度和时间表
+ 等待状态信息

当 Lambda 读取或写入检查点数据时，所有数据在传输过程中都会使用 TLS 进行加密。

### 使用自定义序列化器和反序列化器进行自定义加密
<a name="durable-custom-encryption"></a>

对于关键的安全要求，您可以使用持久的 SDK 通过自定义序列化器和反序列化器（SerDer）来实施自己的加密和解密机制。这种方法能让您完全控制用于保护检查点数据的加密密钥和算法。

**重要**  
当您使用自定义加密时，您将无法在 Lambda 控制台和 API 响应中查看操作结果。检查点数据在执行历史记录中是以加密形式存在的，若不进行解密则无法进行查看。

您的函数的执行角色对自定义 SerDer 实施中所使用的 AWS KMS 密钥，需要 `kms:Encrypt` 和 `kms:Decrypt` 权限。

## CloudTrail 日志
<a name="durable-cloudtrail-logging"></a>

Lambda 将检查点操作记录为 AWS CloudTrail 中的数据事件。您可以使用 CloudTrail 来审计检查点创建的时间、跟踪执行状态的变化以及监控对持久执行数据的访问情况。

检查点操作显示在 CloudTrail 日志中，其事件名称如下：
+ `CheckpointDurableExecution`：在步骤完成并创建检查点时记录
+ `GetDurableExecutionState`：当 Lambda 在重放过程中检索执行状态时记录

要为持久性函数启用数据事件日志记录，请配置 CloudTrail 跟踪以记录 Lambda 数据事件。有关更多信息，请参阅《CloudTrail 用户指南》中的[记录数据事件](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/logging-data-events-with-cloudtrail.html)。

**示例：用于检查点操作的 CloudTrail 日志条目**

```
{
    "eventVersion": "1.08",
    "eventTime": "2024-11-16T10:30:45Z",
    "eventName": "CheckpointDurableExecution",
    "eventSource": "lambda.amazonaws.com",
    "requestParameters": {
        "functionName": "myDurableFunction",
        "executionId": "exec-abc123",
        "stepId": "step-1"
    },
    "responseElements": null,
    "eventType": "AwsApiCall"
}
```

## 跨账户注意事项
<a name="durable-cross-account-access"></a>

如果您跨 AWS 账户调用持久性函数，则调用账户需要 `lambda:InvokeFunction` 权限，但检查点操作始终会使用函数账户中的执行角色。调用账户无法直接访问检查点数据或执行状态。

这种隔离可确保检查点数据在函数的账户内始终处于安全状态，即便是在从外部账户调用时也是如此。

## 继承的 Lambda 安全功能
<a name="durable-inherited-security"></a>

持久性函数继承了 Lambda 的所有安全、治理和合规特性，包括 VPC 连接、环境变量加密、死信队列、预留并发、函数 URL、代码签名以及合规认证（如 SOC、PCI DSS、HIPAA 等）。

有关 Lambda 安全功能的详细信息，请参阅《Lambda 开发人员指南》中的 [AWS Lambda 中的安全性](https://docs.aws.amazon.com/lambda/latest/dg/lambda-security.html)。对于持久性函数而言，唯一的额外安全考虑因素就是本指南中所提及的检查点权限。