

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

# 由 Lambda 函式輪換
<a name="rotate-secrets_lambda"></a>

對於許多類型的秘密，Secrets Manager 會使用 AWS Lambda 函數來更新秘密和資料庫或服務。如需有關使用 Lambda 函數成本的資訊，請參閱 [定價](intro.md#asm_pricing)。

對於部分 [由其他服務管理的秘密](service-linked-secrets.md)，您可以使用*受管輪換*。若要使用 [受管輪換](rotate-secrets_managed.md)，您可以先透過管理服務建立機密。

輪換期間，Secrets Manager 會記錄表示輪換狀態的事件。如需詳細資訊，請參閱[使用 記錄 AWS Secrets Manager 事件 AWS CloudTrail](monitoring-cloudtrail.md)。

若要輪換秘密，Secrets Manager 會根據您設定的輪換排程呼叫 [ Lambda 函數](rotate-secrets_lambda-functions.md)。如果您在設定自動輪換時也手動更新機密值，則 Secrets Manager 會在計算下一個輪替日期時將其視為有效輪換。

輪換期間，Secrets Manager 會多次呼叫相同的函數，且每次使用不同的參數。Secrets Manager 使用參數的下列 JSON 請求結構來叫用函數：

```
{
    "Step" : "request.type",
    "SecretId" : "string",
    "ClientRequestToken" : "string",
    "RotationToken" : "string"
}
```

**參數：**
+ **步驟** – 輪換步驟：`create_secret`、`test_secret`、 `set_secret`或 `finish_secret`。如需詳細資訊，請參閱[輪換函數中的四個步驟](rotate-secrets_lambda-functions.md#rotate-secrets_lambda-functions-code)。
+ **SecretId** – 要輪換之秘密的 ARN。
+ **ClientRequestToken** – 新版本秘密的唯一識別符。此值有助於確保冪等性。如需詳細資訊，請參閱 *AWS Secrets Manager API 參考*中的 [PutSecretValue： ClientRequestToken](https://docs.aws.amazon.com/secretsmanager/latest/apireference/API_PutSecretValue.html#SecretsManager-PutSecretValue-request-ClientRequestToken)。
+ **RotationToken** – 指出請求來源的唯一識別符。使用擔任的角色或跨帳戶輪換進行秘密輪換時需要，您可以在其中使用另一個帳戶中的 Lambda 輪換函數輪換一個帳戶中的秘密。在這兩種情況下，輪換函數會擔任 IAM 角色來呼叫 Secrets Manager，然後 Secrets Manager 會使用輪換字符來驗證 IAM 角色身分。

如果任何輪換步驟失敗，Secrets Manager 會多次重試整個輪換過程。

**Topics**
+ [資料庫秘密的自動輪換 (主控台)](rotate-secrets_turn-on-for-db.md)
+ [非資料庫秘密的自動輪換 （主控台）](rotate-secrets_turn-on-for-other.md)
+ [自動輪換 (AWS CLI)](rotate-secrets_turn-on-cli.md)
+ [Lambda 函數輪換策略](rotation-strategy.md)
+ [Lambda 輪換函數](rotate-secrets_lambda-functions.md)
+ [輪換函數範本](reference_available-rotation-templates.md)
+ [輪換的許可](rotating-secrets-required-permissions-function.md)
+ [AWS Lambda 輪換函數的網路存取](rotation-function-network-access.md)
+ [輪換疑難排解](troubleshoot_rotation.md)

# 設定 Amazon RDS、Amazon Aurora、Amazon Redshift 或 Amazon DocumentDB 秘密的自動輪換
<a name="rotate-secrets_turn-on-for-db"></a>

本教學課程說明如何設定[由 Lambda 函式輪換](rotate-secrets_lambda.md)資料庫秘密。輪換是定期更新機密的過程。當您輪換機密時，會更新機密和資料庫中的憑證。在 Secrets Manager 中，您可以為資料庫秘密設定自動輪換。

若要使用主控台設定輪換，您必須先選擇輪換策略。接著設定秘密進行輪換，如果您還沒有 Lambda 輪換函數，這會建立一個。主控台也會為 Lambda 函數執行角色設定許可。最後一步是確保 Lambda 輪換函數可以透過網路，存取 Secrets Manager 和您的資料庫。

**警告**  
若要開啟自動輪換，您必須擁有為 Lambda 輪換函數建立 IAM 執行角色並將其連接許可政策的許可。您同時需要 `iam:CreateRole` 和 `iam:AttachRolePolicy` 許可。授予這些許可可讓身分授予自己任何許可。

**Topics**
+ [步驟 1：選擇輪換策略並 (選擇性) 建立超級使用者秘密](#rotate-secrets_turn-on-for-db_step1)
+ [步驟 2：設定輪換並建立輪換函數](#rotate-secrets_turn-on-for-db_step2)
+ [步驟 3：(選用) 對輪換函數設定其他許可條件](#rotate-secrets_turn-on-for-db_step3)
+ [步驟 4：為輪換函數設定網路存取](#rotate-secrets_turn-on-for-db_step4)
+ [後續步驟](#rotate-secrets_turn-on-for-db_stepnext)

## 步驟 1：選擇輪換策略並 (選擇性) 建立超級使用者秘密
<a name="rotate-secrets_turn-on-for-db_step1"></a>

如需 Secrets Manager 所提供策略的相關資訊，請參閱 [Lambda 函數輪換策略](rotation-strategy.md)。

如果您選擇*交替使用者策略*，必須[建立秘密](create_secret.md)，並在其中儲存資料庫超級使用者憑證。您需要具有超級使用者憑證的秘密，因為輪換會複製第一個使用者，而大多數使用者沒有該許可。請注意，Amazon RDS Proxy 不支援交替使用者策略。

## 步驟 2：設定輪換並建立輪換函數
<a name="rotate-secrets_turn-on-for-db_step2"></a>

**若要為 Amazon RDS、Amazon DocumentDB 或 Amazon Redshift 秘密開啟輪換**

1. 前往以下位置開啟機密管理員控制台：[https://console.aws.amazon.com/secretsmanager/](https://console.aws.amazon.com/secretsmanager/)。

1. 在 **Secrets** (機密) 頁面中，選擇機密。

1. 在 **Secret details (機密詳細資訊)** 頁面的 **Rotation configuration (輪換組態)** 區段中，選擇 **Edit rotation (編輯輪換)**。

1. 在 **Edit rotation configuration** (編輯輪換組態) 對話方塊中，執行以下動作：

   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** (存放秘密時立即輪換) 以在儲存變更時輪換您的秘密。如果清除核取方塊，則第一次輪換將按照您設定的排程開始。

      如果輪換失敗，例如因為步驟 3 和 4 尚未完成，Secrets Manager 會多次重試輪換流程。

   1. 在 **Rotation function** (輪換函數) 下，請執行下列其中一項：
      + 選擇 **Create a new Lambda function** (新建 Lambda 函數)，然後輸入新函數的名稱。Secrets Manager 會將 `SecretsManager` 新增到函數名稱的開頭。Secrets Manager 會根據適當的[範本](reference_available-rotation-templates.md)建立函數，並為 Lambda 執行角色設定必要的[許可](rotating-secrets-required-permissions-function.md)。
      + 選擇 **Use an existing Lambda function** (使用現有的 Lambda 函數)，重複使用您用於其他秘密的輪換函數。**Recommended VPC configurations** (建議的 VPC 組態) 下列出的輪換函數，與資料庫具有相同的 VPC 和安全群組，有助於函數存取資料庫。

   1. 對於**輪換策略**，選擇**單一使用者**或**交替使用者**策略。如需詳細資訊，請參閱[步驟 1：選擇輪換策略並 (選擇性) 建立超級使用者秘密](#rotate-secrets_turn-on-for-db_step1)。

1. 選擇 **Save** (儲存)。

## 步驟 3：(選用) 對輪換函數設定其他許可條件
<a name="rotate-secrets_turn-on-for-db_step3"></a>

在輪換函數的資源政策中，我們建議您包含內容金鑰 [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`，以便可以將輪換函數用於多個秘密。

**若要更新輪換函數資源政策**

1. 在 Secrets Manager 主控台中，選擇您的秘密，然後在詳細資訊頁面的 **Rotation configuration** (輪換組態) 之下，選擇 Lambda 輪換函數。Lambda 主控台開啟。

1. 遵循[將資源型政策用於 Lambda](https://docs.aws.amazon.com/lambda/latest/dg/access-control-resource-based.html) 中的指示，新增 `aws:sourceAccount` 條件。

   ```
   "Condition": {
       "StringEquals": {
           "AWS:SourceAccount": "123456789012"
       }
   },
   ```

如果使用 KMS 金鑰而不是 AWS 受管金鑰 `aws/secretsmanager` 為秘密加密，Secrets Manager 便會授予 Lambda 執行角色使用該金鑰的許可。您可以透過 [SecretARN 加密內容](security-encryption.md#security-encryption-encryption-context)來限制使用解密函數，從而使輪換函數角色僅有權解密其負責輪換的秘密。

**更新輪換函數執行角色**

1. 在 Lambda 輪換函數中選擇**組態**，然後在**執行角色**下選擇**角色名稱**。

1. 按照[修改角色許可政策](https://docs.aws.amazon.com/IAM/latest/UserGuide/roles-managingrole-editing-console.html#roles-modify_permissions-policy)中的指示新增 `kms:EncryptionContext:SecretARN` 條件。

   ```
   "Condition": {
       "StringEquals": {
           "kms:EncryptionContext:SecretARN": "SecretARN"
       }
   },
   ```

## 步驟 4：為輪換函數設定網路存取
<a name="rotate-secrets_turn-on-for-db_step4"></a>

如需詳細資訊，請參閱[AWS Lambda 輪換函數的網路存取](rotation-function-network-access.md)。

## 後續步驟
<a name="rotate-secrets_turn-on-for-db_stepnext"></a>

請參閱[對 AWS Secrets Manager 輪換進行故障診斷](troubleshoot_rotation.md)。

# 設定非資料庫 AWS Secrets Manager 秘密的自動輪換
<a name="rotate-secrets_turn-on-for-other"></a>

本教學課程說明如何[由 Lambda 函式輪換](rotate-secrets_lambda.md)設定非資料庫秘密。輪換是定期更新機密的過程。當您輪換秘密時，會更新秘密以及該秘密所針對資料庫或服務中的憑證。

如需資料庫秘密，請參閱[資料庫秘密的自動輪換 (主控台)](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 Serverless Application Repository 《 一般參考》中的端點和配額](https://docs.aws.amazon.com/general/latest/gr/serverlessrepo.html)。 *AWS *

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，請包含 **vpcSecurityGroupIds** 和 **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. 前往以下位置開啟機密管理員控制台：[https://console.aws.amazon.com/secretsmanager/](https://console.aws.amazon.com/secretsmanager/)。

1. 在 **Secrets** (機密) 頁面中，選擇機密。

1. 在 **Secret details (機密詳細資訊)** 頁面的 **Rotation configuration (輪換組態)** 區段中，選擇 **Edit rotation (編輯輪換)**。在 **Edit rotation configuration** (編輯輪換組態) 對話方塊中，執行以下動作：

   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 執行角色。如果使用 KMS 金鑰為秘密加密，而不是 AWS 受管金鑰 `aws/secretsmanager`，那麼您需要將使用該金鑰的許可授予 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 函數的資源政策中授予`lambda:InvokeFunction`許可給 Secrets Manager 服務主體。

在輪換函數的資源政策中，我們建議您包含內容金鑰 [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)。

# 使用 設定自動輪換 AWS CLI
<a name="rotate-secrets_turn-on-cli"></a>

本教學說明如何[由 Lambda 函式輪換](rotate-secrets_lambda.md)使用 設定 AWS CLI。當您輪換秘密時，會更新秘密以及該秘密所針對資料庫或服務中的憑證。

您也可以使用 主控台設定輪換。如需資料庫秘密，請參閱[資料庫秘密的自動輪換 (主控台)](rotate-secrets_turn-on-for-db.md)。如需所有其他類型的機密，請參閱 [非資料庫秘密的自動輪換 （主控台）](rotate-secrets_turn-on-for-other.md)。

若要使用 設定輪換 AWS CLI，如果您要輪換資料庫秘密，您必須先選擇輪換策略。如果您選擇交替使用者策略，必須儲存具有資料庫超級使用者憑證的另外秘密。接下來，您會撰寫輪換函數程式碼。Secrets Manager 提供範本，您可以用來撰寫函數。您接著可以使用程式碼建立 Lambda 函數，並為 Lambda 函數和 Lambda 執行角色設定許可。下一個步驟是確保 Lambda 函數可以透過網路存取 Secrets Manager 和資料庫或服務。最後，您可以設定秘密以進行輪換。

**Topics**
+ [資料庫秘密的先決條件：選擇輪換策略](#rotate-secrets_turn-on-cli_step1)
+ [步驟 1：撰寫輪換函數程式碼](#rotate-secrets_turn-on-cli_write)
+ [步驟 2：建立 Lambda 函數](#w2aac21c11c25c15)
+ [步驟 3：設定網路存取](#w2aac21c11c25c17)
+ [步驟 4：設定輪換的秘密](#w2aac21c11c25c19)
+ [後續步驟](#w2aac21c11c25c21)

## 資料庫秘密的先決條件：選擇輪換策略
<a name="rotate-secrets_turn-on-cli_step1"></a>

如需 Secrets Manager 所提供策略的相關資訊，請參閱 [Lambda 函數輪換策略](rotation-strategy.md)。

### 選項 1：單一使用者策略
<a name="w2aac21c11c25c11b5"></a>

如果您選擇*單一使用者策略*，您可以繼續進行步驟 1。

### 選項 2：交替使用者策略
<a name="w2aac21c11c25c11b7"></a>

如果您選擇*交替使用者策略*，您必須：
+ [建立秘密](create_secret.md#create_secret_cli)，並將資料庫超級使用者登入資料存放在其中。您需要具有超級使用者登入資料的秘密，因為交替使用者輪換會複製第一個使用者，而且大多數使用者沒有該許可。
+ 將超級使用者秘密的 ARN 新增至原始秘密。如需詳細資訊，請參閱[AWS Secrets Manager 秘密的 JSON 結構](reference_secret_json_structure.md)。

請注意，Amazon RDS Proxy 不支援交替使用者策略。

## 步驟 1：撰寫輪換函數程式碼
<a name="rotate-secrets_turn-on-cli_write"></a>

若要輪換秘密，您需要輪換函數。輪換函數是 Lambda 函數，Secrets Manager 會呼叫以輪換秘密。如需詳細資訊，請參閱[由 Lambda 函式輪換](rotate-secrets_lambda.md)。在此步驟中，您會撰寫更新秘密的程式碼，以及秘密的目標服務或資料庫。

Secrets Manager 為 中的 Amazon RDS、Amazon Aurora、Amazon Redshift 和 Amazon DocumentDB 資料庫秘密提供範本[輪換函數範本](reference_available-rotation-templates.md)。

**撰寫輪換函數程式碼**

1. 執行以下任意一項：
   + 檢查[輪換函數範本](reference_available-rotation-templates.md)的清單。如果有符合您的服務和輪換策略，請複製程式碼。
   + 對於其他類型的秘密，您可以撰寫自己的輪換函數。如需說明，請參閱[Lambda 輪換函數](rotate-secrets_lambda-functions.md)。

1. 將檔案與所有必要的相依性一起儲存在 ZIP 檔案 *my-function.zip *中。

## 步驟 2：建立 Lambda 函數
<a name="w2aac21c11c25c15"></a>

在此步驟中，您可以使用您在步驟 1 中建立的 ZIP 檔案來建立 Lambda 函數。您也可以設定 [Lambda 執行角色](https://docs.aws.amazon.com/lambda/latest/dg/lambda-intro-execution-role.html)，這是 Lambda 在叫用函數時擔任的角色。

**建立 Lambda 輪換函數和執行角色**

1. 為 Lambda 執行角色建立信任政策，並將其儲存為 JSON 檔案。範例和詳細資訊請參閱 [的 Lambda 輪換函數執行角色許可 AWS Secrets Manager](rotating-secrets-required-permissions-function.md)。該政策必須：
   + 允許角色對秘密呼叫 Secrets Manager 作業。
   + 允許 角色呼叫秘密所在的服務，例如建立新密碼。

1. 建立 Lambda 執行角色，並透過呼叫 來套用您在上一個步驟中建立的信任政策[https://docs.aws.amazon.com/cli/latest/reference/iam/create-role.html](https://docs.aws.amazon.com/cli/latest/reference/iam/create-role.html)。

   ```
   aws iam create-role \
       --role-name rotation-lambda-role \
       --assume-role-policy-document file://trust-policy.json
   ```

1. 呼叫 [https://docs.aws.amazon.com/cli/latest/reference/lambda/create-function.html](https://docs.aws.amazon.com/cli/latest/reference/lambda/create-function.html)，以 ZIP 檔案建立 Lambda 函數。

   ```
   aws lambda create-function \
     --function-name my-rotation-function \
     --runtime python3.7 \
     --zip-file fileb://my-function.zip \
     --handler .handler \
     --role arn:aws:iam::123456789012:role/service-role/rotation-lambda-role
   ```

1. 對 Lambda 函數設定資源政策，允許 Secrets Manager 透過呼叫 [https://docs.aws.amazon.com/cli/latest/reference/lambda/add-permission.html](https://docs.aws.amazon.com/cli/latest/reference/lambda/add-permission.html) 來叫用該函數。

   ```
   aws lambda add-permission \
     --function-name my-rotation-function \
     --action lambda:InvokeFunction \
     --statement-id SecretsManager \
     --principal secretsmanager.amazonaws.com \
     --source-account 123456789012
   ```

## 步驟 3：設定網路存取
<a name="w2aac21c11c25c17"></a>

如需詳細資訊，請參閱[AWS Lambda 輪換函數的網路存取](rotation-function-network-access.md)。

## 步驟 4：設定輪換的秘密
<a name="w2aac21c11c25c19"></a>

若要為您的秘密開啟自動輪換功能，請呼叫 [https://docs.aws.amazon.com/cli/latest/reference/secretsmanager/rotate-secret.html](https://docs.aws.amazon.com/cli/latest/reference/secretsmanager/rotate-secret.html)。您可以使用 `cron()` 或 `rate()` 排程表達式來設定輪換排程，也可以設定輪換時段時長。如需詳細資訊，請參閱[輪換排程](rotate-secrets_schedule.md)。

```
aws secretsmanager rotate-secret \
    --secret-id MySecret \
    --rotation-lambda-arn arn:aws:lambda:Region:123456789012:function:my-rotation-function \
    --rotation-rules "{\"ScheduleExpression\": \"cron(0 16 1,15 * ? *)\", \"Duration\": \"2h\"}"
```

## 後續步驟
<a name="w2aac21c11c25c21"></a>

請參閱[對 AWS Secrets Manager 輪換進行故障診斷](troubleshoot_rotation.md)。

# Lambda 函數輪換策略
<a name="rotation-strategy"></a>

對於 [由 Lambda 函式輪換](rotate-secrets_lambda.md)，對於資料庫秘密，Secrets Manager 提供兩種輪換策略。

## 輪換策略：單一使用者
<a name="rotating-secrets-one-user-one-password"></a>

此策略會在一個秘密中更新一個使用者的憑證。對於 Amazon RDS Db2 執行個體，因為使用者無法變更自己的密碼，因此必須使用單獨的密碼來提供管理員登入資料。**這是最簡單的輪換策略，適用於大多數使用案例。**特別是，建議您將此策略用於一次性 (臨機操作) 或互動式使用者的憑證。

秘密輪換時，不會中斷開啟的資料庫連線。輪換正在進行時，資料庫中的密碼變更與更新秘密之間，有一小段時間落差。在此期間，資料庫有可能拒絕使用輪換後憑證的呼叫。您可以透過[適當的重試策略](https://aws.amazon.com/blogs/architecture/exponential-backoff-and-jitter/)降低這種風險。輪換之後，新的連線會使用新的憑證。

## 輪換策略：交替使用者
<a name="rotating-secrets-two-users"></a>

此策略會在一個秘密中更新兩個使用者的憑證。您可以建立第一個使用者，然後在第一次輪換期間，輪換函數會複製該使用者，以建立第二個使用者。每當秘密輪換時，輪換函數都會交替要更新的使用者密碼。由於大多數使用者沒有複製自身的許可，所以您必須提供其他秘密中 `superuser` 的憑證。在資料庫中複製的使用者沒有與原始使用者相同的許可時，建議使用單一使用者輪換策略，以及將其用於一次性 (臨機操作) 或互動式使用者的憑證。

此策略適合具有許可模型的資料庫，其中一個角色擁有資料庫資料表，而第二個角色具有存取資料庫資料表的許可。這也適用於需要高可用性的應用程式。如果應用程式在輪換期間擷取秘密，應用程式仍會取得一組有效的憑證。輪換之後，`user` 和 `user_clone` 憑證都有效。在這種類型的輪換期間，應用程式遭到拒絕的機率比單一使用者輪換更低。如果資料庫託管於伺服器陣列，將密碼變更傳播到所有伺服器需要一段時間，則資料庫有可能拒絕使用新憑證的呼叫。您可以透過[適當的重試策略](https://aws.amazon.com/blogs/architecture/exponential-backoff-and-jitter/)降低這種風險。

Secrets Manager 會建立複製使用者，該使用者擁有與原始使用者相同的許可。如果在建立複製使用者後變更原始使用者的許可，您也必須變更複製使用者的許可。

例如，如果您使用資料庫使用者的憑證建立秘密，則該秘密會包含一個具有這些憑證的版本。

 ![\[The secret contains one secret version labeled AWSCURRENT. The username for the AWSCURRENT version is MyUser.\]](http://docs.aws.amazon.com/zh_tw/secretsmanager/latest/userguide/images/AlternatingUsers1.png) 

**第一次輪換** – 輪換函數會使用產生的密碼來建立使用者的複製，而這些登入資料會成為目前的秘密版本。

 ![\[The secret contains two secret versions, one labeled AWSCURRENT and one labeled AWSPREVIOUS. The username for the AWSCURRENT version is MyUser_clone.\]](http://docs.aws.amazon.com/zh_tw/secretsmanager/latest/userguide/images/AlternatingUsers2.png) 

**第二次輪換** – 輪換函數會更新原始使用者的密碼。

 ![\[The secret contains two secret versions, one labeled AWSCURRENT and one labeled AWSPREVIOUS. The username for the AWSCURRENT version is MyUser.\]](http://docs.aws.amazon.com/zh_tw/secretsmanager/latest/userguide/images/AlternatingUsers3.png) 

**第三次輪**換 – 輪換函數會更新複製使用者的密碼。

 ![\[The secret contains two secret versions, one labeled AWSCURRENT and one labeled AWSPREVIOUS. The username for the AWSCURRENT version is MyUser_clone.\]](http://docs.aws.amazon.com/zh_tw/secretsmanager/latest/userguide/images/AlternatingUsers4.png) 

# Lambda 輪換函數
<a name="rotate-secrets_lambda-functions"></a>

在 中[由 Lambda 函式輪換](rotate-secrets_lambda.md)， AWS Lambda 函數會輪換秘密。 AWS Secrets Manager 會在輪換期間使用[預備標籤](whats-in-a-secret.md)來識別秘密版本。

如果 AWS Secrets Manager 未為您的秘密類型提供[輪換函數範本](reference_available-rotation-templates.md)，您可以建立自訂輪換函數。撰寫輪換函數時，請遵循下列準則：

**自訂輪換函數的最佳實務**
+ 使用[一般輪換範本](reference_available-rotation-templates.md#OTHER_rotation_templates)做為起點。
+ 請小心偵錯或記錄陳述式。他們可以將資訊寫入 Amazon CloudWatch Logs。確保日誌不包含敏感資訊。

  如需日誌陳述式範例，請參閱[AWS Secrets Manager 輪換函數範本](reference_available-rotation-templates.md)原始程式碼。
+ 為了安全起見， AWS Secrets Manager 只允許 Lambda 輪換函數直接輪換秘密。輪換函數無法呼叫另一個 Lambda 函數來輪換秘密。
+ 如需偵錯指引，請參閱[測試和偵錯無伺服器應用程式](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-test-and-debug.html)。
+ 如果您使用外部二進位檔和程式庫，例如連接到資源，則需負責修補和更新它們。
+ 將您的輪換函數和任何相依性封裝在 ZIP 檔案中，例如 *my-function.zip*。

**警告**  
將佈建並行參數設定為低於 10 的值，可能會導致因為 Lambda 函數的執行執行緒不足而導致限流。如需詳細資訊，請參閱《 AWS Lambda 開發人員指南》中的 AWS Lambda [了解預留並行和佈建並行](https://docs.aws.amazon.com/lambda/latest/dg/lambda-concurrency.html#reserved-and-provisioned)。

## 輪換函數中的四個步驟
<a name="rotate-secrets_lambda-functions-code"></a>

**Topics**
+ [`createSecret`：建立新的秘密版本](#w2aac21c11c29c11b5)
+ [**setSecret**：變更資料庫或服務中的登入資料](#w2aac21c11c29c11b7)
+ [**testSecret**：測試新的秘密版本](#w2aac21c11c29c11b9)
+ [**finishSecret**：完成輪換](#w2aac21c11c29c11c11)

### `createSecret`：建立新的秘密版本
<a name="w2aac21c11c29c11b5"></a>

方法`createSecret`會先透過[https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/secretsmanager.html#SecretsManager.Client.get_secret_value](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/secretsmanager.html#SecretsManager.Client.get_secret_value)使用傳入 呼叫 來檢查秘密是否存在`ClientRequestToken`。如果沒有秘密，它會使用 建立新的秘密，[https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/secretsmanager.html#SecretsManager.Client.create_secret](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/secretsmanager.html#SecretsManager.Client.create_secret)並將字符作為 `VersionId`。然後，它會使用 產生新的秘密值[https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/secretsmanager.html#SecretsManager.Client.get_random_password](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/secretsmanager.html#SecretsManager.Client.get_random_password)。接下來，它會呼叫 [https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/secretsmanager.html#SecretsManager.Client.put_secret_value](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/secretsmanager.html#SecretsManager.Client.put_secret_value)，將其與預備標籤 一起存放`AWSPENDING`。將新的秘密值儲存在 `AWSPENDING` 中，有助於確保等冪性。如果輪換因任何原因而失敗，您可以在後續呼叫中參考該秘密值。請參閱 [How do I make my Lambda function idempotent](https://aws.amazon.com/premiumsupport/knowledge-center/lambda-function-idempotent/) (如何讓 Lambda 函數等冪)。

**撰寫您自己的輪換函數的提示**
+ 確保新的秘密值僅包含對資料庫或服務有效的字元。使用 `ExcludeCharacters` 參數排除字元。
+ 當您測試函數時，請使用 AWS CLI 查看版本階段：呼叫 [https://docs.aws.amazon.com/cli/latest/reference/secretsmanager/describe-secret.html](https://docs.aws.amazon.com/cli/latest/reference/secretsmanager/describe-secret.html)並查看 `VersionIdsToStages`。
+ 對於 Amazon RDS MySQL，在交替使用者輪換時，Secrets Manager 會建立名稱不超過 16 個字元的複製使用者。您可以修改旋轉功能以允許更長的用戶名。MySQL 版本 5.7 及更高版本支持用戶名最多 32 個字符，但是 Secrets Manager 附加「\$1clone」（六個字符）到用戶名的末尾，所以你必須保持用戶名最多 26 個字符。

### **setSecret**：變更資料庫或服務中的登入資料
<a name="w2aac21c11c29c11b7"></a>

方法會`setSecret`變更資料庫或服務中的登入資料，以符合秘密`AWSPENDING`版本中的新秘密值。

**撰寫您自己的輪換函數的提示**
+ 如果您將陳述式傳遞給解譯陳述式的服務，例如資料庫，請使用查詢參數化。如需詳細資訊，請參閱 *OWASP 網站上的*[查詢參數摘要](https://cheatsheetseries.owasp.org/cheatsheets/Query_Parameterization_Cheat_Sheet.html)。
+ 輪換函數是具有特殊權限的代理人，有權存取和修改 Secrets Manager 秘密和目標資源中的客戶憑證。為了防止潛在的[混淆代理人攻擊](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html)，您必須確保攻擊者無法使用該函數存取其他資源。在您更新憑證之前：
  + 查看 `AWSCURRENT` 版本秘密中的憑證是否有效。如果 `AWSCURRENT` 憑證無效，請放棄輪換嘗試。
  + 查看 `AWSCURRENT` 和 `AWSPENDING` 秘密值是否針對相同的資源。對於使用者名稱和密碼，請查看 `AWSCURRENT` 和 `AWSPENDING` 使用者名稱是否相同。
  + 檢查目的地服務資源是否相同。對於資料庫，請查看 `AWSCURRENT` 和 `AWSPENDING` 主機名稱是否相同。
+ 在極少數情況下，您可能想要自訂資料庫的現有輪換函數。例如，使用者交替輪換時，Secrets Manager 會複製第一個使用者的[執行期組態參數](https://www.postgresql.org/docs/8.0/runtime-config.html)來建立複製的使用者。如果您想要包含更多屬性，或變更哪些屬性以授予複製的使用者，則需要更新 `set_secret` 函數中的程式碼。

### **testSecret**：測試新的秘密版本
<a name="w2aac21c11c29c11b9"></a>

接下來，Lambda 輪換函數會使用 `AWSPENDING` 版本的秘密存取資料庫或服務，以進行測試。根據 [輪換函數範本](reference_available-rotation-templates.md) 建立的輪換函數會使用讀取權限測試新的秘密。

### **finishSecret**：完成輪換
<a name="w2aac21c11c29c11c11"></a>

最後，Lambda 輪換函數會將標籤 `AWSCURRENT` 從先前的秘密版本移至此版本，這也會移除相同 API 呼叫中的 `AWSPENDING` 標籤。Secrets Manager 會將 `AWSPREVIOUS` 預備標籤新增至先前版本，以便您保留上一個已知良好的秘密版本。

方法**finish\$1secret**使用 將預備標籤`AWSCURRENT`從先前的秘密版本[https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/secretsmanager.html#SecretsManager.Client.update_secret_version_stage](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/secretsmanager.html#SecretsManager.Client.update_secret_version_stage)移至新的秘密版本。Secrets Manager 會自動將 `AWSPREVIOUS` 預備標籤新增至先前版本，以便您保留上一個已知良好的秘密版本。

**撰寫您自己的輪換函數的提示**
+ 在此`AWSPENDING`之前，請勿移除 ，也不要使用單獨的 API 呼叫來移除它，因為這可能會向 Secrets Manager 指出輪換未成功完成。Secrets Manager 會將 `AWSPREVIOUS` 預備標籤新增至先前版本，以便您保留上一個已知良好的秘密版本。

輪換成功時，`AWSPENDING` 預備標籤可能會連接至與 `AWSCURRENT` 版本相同的版本，或者可能未連接至任何版本。如果 `AWSPENDING` 預備標籤存在，但未連接至與 `AWSCURRENT` 相同的版本，則任何以後的輪換調用都會假定之前的輪換請求仍在進行中並傳回錯誤。輪換不成功時，`AWSPENDING` 預備標籤可能會連接至空的機密版本。如需詳細資訊，請參閱[輪換疑難排解](troubleshoot_rotation.md)。

# AWS Secrets Manager 輪換函數範本
<a name="reference_available-rotation-templates"></a>

AWS Secrets Manager 提供一組輪換函數範本，可協助自動化各種資料庫系統和服務的登入資料安全管理。範本是ready-to-use Lambda 函數，可實作登入資料輪換的最佳實務，協助您維持安全狀態，無需手動介入。

範本支援兩種主要輪換策略：
+ *單一使用者輪換*，更新單一使用者的登入資料。
+ *交替使用者輪*換，可維護兩個不同的使用者，以協助消除登入資料變更期間的停機時間。

Secrets Manager 也提供一般範本，做為任何類型的秘密的起點。

若要使用範本，請參閱：
+ [資料庫秘密的自動輪換 (主控台)](rotate-secrets_turn-on-for-db.md)
+ [非資料庫秘密的自動輪換 （主控台）](rotate-secrets_turn-on-for-other.md)

若要寫入您自己的輪換函數，請參閱[寫入輪換函數](rotate-secrets_lambda-functions.md)。

**Contents**
+ [Amazon RDS 和 Amazon Aurora](#RDS_rotation_templates)
  + [Amazon RDS Db2 單用戶](#sar-template-db2-singleuser)
  + [Amazon RDS Db2 交替用戶](#sar-template-db2-multiuser)
  + [Amazon RDS MariaDB 單一使用者](#sar-template-mariadb-singleuser)
  + [Amazon RDS MariaDB 交替使用者](#sar-template-mariadb-multiuser)
  + [Amazon RDS 和 Amazon Aurora MySQL 單一使用者](#sar-template-mysql-singleuser)
  + [Amazon RDS 和 Amazon Aurora MySQL 交替使用者](#sar-template-mysql-multiuser)
  + [Amazon RDS Oracle 單一使用者](#sar-template-oracle-singleuser)
  + [Amazon RDS Oracle 交替使用者](#sar-template-oracle-multiuser)
  + [Amazon RDS 和 Amazon Aurora PostgreSQL 單一使用者](#sar-template-postgre-singleuser)
  + [Amazon RDS 和 Amazon Aurora PostgreSQL 交替使用者](#sar-template-postgre-multiuser)
  + [Amazon RDS Microsoft SQLServer 單一使用者](#sar-template-sqlserver-singleuser)
  + [Amazon RDS Microsoft SQLServer 交替使用者](#sar-template-sqlserver-multiuser)
+ [Amazon DocumentDB (with MongoDB compatibility)](#NON-RDS_rotation_templates)
  + [Amazon DocumentDB 單一使用者](#sar-template-mongodb-singleuser)
  + [Amazon DocumentDB 交替使用者](#sar-template-mongodb-multiuser)
+ [Amazon Redshift](#template-redshift)
  + [Amazon Redshift 單一使用者](#sar-template-redshift-singleuser)
  + [Amazon Redshift 交替使用者](#sar-template-redshift-multiuser)
+ [InfluxDB 的 Amazon Timestream](#template-TimeStream)
  + [InfluxDB 單一使用者的 Amazon Timestream](#template-TimeStream-singleuser)
  + [InfluxDB 交替使用者的 Amazon Timestream](#template-TimeStream-multiuser)
+ [Amazon ElastiCache](#template-ELC)
+ [Active Directory](#template-AD)
  + [Active Directory 登入資料](#template-AD-password)
  + [Active Directory keytab](#template-AD-keytab)
+ [其他類型的秘密](#OTHER_rotation_templates)

## Amazon RDS 和 Amazon Aurora
<a name="RDS_rotation_templates"></a>

### Amazon RDS Db2 單用戶
<a name="sar-template-db2-singleuser"></a>
+ **範本名稱：**SecretsManagerRDSDb2RotationSingleUser
+ **輪換策略：**[輪換策略：單一使用者](rotation-strategy.md#rotating-secrets-one-user-one-password)。
+ **`SecretString` 結構：**[Amazon RDS 和 Aurora 登入資料](reference_secret_json_structure.md#reference_secret_json_structure_rds)。
+ **原始碼：**https：//[https://github.com/aws-samples/aws-secrets-manager-rotation-lambdas/tree/master/SecretsManagerRDSDb2RotationSingleUser/lambda\$1function.py](https://github.com/aws-samples/aws-secrets-manager-rotation-lambdas/tree/master/SecretsManagerRDSDb2RotationSingleUser/lambda_function.py)
+ **依賴關係：**[python-ibmdb](https://github.com/ibmdb/python-ibmdb)

### Amazon RDS Db2 交替用戶
<a name="sar-template-db2-multiuser"></a>
+ **範本名稱：**SecretsManagerRDSDb2RotationMultiUser
+ **輪換策略：**[輪換策略：交替使用者](rotation-strategy.md#rotating-secrets-two-users)。
+ **`SecretString` 結構：**[Amazon RDS 和 Aurora 登入資料](reference_secret_json_structure.md#reference_secret_json_structure_rds)。
+ **原始碼：**https：//[https://github.com/aws-samples/aws-secrets-manager-rotation-lambdas/tree/master/SecretsManagerRDSDb2RotationMultiUser/lambda\$1function.py](https://github.com/aws-samples/aws-secrets-manager-rotation-lambdas/tree/master/SecretsManagerRDSDb2RotationMultiUser/lambda_function.py)
+ **依賴關係：**[python-ibmdb](https://github.com/ibmdb/python-ibmdb)

### Amazon RDS MariaDB 單一使用者
<a name="sar-template-mariadb-singleuser"></a>
+ **範本名稱：**SecretsManagerRDSMariaDBRotationSingleUser
+ **輪換策略：**[輪換策略：單一使用者](rotation-strategy.md#rotating-secrets-one-user-one-password)。
+ **`SecretString` 結構：**[Amazon RDS 和 Aurora 登入資料](reference_secret_json_structure.md#reference_secret_json_structure_rds)。
+ **原始碼：**[https://github.com/aws-samples/aws-secrets-manager-rotation-lambdas/tree/master/SecretsManagerRDSMariaDBRotationSingleUser/lambda\$1function.py](https://github.com/aws-samples/aws-secrets-manager-rotation-lambdas/tree/master/SecretsManagerRDSMariaDBRotationSingleUser/lambda_function.py)
+ **相依性：**PyMySQL 1.0.2。如果您使用 sha256 密碼進行身分驗證，PyMySQL【rsa】。如需在 Lambda 執行時間中使用套件搭配編譯程式碼的資訊，請參閱 *AWS 知識中心*中的[如何將具有編譯二進位檔的 Python 套件新增至部署套件，並讓套件與 Lambda 相容？](https://repost.aws/knowledge-center/lambda-python-package-compatible)。

### Amazon RDS MariaDB 交替使用者
<a name="sar-template-mariadb-multiuser"></a>
+ **範本名稱：**SecretsManagerRDSMariaDBRotationMultiUser
+ **輪換策略：**[輪換策略：交替使用者](rotation-strategy.md#rotating-secrets-two-users)。
+ **`SecretString` 結構：**[Amazon RDS 和 Aurora 登入資料](reference_secret_json_structure.md#reference_secret_json_structure_rds)。
+ **原始碼：**[https://github.com/aws-samples/aws-secrets-manager-rotation-lambdas/tree/master/SecretsManagerRDSMariaDBRotationMultiUser/lambda\$1function.py](https://github.com/aws-samples/aws-secrets-manager-rotation-lambdas/tree/master/SecretsManagerRDSMariaDBRotationMultiUser/lambda_function.py)
+ **相依性：**PyMySQL 1.0.2。如果您使用 sha256 密碼進行身分驗證，PyMySQL【rsa】。如需在 Lambda 執行時間中搭配編譯程式碼使用套件的詳細資訊，請參閱 *AWS 知識中心*中的[如何將具有編譯二進位檔的 Python 套件新增至部署套件，並讓套件與 Lambda 相容？](https://repost.aws/knowledge-center/lambda-python-package-compatible)。

### Amazon RDS 和 Amazon Aurora MySQL 單一使用者
<a name="sar-template-mysql-singleuser"></a>
+ **範本名稱：**SecretsManagerRDSMySQLRotationSingleUser
+ **輪換策略：**[輪換策略：單一使用者](rotation-strategy.md#rotating-secrets-one-user-one-password)。
+ **預期的 `SecretString` 結構：**[Amazon RDS 和 Aurora 登入資料](reference_secret_json_structure.md#reference_secret_json_structure_rds)。
+ **原始碼：**[https://github.com/aws-samples/aws-secrets-manager-rotation-lambdas/tree/master/SecretsManagerRDSMySQLRotationSingleUser/lambda\$1function.py](https://github.com/aws-samples/aws-secrets-manager-rotation-lambdas/tree/master/SecretsManagerRDSMySQLRotationSingleUser/lambda_function.py)
+ **相依性：**PyMySQL 1.0.2。如果您使用 sha256 密碼進行身分驗證，PyMySQL【rsa】。如需在 Lambda 執行時間中搭配編譯程式碼使用套件的詳細資訊，請參閱 *AWS 知識中心*中的[如何將具有編譯二進位檔的 Python 套件新增至部署套件，並讓套件與 Lambda 相容？](https://repost.aws/knowledge-center/lambda-python-package-compatible)。

### Amazon RDS 和 Amazon Aurora MySQL 交替使用者
<a name="sar-template-mysql-multiuser"></a>
+ **範本名稱：**SecretsManagerRDSMySQLRotationMultiUser
+ **輪換策略：**[輪換策略：交替使用者](rotation-strategy.md#rotating-secrets-two-users)。
+ **預期的 `SecretString` 結構：**[Amazon RDS 和 Aurora 登入資料](reference_secret_json_structure.md#reference_secret_json_structure_rds)。
+ **原始碼：**[https://github.com/aws-samples/aws-secrets-manager-rotation-lambdas/tree/master/SecretsManagerRDSMySQLRotationMultiUser/lambda\$1function.py](https://github.com/aws-samples/aws-secrets-manager-rotation-lambdas/tree/master/SecretsManagerRDSMySQLRotationMultiUser/lambda_function.py)
+ **相依性：**PyMySQL 1.0.2。如果您使用 sha256 密碼進行身分驗證，PyMySQL【rsa】。如需在 Lambda 執行時間中搭配編譯程式碼使用套件的詳細資訊，請參閱 *AWS 知識中心*中的[如何將具有編譯二進位檔的 Python 套件新增至部署套件，並讓套件與 Lambda 相容？](https://repost.aws/knowledge-center/lambda-python-package-compatible)。

### Amazon RDS Oracle 單一使用者
<a name="sar-template-oracle-singleuser"></a>
+ **範本名稱：**SecretsManagerRDSOracleRotationSingleUser
+ **輪換策略：**[輪換策略：單一使用者](rotation-strategy.md#rotating-secrets-one-user-one-password)。
+ **預期的 `SecretString` 結構：**[Amazon RDS 和 Aurora 登入資料](reference_secret_json_structure.md#reference_secret_json_structure_rds)。
+ **原始碼：**[https://github.com/aws-samples/aws-secrets-manager-rotation-lambdas/tree/master/SecretsManagerRDSOracleRotationSingleUser/lambda\$1function.py](https://github.com/aws-samples/aws-secrets-manager-rotation-lambdas/tree/master/SecretsManagerRDSOracleRotationSingleUser/lambda_function.py)
+ **相依性：**[python-oracledb 2.4.1](https://github.com/oracle/python-oracledb)

### Amazon RDS Oracle 交替使用者
<a name="sar-template-oracle-multiuser"></a>
+ **範本名稱：**SecretsManagerRDSOracleRotationMultiUser
+ **輪換策略：**[輪換策略：交替使用者](rotation-strategy.md#rotating-secrets-two-users)。
+ **預期的 `SecretString` 結構：**[Amazon RDS 和 Aurora 登入資料](reference_secret_json_structure.md#reference_secret_json_structure_rds)。
+ **原始碼：**[https://github.com/aws-samples/aws-secrets-manager-rotation-lambdas/tree/master/SecretsManagerRDSOracleRotationMultiUser/lambda\$1function.py](https://github.com/aws-samples/aws-secrets-manager-rotation-lambdas/tree/master/SecretsManagerRDSOracleRotationMultiUser/lambda_function.py)
+ **相依性：**[python-oracledb 2.4.1](https://github.com/oracle/python-oracledb)

### Amazon RDS 和 Amazon Aurora PostgreSQL 單一使用者
<a name="sar-template-postgre-singleuser"></a>
+ **範本名稱：**SecretsManagerRDSPostgreSQLRotationSingleUser
+ **輪換策略：**[輪換策略：單一使用者](rotation-strategy.md#rotating-secrets-one-user-one-password)。
+ **預期的 `SecretString` 結構：**[Amazon RDS 和 Aurora 登入資料](reference_secret_json_structure.md#reference_secret_json_structure_rds)。
+ **原始碼：**[https://github.com/aws-samples/aws-secrets-manager-rotation-lambdas/tree/master/SecretsManagerRDSPostgreSQLRotationSingleUser/lambda\$1function.py](https://github.com/aws-samples/aws-secrets-manager-rotation-lambdas/tree/master/SecretsManagerRDSPostgreSQLRotationSingleUser/lambda_function.py)
+ **相依性：**PyGreSQL 5.2.5

### Amazon RDS 和 Amazon Aurora PostgreSQL 交替使用者
<a name="sar-template-postgre-multiuser"></a>
+ **範本名稱：**SecretsManagerRDSPostgreSQLRotationMultiUser
+ **輪換策略：**[輪換策略：交替使用者](rotation-strategy.md#rotating-secrets-two-users)。
+ **預期的 `SecretString` 結構：**[Amazon RDS 和 Aurora 登入資料](reference_secret_json_structure.md#reference_secret_json_structure_rds)。
+ **原始碼：**[https://github.com/aws-samples/aws-secrets-manager-rotation-lambdas/tree/master/SecretsManagerRDSPostgreSQLRotationMultiUser/lambda\$1function.py](https://github.com/aws-samples/aws-secrets-manager-rotation-lambdas/tree/master/SecretsManagerRDSPostgreSQLRotationMultiUser/lambda_function.py)
+ **相依性：**PyGreSQL 5.2.5

### Amazon RDS Microsoft SQLServer 單一使用者
<a name="sar-template-sqlserver-singleuser"></a>
+ **範本名稱：**SecretsManagerRDSSQLServerRotationSingleUser
+ **輪換策略：**[輪換策略：單一使用者](rotation-strategy.md#rotating-secrets-one-user-one-password)。
+ **預期的 `SecretString` 結構：**[Amazon RDS 和 Aurora 登入資料](reference_secret_json_structure.md#reference_secret_json_structure_rds)。
+ **原始碼：**[https://github.com/aws-samples/aws-secrets-manager-rotation-lambdas/tree/master/SecretsManagerRDSSQLServerRotationSingleUser/lambda\$1function.py](https://github.com/aws-samples/aws-secrets-manager-rotation-lambdas/tree/master/SecretsManagerRDSSQLServerRotationSingleUser/lambda_function.py)
+ **相依性：**Pymssql 2.2.2

### Amazon RDS Microsoft SQLServer 交替使用者
<a name="sar-template-sqlserver-multiuser"></a>
+ **範本名稱：**SecretsManagerRDSSQLServerRotationMultiUser
+ **輪換策略：**[輪換策略：交替使用者](rotation-strategy.md#rotating-secrets-two-users)。
+ **預期的 `SecretString` 結構：**[Amazon RDS 和 Aurora 登入資料](reference_secret_json_structure.md#reference_secret_json_structure_rds)。
+ **原始碼：**[https://github.com/aws-samples/aws-secrets-manager-rotation-lambdas/tree/master/SecretsManagerRDSSQLServerRotationMultiUser/lambda\$1function.py](https://github.com/aws-samples/aws-secrets-manager-rotation-lambdas/tree/master/SecretsManagerRDSSQLServerRotationMultiUser/lambda_function.py)
+ **相依性：**Pymssql 2.2.2

## Amazon DocumentDB (with MongoDB compatibility)
<a name="NON-RDS_rotation_templates"></a>

### Amazon DocumentDB 單一使用者
<a name="sar-template-mongodb-singleuser"></a>
+ **範本名稱：**SecretsManagerMongoDBRotationSingleUser
+ **輪換策略：**[輪換策略：單一使用者](rotation-strategy.md#rotating-secrets-one-user-one-password)。
+ **預期的 `SecretString` 結構：**[Amazon DocumentDB 登入資料](reference_secret_json_structure.md#reference_secret_json_structure_docdb)。
+ **原始碼：**[https://github.com/aws-samples/aws-secrets-manager-rotation-lambdas/tree/master/SecretsManagerMongoDBRotationSingleUser/lambda\$1function.py](https://github.com/aws-samples/aws-secrets-manager-rotation-lambdas/tree/master/SecretsManagerMongoDBRotationSingleUser/lambda_function.py)
+ **相依性：**PyMongo 4.2.0

### Amazon DocumentDB 交替使用者
<a name="sar-template-mongodb-multiuser"></a>
+ **範本名稱：**SecretsManagerMongoDBRotationMultiUser
+ **輪換策略：**[輪換策略：交替使用者](rotation-strategy.md#rotating-secrets-two-users)。
+ **預期的 `SecretString` 結構：**[Amazon DocumentDB 登入資料](reference_secret_json_structure.md#reference_secret_json_structure_docdb)。
+ **原始碼：**[https://github.com/aws-samples/aws-secrets-manager-rotation-lambdas/tree/master/SecretsManagerMongoDBRotationMultiUser/lambda\$1function.py](https://github.com/aws-samples/aws-secrets-manager-rotation-lambdas/tree/master/SecretsManagerMongoDBRotationMultiUser/lambda_function.py)
+ **相依性：**PyMongo 4.2.0

## Amazon Redshift
<a name="template-redshift"></a>

### Amazon Redshift 單一使用者
<a name="sar-template-redshift-singleuser"></a>
+ **範本名稱：**SecretsManagerRedshiftRotationSingleUser
+ **輪換策略：**[輪換策略：單一使用者](rotation-strategy.md#rotating-secrets-one-user-one-password)。
+ **預期的 `SecretString` 結構：**[Amazon Redshift 登入資料](reference_secret_json_structure.md#reference_secret_json_structure_RS)。
+ **原始碼：**[https://github.com/aws-samples/aws-secrets-manager-rotation-lambdas/tree/master/SecretsManagerRedshiftRotationSingleUser/lambda\$1function.py](https://github.com/aws-samples/aws-secrets-manager-rotation-lambdas/tree/master/SecretsManagerRedshiftRotationSingleUser/lambda_function.py)
+ **相依性：**PyGreSQL 5.2.5

### Amazon Redshift 交替使用者
<a name="sar-template-redshift-multiuser"></a>
+ **範本名稱：**SecretsManagerRedshiftRotationMultiUser
+ **輪換策略：**[輪換策略：交替使用者](rotation-strategy.md#rotating-secrets-two-users)。
+ **預期的 `SecretString` 結構：**[Amazon Redshift 登入資料](reference_secret_json_structure.md#reference_secret_json_structure_RS)。
+ **原始碼：**[https://github.com/aws-samples/aws-secrets-manager-rotation-lambdas/tree/master/SecretsManagerRedshiftRotationMultiUser/lambda\$1function.py](https://github.com/aws-samples/aws-secrets-manager-rotation-lambdas/tree/master/SecretsManagerRedshiftRotationMultiUser/lambda_function.py)
+ **相依性：**PyGreSQL 5.2.5

## InfluxDB 的 Amazon Timestream
<a name="template-TimeStream"></a>

若要使用這些範本，請參閱[《Amazon Timestream 開發人員指南》中的 Amazon Timestream for InfluxDB 如何使用秘密](https://docs.aws.amazon.com/timestream/latest/developerguide/timestream-for-influx-security-db-secrets.html)。 **

### InfluxDB 單一使用者的 Amazon Timestream
<a name="template-TimeStream-singleuser"></a>
+ **範本名稱：**SecretsManagerInfluxDBRotationSingleUserInfluxDBRotationSingleUser
+ **預期的 `SecretString` 結構：**[InfluxDB 秘密結構的 Amazon Timestream](reference_secret_json_structure.md#reference_secret_json_structure_TIME)。
+ **原始碼：**https：//[https://github.com/aws-samples/aws-secrets-manager-rotation-lambdas/tree/master/SecretsManagerInfluxDBRotationSingleUser/lambda\$1function.py](https://github.com/aws-samples/aws-secrets-manager-rotation-lambdas/tree/master/SecretsManagerInfluxDBRotationSingleUser/lambda_function.py)
+ **相依性：**InfluxDB 2.0 python 用戶端

### InfluxDB 交替使用者的 Amazon Timestream
<a name="template-TimeStream-multiuser"></a>
+ **範本名稱：**SecretsManagerInfluxDBRotationMultiUser
+ **預期的 `SecretString` 結構：**[InfluxDB 秘密結構的 Amazon Timestream](reference_secret_json_structure.md#reference_secret_json_structure_TIME)。
+ **原始碼：**https：//[https://github.com/aws-samples/aws-secrets-manager-rotation-lambdas/tree/master/SecretsManagerInfluxDBRotationMultiUser/lambda\$1function.py](https://github.com/aws-samples/aws-secrets-manager-rotation-lambdas/tree/master/SecretsManagerInfluxDBRotationMultiUser/lambda_function.py)
+ **相依性：**InfluxDB 2.0 python 用戶端

## Amazon ElastiCache
<a name="template-ELC"></a>

若要使用此範本，請參閱《Amazon ElastiCache 使用者指南》**中的[自動輪換使用者的密碼](https://docs.aws.amazon.com/AmazonElastiCache/latest/red-ug/User-Secrets-Manager.html)。
+ **範本名稱：**SecretsManagerElasticacheUserRotation
+ **預期的 `SecretString` 結構：**[Amazon ElastiCache 登入資料](reference_secret_json_structure.md#reference_secret_json_structure_ELC)。
+ **原始碼：**https：//[https://github.com/aws-samples/aws-secrets-manager-rotation-lambdas/tree/master/SecretsManagerElasticacheUserRotation/lambda\$1function.py](https://github.com/aws-samples/aws-secrets-manager-rotation-lambdas/tree/master/SecretsManagerElasticacheUserRotation/lambda_function.py)

## Active Directory
<a name="template-AD"></a>

### Active Directory 登入資料
<a name="template-AD-password"></a>
+ **範本名稱：**SecretsManagerActiveDirectoryRotationSingleUser
+ **預期的 `SecretString` 結構：**[Active Directory 登入資料](reference_secret_json_structure.md#reference_secret_json_structure_AD)。
+ **原始碼：**https：//[https://github.com/aws-samples/aws-secrets-manager-rotation-lambdas/tree/master/SecretsManagerActiveDirectoryRotationSingleUser/lambda\$1function.py](https://github.com/aws-samples/aws-secrets-manager-rotation-lambdas/tree/master/SecretsManagerActiveDirectoryRotationSingleUser/lambda_function.py)

### Active Directory keytab
<a name="template-AD-keytab"></a>
+ **範本名稱：**SecretsManagerActiveDirectoryAndKeytabRotationSingleUser
+ **預期的 `SecretString` 結構：**[Active Directory 登入資料](reference_secret_json_structure.md#reference_secret_json_structure_AD)。
+ **原始碼：**https：//[https://github.com/aws-samples/aws-secrets-manager-rotation-lambdas/tree/master/SecretsManagerActiveDirectoryAndKeytabRotationSingleUser/lambda\$1function.py](https://github.com/aws-samples/aws-secrets-manager-rotation-lambdas/tree/master/SecretsManagerActiveDirectoryAndKeytabRotationSingleUser/lambda_function.py)
+ **相依性：**msktutil

## 其他類型的秘密
<a name="OTHER_rotation_templates"></a>

Secrets Manager 提供此範本做為起點，供您為任何類型的秘密建立輪換函數。
+ **範本名稱：**SecretsManagerRotationTemplate
+ **原始碼：**[https://github.com/aws-samples/aws-secrets-manager-rotation-lambdas/tree/master/SecretsManagerRotationTemplate/lambda\$1function.py](https://github.com/aws-samples/aws-secrets-manager-rotation-lambdas/tree/master/SecretsManagerRotationTemplate/lambda_function.py)

# 的 Lambda 輪換函數執行角色許可 AWS Secrets Manager
<a name="rotating-secrets-required-permissions-function"></a>

對於 [由 Lambda 函式輪換](rotate-secrets_lambda.md)，當 Secrets Manager 使用 Lambda 函數來輪換秘密時，Lambda 會擔任 [IAM 執行角色](https://docs.aws.amazon.com/lambda/latest/dg/lambda-intro-execution-role.html)，並將這些登入資料提供給 Lambda 函數程式碼。如需如何設定自動輪換的指示，請參閱：
+ [資料庫秘密的自動輪換 (主控台)](rotate-secrets_turn-on-for-db.md)
+ [非資料庫秘密的自動輪換 （主控台）](rotate-secrets_turn-on-for-other.md)
+ [自動輪換 (AWS CLI)](rotate-secrets_turn-on-cli.md)

下列範例顯示 Lambda 輪換函數執行角色的內嵌政策。若要建立執行角色並附加許可政策，請參閱 [AWS Lambda 執行角色](https://docs.aws.amazon.com/lambda/latest/dg/lambda-intro-execution-role.html)。

**Topics**
+ [Lambda 輪換函數執行角色的政策](#rotating-secrets-required-permissions-function-example)
+ [客戶管理金鑰的政策陳述式](#rotating-secrets-required-permissions-function-cust-key-example)
+ [交替使用者策略的政策陳述式](#rotating-secrets-required-permissions-function-alternating-example)

## Lambda 輪換函數執行角色的政策
<a name="rotating-secrets-required-permissions-function-example"></a>

下列範例政策允許輪換函數：
+ 為 *SecretARN* 執行 Secrets Manager 作業。
+ 建立新密碼。
+ 如果資料庫或服務在 VPC 內執行，則設定必要組態。請參閱[設定 Lambda 函數以存取 VPC 中的資源](https://docs.aws.amazon.com/lambda/latest/dg/configuration-vpc.html)。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "secretsmanager:DescribeSecret",
                "secretsmanager:GetSecretValue",
                "secretsmanager:PutSecretValue",
                "secretsmanager:UpdateSecretVersionStage"
            ],
            "Resource": "arn:aws:secretsmanager:us-east-1:123456789012:secret:secretName-AbCdEf"
    },
        {
            "Effect": "Allow",
            "Action": [
                "secretsmanager:GetRandomPassword"
            ],
            "Resource": "*"
        },
        {
            "Action": [
                "ec2:CreateNetworkInterface",
                "ec2:DeleteNetworkInterface",
                "ec2:DescribeNetworkInterfaces",
                "ec2:DetachNetworkInterface"
            ],
            "Resource": "*",
            "Effect": "Allow"
        }
    ]
}
```

------

## 客戶管理金鑰的政策陳述式
<a name="rotating-secrets-required-permissions-function-cust-key-example"></a>

如果使用 KMS 金鑰為秘密加密，而不是 AWS 受管金鑰 `aws/secretsmanager`，那麼您需要將使用該金鑰的許可授予 Lambda 執行角色。您可以透過 [SecretARN 加密內容](security-encryption.md#security-encryption-encryption-context)來限制使用解密函數，從而使輪換函數角色僅有權解密其負責輪換的秘密。下列範例顯示要新增至執行角色政策，以使用 KMS 金鑰解密秘密的陳述式。

```
        {
            "Effect": "Allow",
            "Action": [
                "kms:Decrypt",
                "kms:DescribeKey",
                "kms:GenerateDataKey"
            ],
            "Resource": "KMSKeyARN",
            "Condition": {
                "StringEquals": {
                    "kms:EncryptionContext:SecretARN": "SecretARN"
                }
            }
        }
```

若要針對使用客戶受管金鑰加密的多組秘密使用輪換函數，請新增如下列範例所示的陳述式，以允許執行角色將秘密解密。

```
        {
            "Effect": "Allow",
            "Action": [
                "kms:Decrypt",
                "kms:DescribeKey",
                "kms:GenerateDataKey"
            ],
            "Resource": "KMSKeyARN",
            "Condition": {
                "StringEquals": {
                    "kms:EncryptionContext:SecretARN": [
                        "arn1",
                        "arn2"
                    ]
                }
            }
        }
```

## 交替使用者策略的政策陳述式
<a name="rotating-secrets-required-permissions-function-alternating-example"></a>

如需*交替使用者輪換策略*的資訊，請參閱[Lambda 函數輪換策略](rotation-strategy.md)。

對於包含 Amazon RDS 憑證的機密，如果您使用交替使用者策略，且超級使用者機密[由 Amazon RDS 管理](rotate-secrets_managed.md)，則還必須允許輪換函數呼叫 Amazon RDS 上的唯讀 API，以便取得資料庫的連線資訊。建議您連接 AWS 受管政策 [AmazonRDSReadOnlyAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonRDSReadOnlyAccess.html)。

下列範例政策允許函數：
+ 為 *SecretARN* 執行 Secrets Manager 作業。
+ 擷取超級使用者秘密中的憑證。Secrets Manager 會使用超級使用者秘密中的憑證，更新輪換後秘密中的憑證。
+ 建立新密碼。
+ 如果資料庫或服務在 VPC 內執行，則設定必要組態。如需詳細資訊，請參閱[設定 Lambda 函數以存取 VPC 中的資源](https://docs.aws.amazon.com/lambda/latest/dg/vpc.html)。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "secretsmanager:DescribeSecret",
                "secretsmanager:GetSecretValue",
                "secretsmanager:PutSecretValue",
                "secretsmanager:UpdateSecretVersionStage"
            ],
            "Resource": "arn:aws:secretsmanager:us-east-1:123456789012:secret:secretName-AbCdEf"
    },
        {
            "Effect": "Allow",
            "Action": [
                "secretsmanager:GetSecretValue"
            ],
            "Resource": "arn:aws:secretsmanager:us-east-1:123456789012:secret:secretName-AbCdEf"
    },
        {
            "Effect": "Allow",
            "Action": [
                "secretsmanager:GetRandomPassword"
            ],
            "Resource": "*"
        },
        {
            "Action": [
                "ec2:CreateNetworkInterface",
                "ec2:DeleteNetworkInterface",
                "ec2:DescribeNetworkInterfaces",
                "ec2:DetachNetworkInterface"
            ],
            "Resource": "*",
            "Effect": "Allow"
        }
    ]
}
```

------

# AWS Lambda 輪換函數的網路存取
<a name="rotation-function-network-access"></a>

對於 [由 Lambda 函式輪換](rotate-secrets_lambda.md)，當 Secrets Manager 使用 Lambda 函數來輪換秘密時，Lambda 輪換函數必須能夠存取秘密。如果您的秘密包含憑證，則 Lambda 函數也必須能夠存取這些憑證的來源，例如資料庫或服務。

**存取秘密**  
您的 Lambda 輪換函數必須能夠存取 Secrets Manager 服務端點。如果您的 Lambda 函數可以存取網際網路，那麼您可以使用公有端點。若要尋找端點，請參閱 [AWS Secrets Manager 端點](asm_access.md#endpoints)。  
如果 Lambda 函數在無法存取網際網路的 VPC 中執行，建議您在 VPC 中設定 Secrets Manager 服務私有端點。然後，您的 VPC 可以攔截發送到公有區域端點的請求，並將其重新導向到私有端點。如需詳細資訊，請參閱[VPC 端點 (AWS PrivateLink)](vpc-endpoint-overview.md)。  
或者，您可以啟用 Lambda 函數來存取 Secrets Manager 公有端點，方法是將 [NAT 閘道](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-nat-gateway.html)或[網際網路閘道](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Internet_Gateway.html)新增至您的 VPC，以便來自 VPC 的流量到達公有端點。這將使 VPC 暴露在較高的風險下，因為 IP 地址 (用於閘道) 可能會遭到來自公有網際網路的攻擊。

**(選用) 存取資料庫或服務**  
對於 API 金鑰等秘密，沒有需要與秘密一起更新的來源資料庫或服務。  
如果資料庫或服務正在 VPC 中的 Amazon EC2 執行個體上執行，建議您將 Lambda 函數設定為在相同的 VPC 中執行。然後輪換函數就能直接與您的服務進行通訊。如需詳細資訊，請參閱[設定 VPC 存取 ](https://docs.aws.amazon.com/lambda/latest/dg/configuration-vpc.html#vpc-configuring)。  
若要允許 Lambda 函數存取資料庫或服務，您必須確定附加至 Lambda 輪換函數的安全群組允許連至資料庫或服務的傳出連線。此外，您必須確定附加至資料庫或服務的安全群組允許來自 Lambda 輪換函數的傳入連線。

# 對 AWS Secrets Manager 輪換進行故障診斷
<a name="troubleshoot_rotation"></a>

對許多服務而言，Secrets Manager 使用 Lambda 函數來輪換秘密。如需詳細資訊，請參閱[由 Lambda 函式輪換](rotate-secrets_lambda.md)。Lambda 輪換函數會與秘密適用的資料庫或服務，以及 Secrets Manager 互動。並未如您預期般輪換時，您應先查看 CloudWatch 日誌。

**注意**  
某些服務可以為您管理秘密，包括管理自動輪換。如需詳細資訊，請參閱[AWS Secrets Manager 秘密的受管輪換](rotate-secrets_managed.md)。

**Topics**
+ [如何在 AWS Lambda 函數中對秘密輪換失敗進行疑難排解](#troubleshooting-secret-rotation-failures)
+ [「在環境變數中找到憑證」之後沒有活動](#troubleshoot_rotation_timing-out)
+ ["createSecret" 之後沒有任何活動](#troubleshoot_rotation_createSecret)
+ [錯誤：「不允許存取 KMS」](#troubleshoot_rotation_kms-key)
+ [錯誤：「秘密 JSON 缺少金鑰」](#tshoot-lambda-mismatched-secretvalue)
+ [錯誤：「setSecret：無法登入資料庫」](#troubleshoot_rotation_setSecret)
+ [錯誤：「無法匯入模組 'lambda\$1function'」](#tshoot-python-version)
+ [將現有的輪換函數從 Python 3.7 升級至 3.9](#troubleshoot_rotation_python39)
+ [從 Python 3.9 升級現有的輪換函數至 3.10](#troubleshoot_rotation_python_310)
+ [AWS Lambda 秘密輪換`PutSecretValue`失敗](#troubleshoot_rotation_putsecretvalue)
+ [錯誤：「在 <a rotation*> 步驟期間執行 lambda <arn*> 時發生錯誤」 **](#concurrency-related-failures)

## 如何在 AWS Lambda 函數中對秘密輪換失敗進行疑難排解
<a name="troubleshooting-secret-rotation-failures"></a>

如果您的 Lambda 函數發生秘密輪換失敗，請使用下列步驟進行疑難排解並解決問題。

### 可能原因
<a name="possible-causes"></a>
+ Lambda 函數的並行執行不足
+ 輪換期間多次 API 呼叫造成的競賽條件
+ Lambda 函數邏輯不正確
+ Lambda 函數與資料庫之間的聯網問題

### 一般疑難排解步驟
<a name="general-troubleshooting-steps"></a>

1. 分析 CloudWatch 日誌：
   + 在 Lambda 函數日誌中尋找特定錯誤訊息或非預期行為
   + 確認正在嘗試所有輪換步驟 (**CreateSecret**、**SetSecret**、**TestSecret**、**FinishSecret**)

1. 在輪換期間檢閱 API 呼叫：
   + 避免在 Lambda 輪換期間對秘密進行變動 API 呼叫
   + 確保 **RotateSecret**和 **PutSecretValue**呼叫之間沒有競爭條件

1. 驗證 Lambda 函數邏輯：
   + 確認您使用最新的 AWS 範例程式碼進行秘密輪換
   + 如果使用自訂程式碼，請檢閱它以正確處理所有輪換步驟

1. 檢查網路組態：
   + 驗證安全群組規則允許 Lambda 函數存取資料庫
   + 確保 Secrets Manager 的適當 VPC 端點或公有端點存取

1. 測試秘密版本：
   + 確認秘密的 AWSCURRENT 版本允許資料庫存取
   + 檢查 AWSPREVIOUS 或 AWSPENDING 版本是否有效

1. 清除待定輪換：
   + 如果輪換持續失敗，請清除 AWSPENDING 預備標籤，然後重試輪換

1. 檢查 Lambda 並行設定：
   + 驗證並行設定是否適合您的工作負載
   + 如果您懷疑並行問題，請參閱「疑難排解並行相關輪換失敗」一節

## 「在環境變數中找到憑證」之後沒有活動
<a name="troubleshoot_rotation_timing-out"></a>

如果「在環境變數中找到憑證」之後沒有活動，且任務持續時間很長 (例如預設 Lambda 逾時為 30000 毫秒)，則 Lambda 函數可能會在嘗試連線 Secrets Manager 端點時逾時。

您的 Lambda 輪換函數必須能夠存取 Secrets Manager 服務端點。如果您的 Lambda 函數可以存取網際網路，那麼您可以使用公有端點。若要尋找端點，請參閱 [AWS Secrets Manager 端點](asm_access.md#endpoints)。

如果 Lambda 函數在無法存取網際網路的 VPC 中執行，建議您在 VPC 中設定 Secrets Manager 服務私有端點。然後，您的 VPC 可以攔截發送到公有區域端點的請求，並將其重新導向到私有端點。如需詳細資訊，請參閱[VPC 端點 (AWS PrivateLink)](vpc-endpoint-overview.md)。

或者，您可以啟用 Lambda 函數來存取 Secrets Manager 公有端點，方法是將 [NAT 閘道](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-nat-gateway.html)或[網際網路閘道](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Internet_Gateway.html)新增至您的 VPC，以便來自 VPC 的流量到達公有端點。這將使 VPC 暴露在較高的風險下，因為 IP 地址 (用於閘道) 可能會遭到來自公有網際網路的攻擊。

## "createSecret" 之後沒有任何活動
<a name="troubleshoot_rotation_createSecret"></a>

以下是可能導致輪換在 CreateSecret 之後停止的問題：

**VPC 網路 ACL 不允許傳入和傳出 HTTPS 流量。**  
如需詳細資訊，請參閱《Amazon VPC 使用者指南》中的[使用網路 ACL 控制子網路的流量](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-network-acls.html)。

**Lambda 函數逾時組態太短，無法執行任務。**  
如需詳細資訊，請參閱《AWS Lambda 開發人員指南》中的[設定 Lambda 函數選項](https://docs.aws.amazon.com/lambda/latest/dg/configuration-function-common.html)。

**Secrets Manager VPC 端點不允許在所指派安全群組的輸入上使用 VPC CIDR。**  
如需詳細資訊，請參閱《Amazon VPC 使用者指南》中的[使用安全群組控制到資源的流量](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html)。

**Secrets Manager VPC 端點政策不允許 Lambda 使用 VPC 端點。**  
如需詳細資訊，請參閱[使用 AWS Secrets Manager VPC 端點](vpc-endpoint-overview.md)。

**此機密使用交替使用者輪換，超級使用者機密由 Amazon RDS 管理，而 Lambda 函數無法存取 RDS API。**  
對於由[其他 AWS 服務](service-linked-secrets.md)管理超級使用者機密的[交替使用者輪換](rotation-strategy.md#rotating-secrets-two-users)，Lambda 輪換函數必須能夠呼叫此服務端點以取得資料庫連線資訊。建議您為資料庫服務設定 VPC 端點。如需詳細資訊，請參閱：  
+  在*《Amazon RDS 使用者指南》*中的 [Amazon RDS API 和介面 VPC 端點](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/vpc-interface-endpoints.html)。
+ 在 *Amazon Redshift 管理指南*中[使用 VPC 端點](https://docs.aws.amazon.com/redshift/latest/mgmt/enhanced-vpc-working-with-endpoints.html)。

## 錯誤：「不允許存取 KMS」
<a name="troubleshoot_rotation_kms-key"></a>

如果顯示 `ClientError: An error occurred (AccessDeniedException) when calling the GetSecretValue operation: Access to KMS is not allowed`，則輪換函數沒有使用用於加密秘密的 KMS 金鑰來解密秘密的許可。許可政策可能包含一個將加密內容限制為特定秘密的條件。如需有關必要許可的資訊，請參閱[客戶管理金鑰的政策陳述式](rotating-secrets-required-permissions-function.md#rotating-secrets-required-permissions-function-cust-key-example)。

## 錯誤：「秘密 JSON 缺少金鑰」
<a name="tshoot-lambda-mismatched-secretvalue"></a>

Lambda 輪換函數需要秘密值位於特定的 JSON 結構。如果您看到此錯誤，JSON 可能缺少輪換函數先前嘗試存取的金鑰。如需每種秘密類型的 JSON 結構相關資訊，請參閱[AWS Secrets Manager 秘密的 JSON 結構](reference_secret_json_structure.md)。

## 錯誤：「setSecret：無法登入資料庫」
<a name="troubleshoot_rotation_setSecret"></a>

以下是可能導致此錯誤的問題：

**輪換函數無法存取資料庫。**  
如果任務持續時間很長 (例如超過 5000 毫秒)，Lambda 輪換函數可能無法透過網路存取資料庫。  
如果資料庫或服務正在 VPC 中的 Amazon EC2 執行個體上執行，建議您將 Lambda 函數設定為在相同的 VPC 中執行。然後輪換函數就能直接與您的服務進行通訊。如需詳細資訊，請參閱[設定 VPC 存取 ](https://docs.aws.amazon.com/lambda/latest/dg/configuration-vpc.html#vpc-configuring)。  
若要允許 Lambda 函數存取資料庫或服務，您必須確定附加至 Lambda 輪換函數的安全群組允許連至資料庫或服務的傳出連線。此外，您必須確定附加至資料庫或服務的安全群組允許來自 Lambda 輪換函數的傳入連線。

**秘密中的憑證不正確。**  
如果任務持續時間很短，Lambda 輪換函數可能無法使用秘密中的憑證來驗證。使用 AWS CLI 命令 手動登入 `AWSCURRENT`和秘密`AWSPREVIOUS`版本中的資訊，以檢查登入資料[https://docs.aws.amazon.com/cli/latest/reference/secretsmanager/get-secret-value.html](https://docs.aws.amazon.com/cli/latest/reference/secretsmanager/get-secret-value.html)。

**資料庫使用 `scram-sha-256` 來加密機密。**  
如果資料庫是 Aurora PostgreSQL 13 版或更新版本，並且使用 `scram-sha-256` 加密密碼，但輪換函數使用不支援 `scram-sha-256` 的 `libpq` 9 版或更舊版本，則輪換函數無法連接至資料庫。  

**判斷哪些資料庫使用者使用 `scram-sha-256` 加密**
+ 請參閱 [SCRAM Authentication in RDS for PostgreSQL 13](https://aws.amazon.com/blogs/database/scram-authentication-in-rds-for-postgresql-13/) (RDS for PostgreSQL 13 中的 SCRAM 身分驗證) 中的 *Checking for users with non-SCRAM passwords* (檢查具有非 SCRAM 密碼的使用者)。

**判斷輪換函數使用的 `libpq` 版本**

1. 在 Linux 電腦上的 Lambda 主控台上，導覽至輪換函數並下載部署套件。將 zip 檔案解壓縮到工作目錄。

1. 在命令列，在工作目錄中執行：

   `readelf -a libpq.so.5 | grep RUNPATH`

1. 如果您看到字串 *`PostgreSQL-9.4.x`* 或任何小於 10 的主要版本，則輪換函數不支援 `scram-sha-256`。
   + 不支援 `scram-sha-256` 的輪換函數的輸出：

     `0x000000000000001d (RUNPATH) Library runpath: [/local/p4clients/pkgbuild-a1b2c/workspace/build/PostgreSQL/PostgreSQL-9.4.x_client_only.123456.0/AL2_x86_64/DEV.STD.PTHREAD/build/private/tmp/brazil-path/build.libfarm/lib:/local/p4clients/pkgbuild-a1b2c/workspace/src/PostgreSQL/build/private/install/lib]`
   + 支援 `scram-sha-256` 的輪換函數的輸出：

     `0x000000000000001d (RUNPATH) Library runpath: [/local/p4clients/pkgbuild-a1b2c/workspace/build/PostgreSQL/PostgreSQL-10.x_client_only.123456.0/AL2_x86_64/DEV.STD.PTHREAD/build/private/tmp/brazil-path/build.libfarm/lib:/local/p4clients/pkgbuild-a1b2c/workspace/src/PostgreSQL/build/private/install/lib]`
   + 支援 `scram-sha-256` 的輪換函數的輸出：

     `0x000000000000001d (RUNPATH) Library runpath: [/local/p4clients/pkgbuild- a1b2c /workspace/build/PostgreSQL/PostgreSQL-14.x_client_only. 123456 .0/AL2_x86_64/DEV.STD.PTHREAD/build/private/tmp/brazil-path/build.libfarm/lib:/local/p4clients/pkgbuild- a1b2c /workspace/src/PostgreSQL/build/private/install/lib]`
   + 支援 `scram-sha-256` 的輪換函數的輸出：

     `0x000000000000001d (RUNPATH) Library runpath: [/local/p4clients/pkgbuild- a1b2c/workspace/build/PostgreSQL/PostgreSQL- 14.x_client_only.123456.0/AL2_x86_64/DEV.STD.PTHREAD/build/private/tmp/brazil- path/build.libfarm/lib:/local/p4clients/pkgbuild- a1b2c/workspace/src/PostgreSQL/build/private/install/lib]`
如果您在 2021 年 12 月 30 日之前設定自動秘密輪換，輪換函數會綁定不支援 `libpq`的舊版 `scram-sha-256`。若要支援 `scram-sha-256`，您需要[重新建立輪換函數](rotate-secrets_turn-on-for-db.md)。

**資料庫需要 SSL/TLS 存取權限。**  
如果資料庫需要 SSL/TLS 連線，但輪換函數使用未加密的連線，則輪換函數無法連線至資料庫。Amazon RDS (Oracle 和 Db2 除外) 和 Amazon DocumentDB 的輪換函數自動使用 Secure Socket Layer (SSL) 或 Transport Layer Security (TLS) 來連線到您的資料庫 (如果有)。否則，他們會使用未加密的連線。  
如果您在 2021 年 12 月 20 日之前設定自動秘密輪換，您的輪換函數可能基於不支援 SSL/TLS 的較早範本。若要支援使用 SSL/TLS 的連線，您需要[重建輪換函數](rotate-secrets_turn-on-for-db.md)。

**確定輪換函數的建立時間**

1. 在 Secrets Manager 主控台 [https://console.aws.amazon.com/secretsmanager/](https://console.aws.amazon.com/secretsmanager/)，開啟您的秘密。在 **Rotation configuration** (輪換組態) 區段，在 **Lambda rotation function** (Lambda 輪換函數) 下，您會看到 **Lambda function ARN** (Lambda 函數 ARN)，例如 `arn:aws:lambda:aws-region:123456789012:function:SecretsManagerMyRotationFunction `。在此範例 ` SecretsManagerMyRotationFunction ` 中，從 ARN 末尾複製函數名稱。

1. 在 AWS Lambda 主控台 [https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/) 的**函數**下，將 Lambda 函數名稱貼到搜尋方塊中，選擇 Enter，然後選擇 Lambda 函數。

1. 在函數詳細資訊頁面上，**Configuration** (組態) 欄標中，**Tags** (標籤) 下，複製 **aws:cloudformation:stack-name** 索引鍵旁的值。

1. 在 AWS CloudFormation 主控台 [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/) 的 **Stacks** 下，將索引鍵值貼到搜尋方塊中，然後選擇 Enter。

1. 篩選堆疊清單，以便只顯示建立 Lambda 輪換函數的堆疊。在 **Created date** (建立日期) 欄中，檢視堆疊建立的日期。這是建立 Lambda 輪換函數的日期。

## 錯誤：「無法匯入模組 'lambda\$1function'」
<a name="tshoot-python-version"></a>

如果您執行的是先前的 Lambda 函數，由於函數版本已從 Python 3.7 自動升級到較新版本的 Python，則可能會收到此錯誤。若要解決錯誤，您可以將 Lambda 函數版本變更回 Python 3.7，然後 [將現有的輪換函數從 Python 3.7 升級至 3.9](#troubleshoot_rotation_python39)。如需詳細資訊，請參閱 *AWS re:Post* 中的[為什麼我的 Secrets Manager Lambda 函數輪換失敗並顯示「找不到 pg 模組」錯誤？](https://repost.aws/knowledge-center/secrets-manager-lambda-rotation)文章。

## 將現有的輪換函數從 Python 3.7 升級至 3.9
<a name="troubleshoot_rotation_python39"></a>

在 2022 年 11 月之前建立的一些輪換函數使用 Python 3.7。適用於 Python 的 AWS SDK 已於 2023 年 12 月停止支援 Python 3.7。如需詳細資訊，請參閱 [Python 支援 AWS SDKs和工具的政策更新](https://aws.amazon.com/blogs/developer/python-support-policy-updates-for-aws-sdks-and-tools/)。若要切換為使用 Python 3.9 的新輪換函數，您可以將執行期屬性新增至現有的輪換函數或重新建立輪換函數。

**若要查看哪些 Lambda 輪換函數使用 Python 3.7**

1. 登入 AWS 管理主控台 並開啟位於 https：//[https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/) 的 AWS Lambda 主控台。

1. 在**函數**清單中，篩選 **SecretsManager**。

1. 在篩選出的函數清單中，在**執行期**之下，尋找 Python 3.7。

**Topics**
+ [選項 1：使用 重新建立輪換函數 CloudFormation](#update-python-opt-1)
+ [選項 2：使用 更新現有輪換函數的執行時間 CloudFormation](#update-python-opt-2)
+ [選項 3：針對 AWS CDK 使用者，升級 CDK 程式庫](#update-python-opt-3)

### 選項 1：使用 重新建立輪換函數 CloudFormation
<a name="update-python-opt-1"></a>

當您使用 Secrets Manager 主控台開啟輪換時，Secrets Manager 會使用 CloudFormation 來建立必要的資源，包括 Lambda 輪換函數。如果您使用主控台開啟輪換，或是使用 CloudFormation 堆疊建立輪換函數，您可以使用相同的 CloudFormation 堆疊以新名稱重新建立輪換函數。新函數使用了較新版本的 Python。

**尋找建立輪換函數的 CloudFormation 堆疊**
+ 在 Lambda 函數的詳細資訊頁面的**組態**分頁上，選擇**標籤**。檢視 **aws:cloudformation:stack-id** 旁邊的 ARN。

  堆疊名稱嵌入在 ARN 中，如以下範例所示。
  + ARN：`arn:aws:cloudformation:us-west-2:408736277230:stack/SecretsManagerRDSMySQLRotationSingleUser5c2-SecretRotationScheduleHostedRotationLambda-3CUDHZMDMBO8/79fc9050-2eef-11ed-80f0-021fb13c0537`
  + 堆疊名稱：**SecretsManagerRDSMySQLRotationSingleUser5c2-SecretRotationScheduleHostedRotationLambda**

**若要重新建立輪換函數 (CloudFormation)**

1. 在 中 CloudFormation，依名稱搜尋堆疊，然後選擇**更新**。

   如果出現建議您更新根堆疊的對話方塊，請選擇**前往根堆疊**，然後選擇**更新**。

1. 在**更新堆疊**頁面的**準備範本**下，選擇**應用程式編寫器中的編輯**，然後在**應用程式編寫器中的編輯範本**下，選擇**應用程式編寫器中的編輯**按鈕。

1. 在應用程式編寫器中，執行下列動作：

   1. 在範本程式碼中，在 中`SecretRotationScheduleHostedRotationLambda`，將 的值取代`"functionName": "SecretsManagerTestRotationRDS"`為新的函數名稱，例如在 JSON 中， `"functionName": "SecretsManagerTestRotationRDSupdated"`

   1. 選擇**更新範本**。

   1. 在**繼續 CloudFormation**對話方塊中，選擇**確認並繼續 CloudFormation**。

1. 繼續執行 CloudFormation 堆疊工作流程，然後選擇**提交**。

### 選項 2：使用 更新現有輪換函數的執行時間 CloudFormation
<a name="update-python-opt-2"></a>

當您使用 Secrets Manager 主控台開啟輪換時，Secrets Manager 會使用 CloudFormation 來建立必要的資源，包括 Lambda 輪換函數。如果您使用主控台來開啟輪換，或是使用 CloudFormation 堆疊建立輪換函數，您可以使用相同的 CloudFormation 堆疊來更新輪換函數的執行時間。

**尋找建立輪換函數的 CloudFormation 堆疊**
+ 在 Lambda 函數的詳細資訊頁面的**組態**分頁上，選擇**標籤**。檢視 **aws:cloudformation:stack-id** 旁邊的 ARN。

  堆疊名稱嵌入在 ARN 中，如以下範例所示。
  + ARN：`arn:aws:cloudformation:us-west-2:408736277230:stack/SecretsManagerRDSMySQLRotationSingleUser5c2-SecretRotationScheduleHostedRotationLambda-3CUDHZMDMBO8/79fc9050-2eef-11ed-80f0-021fb13c0537`
  + 堆疊名稱：**SecretsManagerRDSMySQLRotationSingleUser5c2-SecretRotationScheduleHostedRotationLambda**

**若要更新輪換函數的執行期 (CloudFormation)**

1. 在 中 CloudFormation，依名稱搜尋堆疊，然後選擇**更新**。

   如果出現建議您更新根堆疊的對話方塊，請選擇**前往根堆疊**，然後選擇**更新**。

1. 在**更新堆疊**頁面的**準備範本**下，選擇**應用程式編寫器中的編輯**，然後在**應用程式編寫器中的編輯範本**下，選擇**應用程式編寫器中的編輯**按鈕。

1. 在應用程式編寫器中，執行下列動作：

   1. 在範本 JSON 中，在 `SecretRotationScheduleHostedRotationLambda`下`Properties`，在 下`Parameters`，新增 **"runtime": "python3.9"**。

   1. 選擇**更新範本**。

   1. 在**繼續 CloudFormation**對話方塊中，選擇**確認並繼續 CloudFormation**。

1. 繼續執行 CloudFormation 堆疊工作流程，然後選擇**提交**。

### 選項 3：針對 AWS CDK 使用者，升級 CDK 程式庫
<a name="update-python-opt-3"></a>

如果您使用 v2.94.0 AWS CDK 之前的 來設定秘密的輪換，您可以透過升級至 v2.94.0 或更新版本來更新 Lambda 函數。如需詳細資訊，請參閱《[AWS Cloud Development Kit (AWS CDK) v2 開發人員指南](https://docs.aws.amazon.com/cdk/v2/guide/home.html)》。

## 從 Python 3.9 升級現有的輪換函數至 3.10
<a name="troubleshoot_rotation_python_310"></a>

Secrets Manager 正在從 Python 3.9 轉換為 3.10 for Lambda 輪換函數。若要切換到使用 Python 3.10 的新輪換函數，您需要根據您的部署方法遵循升級路徑。使用下列程序來升級 Python 版本和基礎相依性。

**尋找哪些 Lambda 輪換函數使用 Python 3.9**

1. 登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/) 開啟 AWS Lambda 主控台。

1. 在**函數**清單中，篩選 **SecretsManager**。

1. 在篩選的函數清單中，於**執行時間**下尋找 **Python 3.9**。

### 依部署方法更新路徑
<a name="update-python-3.9-paths"></a>

此清單中識別的 Lambda 輪換函數可以透過 Secrets Manager 主控台、 AWS Serverless Application Repository 應用程式或 CloudFormation 轉換進行部署。每個部署策略都有不同的更新路徑。

根據函數的部署方式，使用下列其中一個程序來更新您的 Lambda 輪換函數。

------
#### [ AWS Secrets Manager console-deployed functions ]

新的 Lambda 函數必須透過 AWS Secrets Manager 主控台部署，因為您無法手動更新現有 Lambda 函數的相依性。

使用下列程序升級 AWS Secrets Manager 主控台部署的函數。

1. 前往以下位置開啟機密管理員控制台：[https://console.aws.amazon.com/secretsmanager/](https://console.aws.amazon.com/secretsmanager/)。

1. 在 下**AWS Secrets Manager**，選取**秘密**。選取使用您要更新之 Lambda 函數的秘密。

1. 導覽至**輪換**索引標籤，然後選取**更新輪換組態**選項。

1. 在**輪換函數**下，選擇**建立新函數**，然後輸入 Lambda 輪換函數的新名稱。

   1. （選用） 更新完成後，您可以測試更新的 Lambda 函數以確認其如預期般運作。在**輪換**索引標籤下，選取**立即輪換秘密**以啟動立即輪換。

   1. （選用） 您可以在 Amazon CloudWatch 中檢視函數日誌和執行時間使用的 Python 版本。如需詳細資訊，請參閱《 *AWS Lambda 開發人員指南*》中的[檢視 Lambda 函數的 CloudWatch Logs](https://docs.aws.amazon.com/lambda/latest/dg/monitoring-cloudwatchlogs-view.html#monitoring-cloudwatchlogs-console)。

1. 設定新的輪換函數後，您可以刪除舊的輪換函數。

------
#### [ AWS Serverless Application Repository deployments ]

下列程序說明如何升級 AWS Serverless Application Repository 部署。透過 部署的 Lambda 函數 AWS Serverless Application Repository 具有橫幅`This function belongs to an application. Click here to manage it.`，其中包含函數所屬 Lambda 應用程式的連結。

**重要**  
AWS Serverless Application Repository 可用性 AWS 區域 取決於 。

使用下列程序來更新 AWS Serverless Application Repository 已部署的 函數。

1. 在 https：//[https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/) 開啟 AWS Lambda 主控台。

1. 導覽至需要更新之 Lambda 函數的**組態**索引標籤。

   1. 更新部署 AWS Serverless Application Repository 的應用程式時，您將需要函數的下列相關資訊。您可以在 Lambda 主控台中找到此資訊。
     + **Lambda 應用程式的名稱**
       + 您可以使用橫幅中的連結找到 Lambda 應用程式名稱。例如，橫幅會陳述下列 `serverlessrepo-SecretsManagerRedshiftRotationSingleUser`。此範例中的名稱為 `SecretsManagerRedshiftRotationSingleUser`。
     + **Lambda 輪換函數名稱**
     + **Secrets Manager 端點**
       + 您可以在指派給 **SECRETS\$1MANAGER\$1ENDPOINT** 變數**的組態**和環境變數索引標籤下找到端點。 ****

1. 若要升級 Python，您必須更新無伺服器應用程式的語意版本。請參閱《 *AWS Serverless Application Repository 開發人員指南*》中的[更新應用程式](https://docs.aws.amazon.com/serverlessrepo/latest/devguide/serverlessrepo-how-to-consume-new-version.html#update-applications)。

------
#### [ Custom Lambda rotation functions ]

如果您建立了自訂 Lambda 輪換函數，則需要升級這些函數的每個套件相依性和執行時間。如需詳細資訊，請參閱[將 Lambda 函數執行時間升級至最新版本](https://repost.aws/knowledge-center/lambda-upgrade-function-runtime)。

------
#### [ AWS::SecretsManager-2024-09-16 transform macro ]

如果透過此轉換部署 Lambda 函數，[則使用現有範本更新堆疊](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-direct.html)可讓您使用更新的 Lambda 執行時間。

使用下列程序來更新使用現有範本的 CloudFormation 堆疊。

1. 在 https：//[https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/) 開啟 CloudFormation 主控台。

1. 在**堆疊**頁面上，選取您要更新的堆疊。

1. 在堆疊詳細資訊窗格中選擇**更新**。

1. 針對**選擇範本更新方法**，選取**直接更新**。

1. 在**指定範本**頁面上，選取**使用現有範本**。

1. 將所有其他選項保留在其預設值，然後選擇**更新堆疊**。

如果您在更新堆疊時遇到問題，請參閱*CloudFormation 《 使用者指南*》中的[判斷堆疊失敗的原因](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/determine-root-cause-for-stack-failures.html)。

------
#### [ AWS::SecretsManager-2020-07-23 transform macro ]

如果您使用 ，我們建議您遷移至較新的轉換版本`AWS::SecretsManager-2020-07-23`。如需詳細資訊，請參閱 *AWS 安全部落格*中的 [AWS Secrets Manager 轉換的增強版本簡介： AWS：SecretsManager-2024-09-16](https://aws.amazon.com/blogs/security/introducing-an-enhanced-version-of-the-aws-secrets-manager-transform-awssecretsmanager-2024-09-16/)。如果您繼續使用 `AWS::SecretsManager-2020-07-23`，則執行時間版本與 Lambda 函數程式碼成品之間可能會遇到不相符的錯誤。如需詳細資訊，請參閱 *CloudFormation 範本參考*中的 [AWS：：SecretsManager：：RotationSchedule HostedRotationLambda](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-secretsmanager-rotationschedule-hostedrotationlambda.html#cfn-secretsmanager-rotationschedule-hostedrotationlambda-runtime)。

如果您在更新堆疊時遇到問題，請在 *CloudFormation 使用者指南*中[判斷堆疊失敗的原因](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/determine-root-cause-for-stack-failures.html)。

------

**驗證 Python 升級**  
若要驗證 Python 升級，請開啟 Lambda 主控台 ([https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/)：//) 並存取**函數**頁面。選取您更新的函數。在**程式碼來源**區段下，檢閱 目錄中包含的檔案，並確認 Python .so 檔案是版本 `3.10`。

## AWS Lambda 秘密輪換`PutSecretValue`失敗
<a name="troubleshoot_rotation_putsecretvalue"></a>

如果您將擔任的角色或跨帳戶輪換與 Secrets Manager 搭配使用，並在 CloudTrail 中發現具有訊息**RotationFailed**的事件：Lambda LAMBDA*\$1ARN 未建立 Secret SECRET\$1ARN 的待定秘密版本 VERSION\$1ID*。 * * **移除`AWSPENDING`預備標籤並重新啟動輪換，然後您需要更新 Lambda 函數才能使用 `RotationToken` 參數。<a name="troubleshoot_rotation_procedure"></a>

## 更新 Lambda 輪換函數以包含 `RotationToken`
<a name="troubleshoot_rotation_procedure"></a>

1. 下載 Lambda 函數程式碼
   + 開啟 Lambda 主控台
   + 在導覽窗格中，選擇**函數**
   + 選取函數**名稱的 Lambda 秘密輪換函數**
   + 針對**下載**，請選擇其中一個**函數程式碼 .zip**、**AWS SAM 檔案**、**兩者**
   + 選擇**確定**，將函數儲存在本機電腦上。

1. 編輯 `Lambda_handler`

   在 create\$1secret 步驟中包含 rotation\$1token 參數，以進行跨帳戶輪換：

   ```
   def lambda_handler(event, context):
       """Secrets Manager Rotation Template
   
       This is a template for creating an AWS Secrets Manager rotation lambda
   
       Args:
           event (dict): Lambda dictionary of event parameters. These keys must include the following:
               - SecretId: The secret ARN or identifier
               - ClientRequestToken: The ClientRequestToken of the secret version
               - Step: The rotation step (one of createSecret, setSecret, testSecret, or finishSecret)
               - RotationToken: the rotation token to put as parameter for PutSecretValue call
   
           context (LambdaContext): The Lambda runtime information
   
       Raises:
           ResourceNotFoundException: If the secret with the specified arn and stage does not exist
   
           ValueError: If the secret is not properly configured for rotation
   
           KeyError: If the event parameters do not contain the expected keys
   
       """
       arn = event['SecretId']
       token = event['ClientRequestToken']
       step = event['Step']
       # Add the rotation token
       rotation_token = event['RotationToken']
   
       # Setup the client
       service_client = boto3.client('secretsmanager', endpoint_url=os.environ['SECRETS_MANAGER_ENDPOINT'])
   
       # Make sure the version is staged correctly
       metadata = service_client.describe_secret(SecretId=arn)
       if not metadata['RotationEnabled']:
           logger.error("Secret %s is not enabled for rotation" % arn)
           raise ValueError("Secret %s is not enabled for rotation" % arn)
       versions = metadata['VersionIdsToStages']
       if token not in versions:
           logger.error("Secret version %s has no stage for rotation of secret %s." % (token, arn))
           raise ValueError("Secret version %s has no stage for rotation of secret %s." % (token, arn))
       if "AWSCURRENT" in versions[token]:
           logger.info("Secret version %s already set as AWSCURRENT for secret %s." % (token, arn))
           return
       elif "AWSPENDING" not in versions[token]:
           logger.error("Secret version %s not set as AWSPENDING for rotation of secret %s." % (token, arn))
           raise ValueError("Secret version %s not set as AWSPENDING for rotation of secret %s." % (token, arn))
       # Use rotation_token
       if step == "createSecret":
           create_secret(service_client, arn, token, rotation_token)
   
       elif step == "setSecret":
           set_secret(service_client, arn, token)
       
       elif step == "testSecret":
           test_secret(service_client, arn, token)
           
       elif step == "finishSecret":
           finish_secret(service_client, arn, token)
           
       else:
           raise ValueError("Invalid step parameter")
   ```

1. 編輯`create_secret`程式碼

   修改`create_secret`函數以接受並使用 `rotation_token` 參數：

   ```
   # Add rotation_token to the function
   def create_secret(service_client, arn, token, rotation_token):
   """Create the secret
   
   This method first checks for the existence of a secret for the passed in token. If one does not exist, it will generate a
   new secret and put it with the passed in token.
   
   Args:
   service_client (client): The secrets manager service client
   
   arn (string): The secret ARN or other identifier
   
   token (string): The ClientRequestToken associated with the secret version
   
   rotation_token (string): the rotation token to put as parameter for PutSecretValue call
   
   Raises:
   ResourceNotFoundException: If the secret with the specified arn and stage does not exist
   
   """
   # Make sure the current secret exists
   service_client.get_secret_value(SecretId=arn, VersionStage="AWSCURRENT")
   
   # Now try to get the secret version, if that fails, put a new secret
   try:
   service_client.get_secret_value(SecretId=arn, VersionId=token, VersionStage="AWSPENDING")
   logger.info("createSecret: Successfully retrieved secret for %s." % arn)
   except service_client.exceptions.ResourceNotFoundException:
   # Get exclude characters from environment variable
   exclude_characters = os.environ['EXCLUDE_CHARACTERS'] if 'EXCLUDE_CHARACTERS' in os.environ else '/@"\'\\'
   # Generate a random password
   passwd = service_client.get_random_password(ExcludeCharacters=exclude_characters)
   
   # Put the secret, using rotation_token
   service_client.put_secret_value(SecretId=arn, ClientRequestToken=token, SecretString=passwd['RandomPassword'], VersionStages=['AWSPENDING'], RotationToken=rotation_token)
   logger.info("createSecret: Successfully put secret for ARN %s and version %s." % (arn, token))
   ```

1. 上傳更新的 Lambda 函數程式碼

   更新 Lambda 函數程式碼後，[請將其上傳以輪換秘密](https://docs.aws.amazon.com/lambda/latest/dg/configuration-function-zip.html#configuration-function-update)。

## 錯誤：「在 <a rotation*> 步驟期間執行 lambda <arn*> 時發生錯誤」 **
<a name="concurrency-related-failures"></a>

如果您在 Lambda 函數卡在集合迴圈中時遇到間歇性秘密輪換失敗，例如介於 **CreateSecret**和 之間**SetSecret**，問題可能與並行設定有關。

### 並行疑難排解步驟
<a name="concurrency-troubleshooting-steps"></a>

**警告**  
將佈建並行參數設定為小於 10 的值，可能會導致因為 Lambda 函數的執行執行緒不足而導致限流。如需詳細資訊，請參閱《 AWS Lambda 開發人員指南》中的 AWS Lambda [了解預留並行和佈建並行](https://docs.aws.amazon.com/lambda/latest/dg/lambda-concurrency.html#reserved-and-provisioned)。

1. 檢查和調整 Lambda 並行設定：
   + 確認 `reserved_concurrent_executions` 未設定太低 （例如 1)
   + 如果使用預留並行，請將其設定為至少 10
   + 考慮使用未預留並行以提高靈活性

1. 對於佈建並行：
   + 請勿明確設定佈建並行參數 （例如，在 Terraform 中）。
   + 如果您必須設定，請使用至少 10 的值。
   + 徹底測試，以確保所選的值適用於您的使用案例。

1. 監控和調整並行：
   + 使用此公式計算並行：並行 = （每秒平均請求數） \$1 （以秒為單位的平均請求持續時間）。如需詳細資訊，請參閱[預估預留並行](https://docs.aws.amazon.com/lambda/latest/dg/configuration-concurrency.html#estimating-reserved-concurrency)。
   + 在輪換期間觀察並記錄值，以判斷適當的並行設定。
   + 設定低並行值時請小心。如果沒有足夠的可用執行緒，可能會導致限流。

如需設定 Lambda 並行的詳細資訊，請參閱《 AWS Lambda 開發人員指南》中的[設定預留並行](https://docs.aws.amazon.com/lambda/latest/dg/configuration-concurrency.html)和[設定佈建並行](https://docs.aws.amazon.com/lambda/latest/dg/provisioned-concurrency.html)。