

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

# 對 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\_function'」](#tshoot-python-version)
+ [將現有的輪換函數升級至 Python 3.12](#troubleshoot_rotation_python_latest)
+ [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\_function'」
<a name="tshoot-python-version"></a>

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

## 將現有的輪換函數升級至 Python 3.12
<a name="troubleshoot_rotation_python_latest"></a>

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

### 將現有的輪換函數從 Python 3.7 升級到 Python 3.12
<a name="troubleshoot_rotation_python_upgrade37"></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.12 的新輪換函數，您可以將執行期屬性新增至現有的輪換函數，或重新建立輪換函數。

**若要查看哪些 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:{{aws-region}}:123456789012: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:{{aws-region}}:123456789012:stack/SecretsManagerRDSMySQLRotationSingleUser5c2-SecretRotationScheduleHostedRotationLambda-3CUDHZMDMBO8/79fc9050-2eef-11ed-80f0-021fb13c0537`
  + 堆疊名稱：**SecretsManagerRDSMySQLRotationSingleUser5c2-SecretRotationScheduleHostedRotationLambda**

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

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

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

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

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

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

   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 或更新版本升級至 Python 3.12
<a name="troubleshoot_rotation_python_upgrade39_plus"></a>

**若要尋找哪些 Lambda 輪換函數使用較舊版本的 Python**

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

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

1. 在篩選的函數清單的**執行時間**下，尋找 之前的 Python 版本**Python 3.12**。

#### 依部署方法更新路徑
<a name="update-python-version-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\_MANAGER\_ENDPOINT** 變數**的組態**和環境變數索引標籤下找到端點。 ****

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.12`。

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

如果您使用擔任的角色或 Secrets Manager 的跨帳戶輪換，而且在 CloudTrail 中發現具有訊息**RotationFailed**的事件：Lambda LAMBDA{{\_ARN 未建立 Secret SECRET\_ARN 的待定秘密版本 VERSION\_ID}}。 {{ }} {{}}移除`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\_secret 步驟中包含 rotation\_token 參數，以進行跨帳戶輪換：

   ```
   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>

**警告**  
由於 Lambda 函數的執行執行緒不足，將佈建並行參數設定為低於 10 的值可能會導致限流。如需詳細資訊，請參閱《 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. 監控和調整並行：
   + 使用此公式計算並行：並行 = （每秒平均請求數） \* （以秒為單位的平均請求持續時間）。如需詳細資訊，請參閱[預估預留並行](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)。