

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 設定 的交替使用者輪換 AWS Secrets Manager
<a name="tutorials_rotation-alternating"></a>

在此教學中，您將學習如何為包含資料庫憑證的秘密設定交替使用者輪換。*交替使用者輪換*是一種輪換策略，在該策略中，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**
+ [許可](#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)

## 許可
<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>

在此步驟中，您會建立 VPC，可在其中啟動 Amazon RDS 資料庫和 Amazon EC2 執行個體。在稍後的步驟中，您會使用電腦透過網際網路連線到堡壘，然後連線到資料庫，因此您需要允許流量傳出 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 地址識別) 透過網際網路使用 SSH 連線到堡壘主機。

**允許您的本機電腦連線到 EC2 執行個體**

1. 前往 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) 開啟 Amazon EC2 主控台。

1. 在 EC2 執行個體 **SecretsManagerTutorialInstance** **Security** (安全) 索引標籤的 **Security groups** (安全群組) 中，選擇 **sg-\$1\$1\$1 (ec2-rds-X)**。

1. 在 **Inbound Rules** (傳入規則) 中，選擇 **Edit inbound rules** (編輯傳入規則)。

1. 選擇 **Add rule** (新增規則)，然後針對該規則執行下列動作：

   1. 針對 **Type (類型)**，選擇 **SSH**。

   1. 針對 **Source type** (來源類型)，選擇 **My IP**。

## 步驟 1：建立 Amazon RDS 資料庫使用者
<a name="tutorials_rotation-alternating-step-database"></a>

首先，您需要其憑證存放在秘密中的使用者。若要建立使用者，請使用管理員憑證登入 Amazon RDS 資料庫。為簡單起見，在本教學中，您會建立具有資料庫完整許可的使用者。在生產環境中，這並不典型，建議您遵守最低權限原則。

若要連線至資料庫，請使用 MySQL 用戶端工具。在此教學中，您將使用 MySQL Workbench，這是一個 GUI 型應用程式。若要安裝 MySQL Workbench，請參閱 [Download MySQL Workbench](http://dev.mysql.com/downloads/workbench/) (下載 MySQL 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 主控台上，透過選擇 **SecretsManagerTutorialInstance** 執行個體來尋找 IP 地址。在 **Public IPv4 DNS** (公有 IPv4 DNS) 下複製 IP 地址。

      1. 對於 **SSH Username** (SSH 使用者名稱)，請輸入 **ec2-user**。

      1. 對於 **SSH Keyfile** (SSH 金鑰檔案)，請選擇您在之前的先決條件中下載的 **SecretsManagerTutorialKeyPair.pem** 金鑰對檔案。

      1. 對於 **MySQL Hostname** (MySQL 主機名稱)，請輸入 Amazon RDS 端點地址。

         您可以在 Amazon RDS 主控台上，透過選擇 **secretsmanagertutorialdb** 資料庫執行個體來尋找端點地址。在 **Endpoint** (端點) 下複製地址。

      1. 對於 **User name** (使用者名稱)，請輸入 **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 Workbench 中，選擇 **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. 前往以下位置開啟機密管理員控制台：[https://console.aws.amazon.com/secretsmanager/](https://console.aws.amazon.com/secretsmanager/)。

1. 選擇 **Store a new secret** (存放新機密)。

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 Manager 會使用 CloudFormation 建立資源，如 Lambda 輪換函數和執行 Lambda 函數的執行角色。在 CloudFormation 完成後，橫幅將變更為 **Secret scheduled for rotation** (排程輪換的秘密)。第一次輪換完成。

## 步驟 3：測試輪換的秘密
<a name="tutorials_rotation-alternating_step-test-secret"></a>

既然已輪換秘密，您可以檢查秘密是否包含有效的新憑證。秘密中的密碼已變更為原始憑證。

**從秘密中擷取新密碼**

1. 前往以下位置開啟機密管理員控制台：[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** 連線上按一下滑鼠右鍵，然後選擇 **Edit Connection** (編輯連線)。

1. 在 **Manage Server Connections** (管理伺服器連線) 對話方塊，對於 **Username** (使用者名稱)，請輸入 **appuser**，然後選擇 **Close** (關閉)。

1. 返回 MySQL Workbench 中，選擇 **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)。