

# 配置 Lambda 持久性函数
<a name="durable-configuration"></a>

要为您的 Lambda 函数启用持久执行，您需要配置特定的设置项，以控制您的函数运行的时长、状态数据的保留时长，以及所需的权限。

## 启用持久执行
<a name="durable-config-settings"></a>

要为您的 Lambda 函数启用持久执行，请在您的函数配置中配置 `DurableConfig`。此设置将控制执行超时、状态保留和版本控制行为。

------
#### [ AWS CLI ]

```
aws lambda update-function-configuration \
  --function-name my-durable-function \
  --durable-config '{
    "ExecutionTimeout": 3600,
    "RetentionPeriodInDays": 30,
    "AllowInvokeLatest": true
  }'
```

------
#### [ CloudFormation ]

```
Resources:
  MyDurableFunction:
    Type: AWS::Lambda::Function
    Properties:
      FunctionName: my-durable-function
      Runtime: nodejs18.x
      Handler: index.handler
      Code:
        ZipFile: |
          // Your durable function code
      DurableConfig:
        ExecutionTimeout: 3600
        RetentionPeriodInDays: 30
        AllowInvokeLatest: true
```

------

**配置参数：**
+ `ExecutionTimeout`：最长执行时间，以秒为单位（一年最多 31536000 秒）
+ `RetentionPeriodInDays`：将执行状态和历史记录保留的时长（1-365 天）
+ `AllowInvokeLatest`：是否允许调用 \$1LATEST 版本进行持久执行

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

除了标准 Lambda 执行角色之外，持久性函数还需要其他 IAM 权限。您的函数的执行角色必须包括状态管理和持久执行 API 的权限。

**所需的最低权限：**

```
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "lambda:InvokeFunction",
        "lambda:GetFunction",
        "lambda:ManageDurableState",
        "lambda:GetDurableExecution",
        "lambda:ListDurableExecutions"
      ],
      "Resource": "arn:aws:lambda:*:*:function:*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:PutLogEvents"
      ],
      "Resource": "arn:aws:logs:*:*:*"
    }
  ]
}
```

**CloudFormation 执行角色示例：**

```
DurableFunctionRole:
  Type: AWS::IAM::Role
  Properties:
    AssumeRolePolicyDocument:
      Version: '2012-10-17'
      Statement:
        - Effect: Allow
          Principal:
            Service: lambda.amazonaws.com
          Action: sts:AssumeRole
    ManagedPolicyArns:
      - arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
    Policies:
      - PolicyName: DurableFunctionPolicy
        PolicyDocument:
          Version: '2012-10-17'
          Statement:
            - Effect: Allow
              Action:
                - lambda:ManageDurableState
                - lambda:GetDurableExecution
                - lambda:ListDurableExecutions
              Resource: '*'
```

## 配置最佳实践
<a name="durable-config-best-practices"></a>

在配置持久性函数以供生产使用时，请遵循以下最佳实践：
+ **设置适当的执行超时**：根据工作流程的最大预期持续时间配置 `ExecutionTimeout`。请勿设置过长的超时时间，因为这会影响成本和资源分配。
+ **平衡保留期和存储成本**：根据您的调试和审计要求设置 `RetentionPeriodInDays`。延长保留期会增加存储成本。
+ **在生产环境中使用版本控制**：在生产环境中将 `AllowInvokeLatest` 设置为 `false`，并使用特定的函数版本或别名进行持久执行。
+ **监控状态大小**：大型状态对象会增加存储成本并可能影响性能。保持状态信息简洁，并将大量数据存储在外部存储中。
+ **配置适当的日志记录**：启用详细日志记录，以便对长时间运行的工作流程进行故障排除，但要注意日志量和成本。

**生产配置示例：**

```
{
  "ExecutionTimeout": 86400,
  "RetentionPeriodInDays": 7,
  "AllowInvokeLatest": false
}
```