

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

# 为用户设置交替轮换 AWS Secrets Manager
<a name="tutorials_rotation-alternating"></a>

在本教程中，您将学习如何为包含数据库凭证的秘密设置交替用户轮换。*Alternating users rotation*（交替用户轮换）是一种轮换策略，在该策略中，Secrets Manager 将克隆用户，然后替换被更新的那些用户凭证。如果您需要为密钥实现高可用性，则此策略是一个不错的选择，因为其中一个交替用户拥有数据库的最新凭证，而另一个则正在更新。有关更多信息，请参阅 [轮换策略：交替用户](rotation-strategy.md#rotating-secrets-two-users)。

要设置交替用户轮换，您需要两个秘密：
+ 其中一个秘密包含您想轮换的凭证。
+ 具有管理员凭证的第二个密钥。

  此用户有权克隆第一个用户并更改第一个用户的密码。在本教程中，您将让 Amazon RDS 为管理员用户创建此密钥。Amazon RDS 还会管理管理员密码轮换。有关更多信息，请参阅 [AWS Secrets Manager 密钥的托管轮换](rotate-secrets_managed.md)。

本教程的第一部分内容是介绍如何设置真实环境。为了向您展示轮换的工作原理，本教程使用了一个示例 Amazon RDS MySQL 数据库。为了安全起见，数据库位于限制入站互联网访问的 VPC 中。要通过互联网从本地电脑连接到数据库，请使用*堡垒主机*，它是 VPC 中可以连接到数据库的服务器，但也允许从互联网进行 SSH 连接。本教程中的堡垒主机是 Amazon EC2 实例，该实例的安全组会阻止其他类型的连接。

完成本教程后，我们建议您清理教程中的资源。请勿在生产环境中使用它们。

Secrets Manager 轮换使用 AWS Lambda 函数来更新密钥和数据库。有关使用 Lambda 函数的成本的信息，请参阅 [定价](intro.md#asm_pricing)。

**Topics**
+ [Permissions](#tutorials_rotation-alternating-permissions)
+ [先决条件](#tutorials_rotation-alternating-step-setup)
+ [步骤 1：创建 Amazon RDS 数据库用户](#tutorials_rotation-alternating-step-database)
+ [步骤 2：为用户凭证创建秘密](#tutorials_rotation-alternating_step-rotate)
+ [步骤 3：测试已轮换的秘密](#tutorials_rotation-alternating_step-test-secret)
+ [步骤 4：清理资源](#tutorials_rotation-alternating_step-cleanup)
+ [后续步骤](#tutorials_rotation-alternating_step-next)

## Permissions
<a name="tutorials_rotation-alternating-permissions"></a>

本教程的先决条件为，您需要对 AWS 账户的管理权限。在生产环境中，最佳实践是为每个步骤使用不同的角色。例如，具有数据库管理员权限的角色将创建 Amazon RDS 数据库，而具有网络管理员权限的角色将设置 VPC 和安全组。在执行教程步骤时，我们建议您继续使用相同身份。

有关如何在生产环境中设置权限的信息，请参阅 [的身份验证和访问控制 AWS Secrets Manager](auth-and-access.md)。

## 先决条件
<a name="tutorials_rotation-alternating-step-setup"></a>

**Topics**
+ [先决条件 A：Amazon VPC](#tutorials_rotation-alternating-step-vpc)
+ [先决条件 B：Amazon EC2 实例](#tutorials_rotation-alternating-step-setup_ec2)
+ [先决条件 C：Amazon RDS 数据库和管理员凭证的 Secrets Manager 密钥](#tutorials_rotation-alternating-step-database)
+ [先决条件 D：允许本地计算机连接到 EC2 实例](#tutorials_rotation-alternating-step-ec2connect)

### 先决条件 A：Amazon VPC
<a name="tutorials_rotation-alternating-step-vpc"></a>

在此步骤中，您将创建可在其中启动 Amazon RDS 数据库和 Amazon EC2 实例的 VPC。在后续步骤中，您将使用计算机通过互联网连接到堡垒机，然后连接到数据库，因此您需要允许来自 VPC 的流量。为此，Amazon VPC 会将互联网网关连接到 VPC 并在路由表中添加路由，以将发往 VPC 外部的流量发送到互联网网关。

在 VPC 中，您可以创建一个 Secrets Manager 端点和一个 Amazon RDS 端点。在稍后的步骤中设置自动轮换时，Secrets Manager 会在 VPC 内创建 Lambda 轮换函数，以便它可以访问数据库。Lambda 轮换函数还会调用 Secrets Manager 来更新密钥，并调用 Amazon RDS 来获取数据库连接信息。通过在 VPC 内创建终端节点，您可以确保从 Lambda 函数对 Secrets Manager 和 Amazon RDS 的调用不会离开 AWS 基础设施。相反，这些调用将被路由到 VPC 内的端点。

**创建 VPC**

1. 打开位于 [https://console.aws.amazon.com/vpc/](https://console.aws.amazon.com/vpc/) 的 Amazon VPC 控制台。

1. 选择**创建 VPC**。

1. 在 **Create VPC**（创建 VPC）页面上，选择 **VPC and more**（VPC 等）。

1. 在 **Name tag auto-generation**（名称标签自动生成）下的 **Auto-generate**（自动生成）下，输入 **SecretsManagerTutorial**。

1. 对于 **DNS options**（DNS 选项），请同时选择 **Enable DNS hostnames** 和 **Enable DNS resolution**。

1. 选择**创建 VPC**。

**在 VPC 内创建 Secrets Manager 端点**

1. 在 Amazon VPC 控制台的 **Endpoints**（端点）下，选择 **Create Endpoint**（创建端点）。

1. 在 **Endpoint settings**（端点设置）下，为 **Name**（名称）输入 **SecretsManagerTutorialEndpoint**。

1. 在 **Services**（服务）下，输入 **secretsmanager** 以筛选列表，然后在您的 AWS 区域中选择 Secrets Manager 端点。例如，在美国东部（弗吉尼亚州北部），选择 `com.amazonaws.us-east-1.secretsmanager`。

1. 对于 **VPC**，选择 **vpc\$1\$1\$1\$1 (SecretsManagerTutorial)**。

1. 对于 **Subnets**（子网），选择所有 **Availability Zones**（可用性区域），然后对于每个区域，选择要包含的 **Subnet ID**（子网 ID）。

1. 对于 **IP address type**（IP 地址类型），选择 **IPv4**。

1. 对于 **Security groups**（安全组），选择默认安全组。

1. 对于 **Policy**（策略），选择 **Full access**。

1. 选择**创建端点**。

**在 VPC 内创建 Amazon RDS 端点**

1. 在 Amazon VPC 控制台的 **Endpoints**（端点）下，选择 **Create Endpoint**（创建端点）。

1. 在 **Endpoint settings**（端点设置）下，为 **Name**（名称）输入 **RDSTutorialEndpoint**。

1. 在 **Services**（服务）下，输入 **rds** 以筛选列表，然后在您的 AWS 区域中选择 Amazon RDS 端点。例如，在美国东部（弗吉尼亚州北部），选择 `com.amazonaws.us-east-1.rds`。

1. 对于 **VPC**，选择 **vpc\$1\$1\$1\$1 (SecretsManagerTutorial)**。

1. 对于 **Subnets**（子网），选择所有 **Availability Zones**（可用性区域），然后对于每个区域，选择要包含的 **Subnet ID**（子网 ID）。

1. 对于 **IP address type**（IP 地址类型），选择 **IPv4**。

1. 对于 **Security groups**（安全组），选择默认安全组。

1. 对于 **Policy**（策略），选择 **Full access**。

1. 选择**创建端点**。

### 先决条件 B：Amazon EC2 实例
<a name="tutorials_rotation-alternating-step-setup_ec2"></a>

您在后续步骤中创建的 Amazon RDS 数据库将位于 VPC 中，因此要访问它，您需要堡垒主机。该堡垒主机也位于 VPC 中，但在稍后步骤中，您将配置一个安全组，以允许本地计算机使用 SSH 连接到堡垒主机。

**为堡垒主机创建 EC2 实例**

1. 打开位于 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) 的 Amazon EC2 控制台。

1. 选择 **Instances**（实例），然后选择 **Launch Instances**（启动实例）。

1. 在 **Name and tags**（名称和标签）下，对于 **Name**（名称），输入 **SecretsManagerTutorialInstance**。

1. 在 **Application and OS Images**（应用程序和操作系统映像）下，保留默认值 **Amazon Linux 2 AMI (HMV) Kernel 5.10**。

1. 在 **Instance type**（实例类型）下，保留默认值 **t2.micro**。

1. 在 **Key pair**（密钥对）下，选择 **Create key pair**（创建密钥对）。

   在 **Create key pair**（创建密钥对）对话框中，对于 **Key pair name**（密钥对名称），输入 **SecretsManagerTutorialKeyPair**，然后选择 **Create key pair**（创建密钥对）。

   此时会自动下载密钥对。

1. 在 **Network settings**（网络设置）下，选择 **Edit**（编辑），然后执行以下操作：

   1. 对于 **VPC**，选择 **vpc-\$1\$1\$1\$1 SecretsManagerTutorial**。

   1. 对于 **Auto-assign Public IP**（自动分配公有 IP），选择 **Enable**。

   1. 对于 **Firewall**（防火墙），选择 **Select existing security group**（选择现有安全组）。

   1. 对于 **Common security groups**（常见安全组），选择 **default**。

1. 选择**启动实例**。

### 先决条件 C：Amazon RDS 数据库和管理员凭证的 Secrets Manager 密钥
<a name="tutorials_rotation-alternating-step-database"></a>

在此步骤中，您将创建一个 Amazon RDS MySQL 数据库并对其进行配置，以便 Amazon RDS 创建包含管理员凭证的密钥。然后，Amazon RDS 会自动为您管理管理员密钥的轮换。有关更多信息，请参阅 [托管轮换](rotate-secrets_managed.md)。

在创建数据库过程中，请指定您在上一步中创建的堡垒主机。然后，Amazon RDS 会设置安全组，以便数据库和实例能够相互访问。您可向连接到实例的安全组添加规则，以允许您的本地计算机也连接到该实例。

**使用包含管理员凭证的 Secrets Manager 密钥创建 Amazon RDS 数据库**

1. 在 Amazon RDS 控制台中，选择 **Create database**（创建数据库）。

1. 在 **Engine options**（引擎选项）部分，为 **Engine type**（引擎类型）选择 **MySQL**。

1. 在 **Templates**（模板）部分，选择 **Free tier**。

1. 在 **Settings**（设置）部分，执行以下操作：

   1. 对于 **DB instance identifier**（数据库实例标识符），输入 **SecretsManagerTutorial**。

   1. 在 “**凭据设置”** 下，选择**中的管理主凭证。 AWS Secrets Manager**

1. 在 **Connectivity**（连接）部分，对于 **Computer resource**（计算机资源），选择 **Connect to an EC2 computer resource**（连接到 EC2 计算机资源），然后对于 **EC2 Instance**（EC2 实例），选择 **SecretsManagerTutorialInstance**。

1. 选择**创建数据库**。

### 先决条件 D：允许本地计算机连接到 EC2 实例
<a name="tutorials_rotation-alternating-step-ec2connect"></a>

在此步骤中，您将在“先决条件 B”中创建的 EC2 实例配置为允许本地计算机连接到该实例。为此，您将编辑 Amazon RDS 在“先决条件 C”中添加的安全组，使其包含允许您的计算机的 IP 地址与 SSH 连接的规则。该规则允许本地计算机（通过当前 IP 地址识别）通过 Internet 使用 SSH 连接到堡垒主机。

**允许本地计算机连接到 EC2 实例**

1. 打开位于 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) 的 Amazon EC2 控制台。

1. 在 EC2 实例上 **SecretsManagerTutorialInstance**，在 “**安全**” 选项卡上的 “**安全组**” 下，选择**sg-\$1\$1\$1 (ec2-rds-X)**。

1. 在 **Input rules**（输入规则）下，选择**Edit inbound rules**（编辑入站规则）。

1. 选择 **Add rule**（添加规则），然后对该规则执行以下操作：

   1. 对于**类型**，选择 **SSH**。

   1. 对于 **Source type**（源类型），选择 **My IP**。

## 步骤 1：创建 Amazon RDS 数据库用户
<a name="tutorials_rotation-alternating-step-database"></a>

首先，您需要一个用户，其凭证将被存储在秘密中。要创建用户，请使用管理员凭证登录 Amazon RDS 数据库。为简单起见，在本教程中，您将创建具有数据库完全权限的用户。在生产环境中，这并不常见，建议您遵循最低权限原则。

要连接到数据库，请使用 MySQL 客户端工具。在本教程中，您将使用基于 GUI 的应用程序 MySQL Workbench。要安装 MySQL Workbench，请参阅[下载 MySQL Workbench](http://dev.mysql.com/downloads/workbench/)。

要连接到数据库，请在 MySQL Workbench 中创建连接配置。对于配置，您需要获得来自 Amazon EC2 和 Amazon RDS 的一些信息。

**在 MySQL Workbench 中创建数据库连接**

1. 在 MySQL Workbench 中，选择 **MySQL Connections**（MySQL 连接）旁边的 (\$1) 按钮。

1. 在 **Setup New Connection**（设置新连接）对话框中，执行以下操作：

   1. 对于 **Connection Name**（连接名称），输入 **SecretsManagerTutorial**。

   1. 对于 **Connection Method**（连接方法），选择 **Standard TCP/IP over SSH**。

   1. 在 **Parameters**（参数）选项卡上，执行以下操作：

      1. 对于 **SSH Hostname**（SSH 主机名），输入 Amazon EC2 实例的公有 IP 地址。

         您可以通过选择实例在 Amazon EC2 控制台上找到 IP 地址**SecretsManagerTutorialInstance**。复制 “**公共 IPv4 DNS**” 下的 IP 地址。

      1. 对于 **SSH Username**（SSH 用户名），输入 **ec2-user**。

      1. 对于 **SSH Keyfile**，请选择您在前面的先决条件中下载的密钥对文件 **SecretsManagerTutorialKeyPair.pem**。

      1. 对于 **MySQL Hostname**（MySQL 主机名），输入 Amazon RDS 端点地址。

         您可以在 Amazon RDS 控制台上通过选择数据库实例 **secretsmanagertutorialdb** 查找端点地址。复制 **Endpoint**（端点）下的地址。

      1. 对于 **Username**（用户名），输入 **admin**。

   1. 选择**确定**。

**检索管理员密码**

1. 在 Amazon RDS 控制台中，导航到您的数据库。

1. 在 **Configuration**（配置）选项卡的 **Master Credentials ARN**（主凭证 ARN）下，选择 **Manage in Secrets Manager**（在 Secrets Manager 中管理）。

   此时将打开 Secrets Manager 控制台。

1. 在密钥详细信息页面上，选择 **Retrieve secret value**（检索密钥值）。

1. 密码显示在 **Secret value**（密钥值）部分中。

**创建数据库用户**

1. 在 MySQL 工作台中，选择连接**SecretsManagerTutorial**。

1. 输入从密钥中检索到的管理员密码。

1.  在 MySQL Workbench 中，在 **Query**（查询）窗口中，输入以下命令（包括强密码），然后选择 **Execute**（执行）。轮换函数使用 SELECT 测试更新的密钥，因此 **appuser** 必须至少具有该权限。

   ```
   CREATE DATABASE myDB;
   CREATE USER 'appuser'@'%' IDENTIFIED BY 'EXAMPLE-PASSWORD';
   GRANT SELECT ON myDB . * TO 'appuser'@'%';
   ```

   在 **Output**（输出）窗口中，您会看到这些命令执行成功。

## 步骤 2：为用户凭证创建秘密
<a name="tutorials_rotation-alternating_step-rotate"></a>

接下来，您将创建秘密，用于存储您刚创建的用户凭证。这是您将要轮换的秘密。启用自动轮换，要指示交替用户策略，您应选择一个单独的超级用户秘密，它应有权限更改第一个用户的密码。

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

1. 选择**存储新密钥**。

1. 在 **Choose secret type**（选择密钥类型）页面上，执行以下操作：

   1. 对于 **Secret type**（秘密类型），选择 **Credentials for Amazon RDS database**（Amazon RDS 数据库凭证）。

   1. 对于 **Credentials**（凭证），输入用户名 **appuser**，以及您为使用 MySQL Workbench 创建的数据库用户输入的密码。

   1. 对于 **Database**（数据库），选择 **secretsmanagertutorialdb**。

   1. 选择**下一步**。

1. 在 **Configure secret**（配置密钥）页面上，对于 **Secret name**（密钥名称），输入 **SecretsManagerTutorialAppuser**，然后选择 **Next**（下一步）。

1. 在 **Configure rotation**（配置轮换）页面上，执行以下操作：

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

   1. 对于 **Rotation schedule**（轮换计划），设置计划 **Days**（天数）：**2** 天，以及 **Duration**（持续时间）：**2h**。使 **Rotate immediately**（立即轮换）处于已选择状态。

   1. 对于 **Rotation function**（轮换函数），选择 **Create a rotation function**（创建轮换函数），然后对于函数名称，输入 **tutorial-alternating-users-rotation**。

   1. 对于**轮换策略**，选择**交替用户**，然后在**管理员凭证密钥**下，选择名为 **rds\$1cluster...**，并且**描述**包含您在本教程 **secretsmanagertutorial** 中所创建数据库的名称的密钥，例如 `Secret associated with primary RDS DB instance: arn:aws:rds:Region:AccountId:db:secretsmanagertutorial`。

   1. 选择**下一步**。

1. 在 **Review**（检查）页面上，选择 **Store**（存储）。

   Secrets Manager 会返回到密钥详细信息页面。您可以在该页面顶部查看轮换配置状态。Secrets CloudFormation Manager 用于创建资源，例如 Lambda 轮换函数和运行 Lambda 函数的执行角色。 CloudFormation 完成后，横幅将变**为预定轮换的 Secret**。第一次轮换已完成。

## 步骤 3：测试已轮换的秘密
<a name="tutorials_rotation-alternating_step-test-secret"></a>

在密钥轮换后，您可以检查该密钥是否包含有效凭证。秘密中的密码已从原始凭证发生更改。

**从秘密中检索新密码**

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

1. 选择 **Secrets**（秘密），然后选择秘密 **SecretsManagerTutorialAppuser**。

1. 在 **Secret details**（秘密详细信息）页面上，向下滚动并选择 **Retrieve secret value**（检索秘密值）。

1. 在 **Key/value**（键/值）表中，为 **password** 复制 **Secret value**（秘密值）。

**测试凭证**

1. 在 MySQL Workbench 中，右键单击该连接，**SecretsManagerTutorial**然后选择 “**编辑连接”**。

1. 在 **Manage Server Connections**（管理服务器连接）对话框中，对于 **Username**（用户名），输入 **appuser**，然后选择 **Close**（关闭）。

1. 回到 MySQL 工作台，选择连接**SecretsManagerTutorial**。

1. 在 **Open SSH Connection**（打开 SSH 连接）对话框中，对于 **Password**（密码），粘贴您从秘密中检索到的密码，然后选择 **OK**（确定）。

   如果凭证有效，则 MySQL Workbench 将打开至数据库的设计页面。

这表明秘密轮换是成功的。秘密中的凭证已更新，它是用于连接到数据库的有效密码。

## 步骤 4：清理资源
<a name="tutorials_rotation-alternating_step-cleanup"></a>

如果您想尝试另一种轮换策略*单用户轮换*，请跳过清理资源，然后转到 [为设置单用户轮换 AWS Secrets Manager](tutorials_rotation-single.md)。

否则，为了避免潜在费用，并删除有权访问互联网的 EC2 实例，请删除您在本教程及其先决条件中创建的以下资源：
+ Amazon RDS 数据库实例。有关说明，请参阅《*Amazon RDS 用户指南*》中的[删除数据库实例](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_DeleteInstance.html)。
+ Amazon EC2 实例。有关说明，请参阅《*Amazon EC2 用户指南*》中的[终止实例](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/terminating-instances.html#terminating-instances-console)。
+ Secrets Manager 秘密 `SecretsManagerTutorialAppuser`。有关说明，请参阅[删除密 AWS Secrets Manager 钥](manage_delete-secret.md)。
+ Secrets Manager 端点。有关说明，请参阅《*AWS PrivateLink 指南*》中的[删除 VPC 端点](https://docs.aws.amazon.com/vpc/latest/privatelink/delete-vpc-endpoint.html)。
+ VPC 端点。有关说明，请参阅《*AWS PrivateLink 指南*》中的[删除 VPC](https://docs.aws.amazon.com/vpc/latest/userguide/working-with-vpcs.html#VPC_Deleting)。

## 后续步骤
<a name="tutorials_rotation-alternating_step-next"></a>
+ 了解如何[在您的应用程序中检索密钥](retrieving-secrets.md)。
+ 了解[其他轮换计划](rotate-secrets_schedule.md)。