

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 为非数据库 AWS Secrets Manager 密钥设置自动轮换
<a name="rotate-secrets_turn-on-for-other"></a>

本教程介绍了如何为非数据库密钥设置 [通过 Lambda 函数进行轮换](rotate-secrets_lambda.md)。Rotation 是定期更新密钥的过程。轮换密钥时，会同时更新密钥以及拥有密钥的数据库或服务中的凭证。

有关数据库密钥的信息，请参阅 [自动轮换数据库密钥（控制台）](rotate-secrets_turn-on-for-db.md)。

**警告**  
要启用自动轮换，您必须有权为 Lambda 轮换函数创建 IAM 执行角色并向其附加权限策略。您需要拥有 `iam:CreateRole` 和 `iam:AttachRolePolicy` 两个权限。授予这些权限允许身份授予自己任何权限。

**Topics**
+ [步骤 1：创建通用轮换函数](#rotate-secrets_turn-on-for-other_create)
+ [步骤 2：编写轮换函数代码](#rotate-secrets_turn-on-for-other_write)
+ [步骤 3：配置密钥以进行轮换](#rotate-secrets_turn-on-for-other_configure)
+ [步骤 4：允许轮换函数访问 Secrets Manager 以及您的数据库或服务](#rotate-secrets_turn-on-for-other_perms)
+ [步骤 5：允许 Secrets Manager 调用轮换函数](#rotate-secrets_turn-on-for-other_perms2)
+ [步骤 6：为轮换函数设置网络访问](#rotate-secrets_turn-on-for-other_network)
+ [后续步骤](#rotate-secrets_turn-on-for-other_stepnext)

## 步骤 1：创建通用轮换函数
<a name="rotate-secrets_turn-on-for-other_create"></a>

首先，创建一个 Lambda 轮换函数。它不包含用于轮换您的密钥的代码，因此您将在后面的步骤中编写该代码。有关轮换函数如何工作的信息，请参阅 [Lambda 轮换函数](rotate-secrets_lambda-functions.md)。

在支持的区域中 AWS Serverless Application Repository ，您可以使用从模板创建函数。有关受支持区域的列表，请参阅[AWS Serverless Application Repository FAQs](https://aws.amazon.com/serverless/serverlessrepo/faqs/)。在其他区域，您将从头开始创建函数并将模板代码复制到函数中。

**创建通用轮换函数**

1. 要确定您所在的地区 AWS Serverless Application Repository 是否支持，请参阅《*AWS 一般参考*》中的[AWS Serverless Application Repository 终端节点和配额](https://docs.aws.amazon.com/general/latest/gr/serverlessrepo.html)。

1. 请执行以下操作之一：
   + 如果您 AWS Serverless Application Repository 所在的地区支持：

     1. 在 Lambda 控制台中，选择**应用程序**，然后选择**创建应用程序**。

     1. 在**创建应用程序**页面上，选择**无服务器应用程序**选项卡。

     1. 在**公用应用程序**下的搜索框中，输入 **SecretsManagerRotationTemplate**。

     1. 选择**显示创建自定义 IAM 角色或资源策略的应用程序**。

     1. 选择 **SecretsManagerRotationTemplate** 磁贴。

     1. 在**查看、配置和部署**页面上的**应用程序设置**磁贴中，填写必填字段。
        + 对于**端点**，输入您所在区域的端点，包括 **https://**。有关 终端节点的列表，请参阅[AWS Secrets Manager 端点](asm_access.md#endpoints)。
        + 要将 Lambda 函数放在 VPC 中，请添加 **vpcSecurityGroupID** 和。**vpcSubnetIds**

     1. 选择**部署**。
   + 如果您所在的地区 AWS Serverless Application Repository 不支持：

     1. 在 Lambda 控制台中，选择**函数**，然后选择**创建函数**。

     1. 在 **Create function (创建函数)** 页面上，执行以下操作：

        1. 选择**从头开始创作**。

        1. 在 **Function name**（函数名称）中，输入轮换函数的名称。

        1. 对于**运行时**，选择 **Python 3.10**。

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

## 步骤 2：编写轮换函数代码
<a name="rotate-secrets_turn-on-for-other_write"></a>

在此步骤中，您将编写用于更新密钥以及该密钥所针对的服务或数据库的代码。有关轮换函数作用的信息（包括编写自己的轮换函数的提示），请参阅 [Lambda 轮换函数](rotate-secrets_lambda-functions.md)。您可以使用 [轮换函数模板](reference_available-rotation-templates.md) 作为参考。

## 步骤 3：配置密钥以进行轮换
<a name="rotate-secrets_turn-on-for-other_configure"></a>

在此步骤中，您将为密钥设置轮换计划，并将轮换函数连接到密钥。

**配置轮换并创建空轮换函数**

1. 打开 Secrets Manager 控制台，网址为[https://console.aws.amazon.com/secretsmanager/](https://console.aws.amazon.com/secretsmanager/)。

1. 在**密钥**列表页上，选择您的密钥。

1. 在 **Secret details (密钥详细信息)** 页上的 **Rotation configuration (轮换配置)** 部分中，选择 **Edit rotation (编辑轮换)**。在**编辑轮换配置**对话框中，执行以下操作：

   1. 启用 **Automatic rotation**（自动轮换）。

   1. 在 **Rotation schedule**（轮换计划）下，在 **Schedule expression builder**（计划表达式生成器）或 **Schedule expression**（计划表达式）中，以 UTC 时区格式输入您的计划。Secrets Manager 会将您的计划存储为 `rate()` 或 `cron()` 表达式。轮换时段将自动从午夜开始，除非您指定 **Start time**（开始时间）。您可以每四小时轮换一次密钥。有关更多信息，请参阅 [轮换计划](rotate-secrets_schedule.md)。

   1. （可选）对于 **Window duration**（时段持续时间），选择您希望 Secrets Manager 在其间轮换密钥的时段长度，例如 **3h** 表示三个小时的时段。该时段不得延伸到下一个轮换时段。如果未指定 **Window duration**（时段持续时间），则对于以小时为单位的轮换计划，时段将在一小时后自动关闭。对于以天为单位的轮换计划，时段将在一天结束时自动关闭。

   1. （可选）请选择 **Rotate immediately when the secret is stored**（在存储密钥时立即轮换），以在保存更改时轮换密钥。如果您清除该复选框，则第一次轮换将按照您设置的计划开始。

   1. 在**轮换函数**下，选择在步骤 1 中创建的 Lambda 函数。

   1. 选择**保存**。

## 步骤 4：允许轮换函数访问 Secrets Manager 以及您的数据库或服务
<a name="rotate-secrets_turn-on-for-other_perms"></a>

Lambda 轮换函数需要权限才能访问 Secrets Manager 中的密钥，并且需要权限才能访问您的数据库或服务。在此步骤中，您将向 Lambda 执行角色授予这些权限。如果密钥使用 AWS 托管式密钥 `aws/secretsmanager` 以外的 KMS 密钥进行加密，则您需要向 Lambda 执行角色授予使用该密钥的权限。您可以使用 [SecretARN 加密上下文](security-encryption.md#security-encryption-encryption-context) 来限制解密函数的使用，从而确保轮换函数角色只能解密其负责轮换的密钥。有关策略示例，请参阅 [轮换权限](rotating-secrets-required-permissions-function.md)。

有关说明，请参阅 *AWS Lambda 开发人员指南*中的 [Lambda 执行角色](https://docs.aws.amazon.com/lambda/latest/dg/lambda-intro-execution-role.html)。

## 步骤 5：允许 Secrets Manager 调用轮换函数
<a name="rotate-secrets_turn-on-for-other_perms2"></a>

要允许 Secrets Manager 按照您设置的轮换计划调用轮换函数，您需要在 Lambda 函数的资源策略中向 Secrets Manager 服务主体授予 `lambda:InvokeFunction` 权限。

我们建议您在轮换函数的资源策略中包括上下文密钥 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount)，以防止 Lambda 被用作[混淆代理](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html)。对于某些 AWS 服务，为了避免混淆副手的情况， AWS 建议您同时使用[https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn)和[https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount)全局条件键。但如果轮换函数策略中包括 `aws:SourceArn` 条件，则轮换函数只能用于轮换该 ARN 指定的密钥。我们建议您仅在其中包括上下文键 `aws:SourceAccount`，以便对多个密钥使用轮换函数。

要将资源策略附加到 Lambda 函数，请参阅[将基于资源的策略用于 Lambda](https://docs.aws.amazon.com/lambda/latest/dg/access-control-resource-based.html)。

以下策略允许 Secrets Manager 调用 Lambda 函数。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Id": "default",
    "Statement": [
    {
        "Effect": "Allow",
        "Principal": {
            "Service": "secretsmanager.amazonaws.com"
            },
        "Action": "lambda:InvokeFunction",
        "Condition": {
            "StringEquals": {
                "AWS:SourceAccount": "123456789012"
            }
        },
        "Resource": "arn:aws:lambda:us-east-1:123456789012:function:function-name"
    }
    ]
}
```

------

## 步骤 6：为轮换函数设置网络访问
<a name="rotate-secrets_turn-on-for-other_network"></a>

在此步骤中，您将允许轮换函数连接到 Secrets Manager 以及该密钥所针对的服务或数据库。旋转函数必须能够访问两者才能轮换密钥。请参阅[AWS Lambda 轮换功能的网络接入](rotation-function-network-access.md)。

## 后续步骤
<a name="rotate-secrets_turn-on-for-other_stepnext"></a>

当在步骤 3 中配置轮换时，您会设置一个轮换密钥的计划。如果轮换在计划时失败，Secrets Manager 将多次尝试轮换。您也可以按照 [立即轮换密钥](rotate-secrets_now.md) 中的说明立即开始轮换。

如果轮换失败，请参阅 [轮换问题排查](troubleshoot_rotation.md)。