

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

AWS Lambda 持久函数需要特定 IAM 权限来运行和管理持久执行。遵循最低权限原则，仅授予每个主体所需的权限。

## 持久性函数的 IAM 权限
<a name="durable-iam-permissions"></a>

对于大多数持久执行 API 操作，Lambda 会根据持久执行 ARN（而不是函数 ARN）来授权请求​​。持久执行是函数版本的一个子资源，其 ARN 扩展了函数 ARN：

`arn:aws:lambda:{{region}}:{{account-id}}:function:{{function-name}}:{{qualifier}}/durable-execution/{{execution-name}}/{{execution-id}}`

持久执行 ARN 中的限定符始终是 `$LATEST` 或版本号。

如果您的策略在 Resource 元素中指定了未限定的函数 ARN，Lambda 将拒绝该请求，因为未限定的 ARN 永远不会与持久执行 ARN 匹配。要授予访问权限，请在函数 ARN 后附加限定符模式：
+ `arn:aws:lambda:us-east-1:123456789012:function:my-function:*`：匹配每个版本的持久执行。
+ `arn:aws:lambda:us-east-1:123456789012:function:my-function:1/durable-execution/*`：仅匹配版本 1 的持久执行。

大多数策略都使用 `:*` 形式，因为版本号会随着每次部署而变化。

**别名不适用于持久执行权限**  
您可以通过别名调用持久函数，但所生成的执行的 ARN 包含已解析的版本号。

### 执行角色权限
<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 创建函数，请将这些权限添加到您的执行角色中。

为了让 Lambda 代入执行角色，该角色的信任策略必须将 Lambda 服务主体 (`lambda.amazonaws.com`) 指定为可信服务。以下是信任策略示例，该策略授予 Lambda 代入角色的权限。

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

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

**Example 多个函数的限定范围权限**  

```
{
    "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-manage-permissions"></a>

Lambda 针对持久执行 ARN 授权 `lambda:GetDurableExecution`、`lambda:GetDurableExecutionHistory` 和 `lambda:StopDurableExecution` 操作。

要列出函数的持久执行，请使用 `lambda:ListDurableExecutionsByFunction`。Lambda 针对请求中的函数 ARN 授权此操作。以下规则适用于 ARN 匹配：
+ 授予非限定函数 ARN 的策略仅匹配使用非限定函数名称的请求。
+ 授予限定 ARN 的策略仅匹配使用限定函数名称的请求。

有关更多信息，请参阅 [在策略的“资源”部分中引用函数](lambda-api-permissions-ref.md#function-resources)。

为了匹配使用任一形式的函数名称发出的请求，请同时包含未限定和限定的函数 ARN，如下策略所示：

```
{
    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "ManageDurableExecutions",
            "Effect": "Allow",
            "Action": [
                "lambda:GetDurableExecution",
                "lambda:GetDurableExecutionHistory",
                "lambda:StopDurableExecution"
            ],
            "Resource": "arn:aws:lambda:us-east-1:123456789012:function:myDurableFunction:*"
        },
        {
            "Sid": "ListDurableExecutions",
            "Effect": "Allow",
            "Action": "lambda:ListDurableExecutionsByFunction",
            "Resource": [
                "arn:aws:lambda:us-east-1:123456789012:function:myDurableFunction",
                "arn:aws:lambda:us-east-1:123456789012:function:myDurableFunction:*"
            ]
        }
    ]
}
```

### 发送回调的权限
<a name="durable-callback-permissions"></a>

发送回调结果的外部系统使用 `lambda:SendDurableExecutionCallbackSuccess`、`lambda:SendDurableExecutionCallbackFailure` 和 `lambda:SendDurableExecutionCallbackHeartbeat` 操作。

```
{
    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "SendCallbacks",
            "Effect": "Allow",
            "Action": [
                "lambda:SendDurableExecutionCallbackSuccess",
                "lambda:SendDurableExecutionCallbackFailure",
                "lambda:SendDurableExecutionCallbackHeartbeat"
            ],
            "Resource": "arn:aws:lambda:us-east-1:123456789012:function:myDurableFunction:*"
        }
    ]
}
```

Lambda 会针对创建回调的持久执行的 ARN 授权回调请求。

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

Lambda 持久性函数会静态加密执行数据。每个函数执行都会保持独立的状态，其他执行无法访问该状态。您可以配置客户自主管理型密钥来加密持久性执行数据。有关更多信息，请参阅 [加密 AWS Lambda 持久性执行数据](durable-encryption.md)。

检查点数据包括：
+ 步骤结果和错误
+ 链式调用输入

有关静态加密的持久性执行数据的完整列表，请参阅[什么是加密？](durable-encryption.md#durable-encryption-what-is-encrypted)。

当 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)。对于持久函数而言，唯一的额外安全考虑因素就是本指南中所记录的 IAM 权限。