

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# AWS Secrets Manager シークレットのローテーション
<a name="rotating-secrets"></a>

*ローテーション*とは、シークレットを定期的に更新するためのプロセスのことです。シークレットのローテーションを行うと、シークレット、ならびに、データベースまたはサービスの認証情報が更新されます。Secrets Manager では、シークレットの自動ローテーションを設定できます。ローテーションには次の 2 つの形式があります。
+ [マネージドローテーション](rotate-secrets_managed.md) – ほとんどの[マネージドシークレット](service-linked-secrets.md)では、マネージドローテーションを使用します。このローテーションでは、サービスによってローテーションが構成および管理されます。マネージドローテーションは Lambda 関数を使用しません。
+ [Secrets Manager が管理する外部シークレットのローテーション](rotate-secrets_external.md) – Secrets Manager パートナーが保持するシークレットの場合、マネージド外部シークレットローテーションを使用してパートナーのシステムのシークレットを更新します。これには Lambda 関数は必要ありません。
+ [Lambda 関数によるローテーション](rotate-secrets_lambda.md) – その他のタイプのシークレットの場合、Secrets Manager ローテーションは Lambda 関数を使用して、シークレットとデータベースまたはサービスを更新します。

# AWS Secrets Manager シークレットのマネージドローテーション
<a name="rotate-secrets_managed"></a>

一部のサービスは、ユーザーに代わってローテーションの設定と管理を行うマネージドローテーションを提供しています。マネージドローテーションでは、 AWS Lambda 関数を使用してデータベース内のシークレットと認証情報を更新しません。

次のサービスは、マネージドローテーションを提供しています。
+ **Amazon Aurora** は、マスターユーザー認証情報のマネージドローテーションを提供します。詳細については、「*Amazon Aurora ユーザーガイド*」の「[Amazon Aurora および AWS Secrets Managerでのパスワード管理](https://docs.aws.amazon.com//AmazonRDS/latest/AuroraUserGuide/rds-secrets-manager.html)」を参照してください。
+ **Amazon ECS** Service Connect は、 AWS Private Certificate Authority TLS 証明書のマネージドローテーションを提供しています。詳細については、「*Amazon Elastic Container Service Developer Guide*」の「[TLS with Service Connect](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-connect-tls.html)」を参照してください。
+ **Amazon RDS** は、マスターユーザー認証情報のマネージドローテーションを提供します。詳細については、「Amazon RDS ユーザーガイド」の「[Amazon RDS および  AWS Secrets Manager でのパスワード管理](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/rds-secrets-manager.html)」を参照してください。
+ **Amazon DocumentDB** は、マスターユーザー認証情報のマネージドローテーションを提供します。詳細については、[Amazon DocumentDB ユーザーガイド」の「Amazon DocumentDB でのパスワード管理」および AWS Secrets Manager](https://docs.aws.amazon.com/documentdb/latest/developerguide/docdb-secrets-manager.html)「」を参照してください。 *Amazon DocumentDB *
+ **Amazon Redshift** は、管理者パスワードのマネージドローテーションを提供します。詳細については、「*Amazon Redshift 管理ガイド*」の「[AWS Secrets Managerを使用して Amazon Redshift 管理者パスワードを管理する](https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-secrets-manager-integration.html)」を参照してください。
+ **マネージド外部シークレット**は、Secrets Manager パートナーが保持するシークレットのマネージドローテーションを提供します。詳細については、「[AWS Secrets Manager マネージド外部シークレットを使用したサードパーティーシークレットの管理](managed-external-secrets.md)」を参照してください。

**ヒント**  
他のすべてのタイプのシークレットについては、「[Lambda 関数によるローテーション](rotate-secrets_lambda.md)」を参照してください。

マネージドシークレットのローテーションは、通常 1 分以内に完了します。ローテーション中、シークレットを取得する新しい接続では、以前のバージョンの認証情報が取得される場合があります。アプリケーションでは、マスターユーザーを使用する代わりに、アプリケーションに必要な最小の特権で作成されたデータベースユーザーを使用するというベストプラクティスに従うことを強くお勧めします。アプリケーションユーザーの場合、可用性を最大限に高めるには、[交代ユーザーローテーション戦略](rotation-strategy.md)を使用できます。

Secrets Manager パートナーが保持するシークレットの場合、

**マネージドローテーションのスケジュールを変更するには**

1. Secrets Manager コンソールでマネージドシークレットを開きます。管理サービスからのリンクをたどるか、Secrets Manager コンソールで[シークレットを検索](service-linked-secrets.md)できます。

1. [**Rotation schedule**] (ローテーションスケジュール) において、UTC タイムゾーンで [**Schedule expression builder**] (スケジュール式ビルダー) にスケジュールを入力するか、[**Schedule expression**] (スケジュール式) としてスケジュールを入力します。Secrets Manager は、スケジュールを `rate()` 式または `cron()` 式として保存します。**[Start time]** (開始時刻) を指定しない限り、ローテーションウィンドウは午前 0 時に自動的に開始されます。シークレットが 4 時間ごとにローテーションされるように設定できます。詳細については、「[ローテーションスケジュール](rotate-secrets_schedule.md)」を参照してください。

1. (オプション) **[Window duration]** (ウィンドウ期間) では、Secrets Manager がシークレットをローテーションするウィンドウの長さを選択します (3 時間のウィンドウの場合は **3h** など)。ウィンドウが次のローテーションウィンドウに重ならないようにしてください。時間単位のローテーションスケジュールでは、**ウィンドウ期間**を指定しない場合、ウィンドウは 1 時間後に自動的に終了します。日数単位のローテーションスケジュールの場合、ウィンドウは 1 日の終わりに自動的に終了します。

1. **[保存]** を選択します。

**マネージドローテーションのスケジュールを変更するには (AWS CLI)**
+ [https://docs.aws.amazon.com/cli/latest/reference/secretsmanager/rotate-secret.html](https://docs.aws.amazon.com/cli/latest/reference/secretsmanager/rotate-secret.html) を呼び出します。次の例では、月の 1 日と 15 日の 16 時から 18 時 (UTC) の間にシークレットがローテーションされます。詳細については、「[ローテーションスケジュール](rotate-secrets_schedule.md)」を参照してください。

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

# Secrets Manager が管理する外部シークレットのローテーション
<a name="rotate-secrets_external"></a>

Secrets Manager は、一部のソフトウェアベンダーと提携して、マネージド外部シークレットを提供しています。この機能は、ローテーションを自動的に処理することで、お客様がシークレットのライフサイクルを管理するのに役立ちます。マネージド外部シークレットを使用すると、お客様は異なるパートナーに保存されているシークレットごとに特定のローテーションロジックを維持する必要がなくなります。これは Secrets Manager によって処理されます。

Secrets Manager でオンボーディングされているパートナーのリストを表示するには、[「マネージド外部シークレットパートナー](https://docs.aws.amazon.com/secretsmanager/latest/userguide/mes-partners.html)」を参照してください。

## コンソールでローテーションを設定する
<a name="rotate-secrets_external-console"></a>

各[統合パートナー](https://docs.aws.amazon.com/secretsmanager/latest/userguide/mes-partners.html)によって指定されたシークレットタイプと値を指定して作成された既存のマネージド外部シークレットのローテーションを設定するには、次の手順を実行します。

1. Secrets Manager コンソールを開きます。

1. リストからマネージド外部シークレットを選択します。

1. **[設定]** タブを選択します。

1. **ローテーション設定**セクションで、**ローテーションの編集**を選択します。

1. **[Automatic rotation]** (自動ローテーション) を有効化します。

1. **ローテーションメタデータ**で、ローテーションに必要なパートナー固有のメタデータを追加します。

   他の必要なメタデータについては、統合パートナーが提供するガイドラインに従ってください。

1. **シークレットローテーションのサービスアクセス許可**で、ローテーション用の IAM ロールを選択または作成します。
   + **新しいロールの作成**を選択して、必要なアクセス許可を持つロールを自動的に作成します
   + または、パートナーに適切なアクセス許可を持つ既存のロールを選択する

   デフォルトでは、アクセス許可はシークレットが作成されたリージョン内の個々のパートナーに限定されます。

1. **ローテーションスケジュール**を設定します (30 日ごとに自動的にローテーションするなど）。

1. **保存**を選択してローテーション設定を適用します。

このプロセス中に設定される 2 つの主要なメタデータフィールドは次のとおりです。


| フィールド | 説明 | 
| --- | --- | 
| ExternalSecretRotationMetadata | Salesforce の API バージョンなど、ローテーションに必要なパートナー固有のメタデータ | 
| ExternalSecretRotationRoleArn | ローテーションに使用される IAM ロールの ARN と、統合パートナーにスコープされたアクセス許可 | 

これらのフィールドの詳細については、「Secrets Manager [が管理する外部シークレットを使用してサードパーティーシークレットを管理する](https://docs.aws.amazon.com/secretsmanager/latest/userguide/managed-external-secrets.html)」を参照してください。

## CLI を使用してローテーションを設定する
<a name="rotate-secrets_external-cli"></a>

次のコマンドを実行して、Salesforce シークレットのローテーションを設定します。このコマンドは、シークレット ID、ローテーション用の IAM ロール ARN、ローテーションスケジュール、ローテーションプロセスに必要なパートナー固有のメタデータを指定します。

```
aws secretsmanager rotate-secret \
            --secret-id SampleSecret \
            --external-secret-rotation-role-arn arn:aws:iam::123412341234:role/xyz \
            --rotation-rules AutomaticallyAfterDays=1 \
            --external-secret-rotation-metadata '[{"Key":"apiVersion","Value":"v65.0"}]'
```

# 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`、`set_secret`、`test_secret`、または `finish_secret`。詳細については、「[ローテーション関数の 4 つのステップ](rotate-secrets_lambda-functions.md#rotate-secrets_lambda-functions-code)」を参照してください。
+ **SecretId** – ローテーションするシークレットの ARN。
+ **ClientRequestToken** – シークレットの新しいバージョンの一意の ID。この値は、べき等性を確保するのに役立ちます。詳細については、「*AWS Secrets Manager API Reference*」の「[PutSecretValue: ClientRequestToken](https://docs.aws.amazon.com/secretsmanager/latest/apireference/API_PutSecretValue.html#SecretsManager-PutSecretValue-request-ClientRequestToken)」を参照してください。
+ **RotationToken** – リクエストのソースを示す一意の ID。引き受けたロールまたはクロスアカウントローテーションを使用したシークレットローテーションに必要です。このローテーションでは、あるアカウントのシークレットを、別のアカウントの Lambda ローテーション関数を使用してローテーションします。いずれの場合も、ローテーション関数は Secrets Manager を呼び出す IAM ロールを引き受け、Secrets Manager はローテーショントークンを使用して IAM ロール ID を検証します。

ローテーションステップが失敗すると、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 DocumentDB、Amazon Redshift のシークレットで自動ローテーションを設定にする
<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. Secrets Manager コンソール ([https://console.aws.amazon.com/secretsmanager/](https://console.aws.amazon.com/secretsmanager/)) を開きます。

1. **[Secrets]** (シークレット) ページで、自分のシークレットを選択します。

1. **シークレットの詳細**ページで、**[Rotation configuration]** (ローテーション設定) セクションの **[Edit rotation]** (ローテーションの編集) を選択します。

1. **[Edit rotation configuration]** (ローテーション設定の編集) ダイアログボックスで、次の操作を行います。

   1. **[Automatic rotation]** (自動ローテーション) を有効化します。

   1. [**Rotation schedule**] (ローテーションスケジュール) において、UTC タイムゾーンで [**Schedule expression builder**] (スケジュール式ビルダー) にスケジュールを入力するか、[**Schedule expression**] (スケジュール式) としてスケジュールを入力します。Secrets Manager は、スケジュールを `rate()` 式または `cron()` 式として保存します。**[Start time]** (開始時刻) を指定しない限り、ローテーションウィンドウは午前 0 時に自動的に開始されます。シークレットが 4 時間ごとにローテーションされるように設定できます。詳細については、「[ローテーションスケジュール](rotate-secrets_schedule.md)」を参照してください。

   1. (オプション) **[Window duration]** (ウィンドウ期間) では、Secrets Manager がシークレットをローテーションするウィンドウの長さを選択します (3 時間のウィンドウの場合は **3h** など)。ウィンドウが次のローテーションウィンドウに重ならないようにしてください。時間単位のローテーションスケジュールでは、**ウィンドウ期間**を指定しない場合、ウィンドウは 1 時間後に自動的に終了します。日数単位のローテーションスケジュールの場合、ウィンドウは 1 日の終わりに自動的に終了します。

   1. (オプション) 変更を保存したときにシークレットをローテーションするには、**[Rotate immediately when the secret is stored]** (シークレットが保存されたときにすぐにローテーションする) を選択します。チェックボックスをオフにすると、最初のローテーションは設定したスケジュールから開始されます。

      手順 3 と 4 がまだ完了していないなどの理由でローテーションが失敗した場合、Secrets Manager はローテーションプロセスを複数回再試行します。

   1. **[Rotation function]** (ローテーション関数) で、次のいずれかを行います。
      + [**Create a new Lambda function**] (新しい Lambda 関数の作成) を選択し、新しい関数の名前を 1 つ入力します。Secrets Manager は、関数名の先頭に「`SecretsManager`」を追加します。Secrets Manager は適切な[テンプレート](reference_available-rotation-templates.md)に基づいて関数を作成し、Lambda 実行ロールに必要な[アクセス権限](rotating-secrets-required-permissions-function.md)を設定します。
      + **[Use an existing Lambda function]** (既存の Lambda 関数を使用する) を選択して、別のシークレットに使用したローテーション関数を再利用します。**推奨 VPC 設定**に記載されているローテーション関数は、データベースと同じ VPC とセキュリティグループを持つため、関数がデータベースにアクセスしやすくなっています。

   1. **[ローテーション戦略]** では、**[単一ユーザー]** または **[代替ユーザー]** 戦略を選択します。詳細については、「[ステップ 1: ローテーション戦略を選択し、オプションでスーパーユーザーシークレットを作成する](#rotate-secrets_turn-on-for-db_step1)」を参照してください。

1. **[保存]** を選択します。

## ステップ 3: (オプション) ローテーション関数に追加のアクセス許可条件を設定する
<a name="rotate-secrets_turn-on-for-db_step3"></a>

ローテーション関数のリソースポリシーには、Lambda が[混乱した代理プログラム](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html)として使用されることを防ぐために、コンテキストキー「[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 サービスでは、混乱した代理シナリオを避けるために、 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"
       }
   },
   ```

 AWS マネージドキー `aws/secretsmanager` 以外の KMS キーを使用しシークレットを暗号化する場合、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 全般のリファレンス*の[AWS Serverless Application Repository 「エンドポイントとクォータ](https://docs.aws.amazon.com/general/latest/gr/serverlessrepo.html)」を参照してください。

1. 次のいずれかを行います。
   +  AWS Serverless Application Repository リージョンで がサポートされている場合:

     1. Lambda コンソールで、**[アプリケーション]**、**[アプリケーション作成]** の順に選択します。

     1. **[アプリケーションの作成]** ページで、**[サーバーレスアプリケーション]** タブを選択します。

     1. **[パブリックアプリケーション]** の検索ボックスに、「**SecretsManagerRotationTemplate**」と入力します。

     1. **[カスタム IAM ロールまたはリソースポリシーを作成するアプリを表示する]** を選択します。

     1. 「**SecretsManagerRotationTemplate**」タイルを選択します。

     1. **[確認、設定、デプロイ]** ページの **[アプリケーション設定]** タイルで、必須フィールドに入力します。
        + **[エンドポイント]** には、**https://** を含むリージョンのエンドポイントを入力します。; エンドポイントのリストについては、「[AWS Secrets Manager エンドポイント](asm_access.md#endpoints)」を参照してください。
        + Lambda 関数を VPC に配置するには、**[vpcSecurityGroupIds]** と **[vpcSubnetIds]** を含めます。

     1. **[デプロイ]** をクリックします。
   + がリージョンでサポート AWS Serverless Application Repository されていない場合:

     1. Lambda コンソールから、**[関数]**、**[関数の作成]** の順に選択します。

     1. [**関数の作成**] ページで、次の操作を実行します。

        1. **Author from scratch** (製作者を最初から) を選択します。

        1. [**Function name**] (関数名) には、関数の名前を入力します。

        1. **Runtime** で、**Python 3.10 **を選択します。

        1. [**関数の作成**] を選択してください。

## ステップ 2: ローテーション関数コードを記述する
<a name="rotate-secrets_turn-on-for-other_write"></a>

このステップでは、シークレットを更新するコードと、シークレットの対象となるサービスまたはデータベースを記述します。独自のローテーション関数を記述するためのヒントなど、ローテーション関数の動作については、「[Lambda ローテーション関数](rotate-secrets_lambda-functions.md)」を参照してください。次の [ローテーション関数のテンプレート](reference_available-rotation-templates.md) をリファレンスとして使用できます。

## ステップ 3: シークレットのローテーションを設定する
<a name="rotate-secrets_turn-on-for-other_configure"></a>

このステップでは、シークレットのローテーションスケジュールを設定し、ローテーション関数をシークレットに接続します。

**ローテーションを設定して空のローテーション関数を作成するには**

1. Secrets Manager コンソール ([https://console.aws.amazon.com/secretsmanager/](https://console.aws.amazon.com/secretsmanager/)) を開きます。

1. **[Secrets]** (シークレット) ページで、自分のシークレットを選択します。

1. **シークレットの詳細**ページで、**[Rotation configuration]** (ローテーション設定) セクションの **[Edit rotation]** (ローテーションの編集) を選択します。**[Edit rotation configuration]** (ローテーション設定の編集) ダイアログボックスで、次の操作を行います。

   1. **[Automatic rotation]** (自動ローテーション) を有効化します。

   1. [**Rotation schedule**] (ローテーションスケジュール) において、UTC タイムゾーンで [**Schedule expression builder**] (スケジュール式ビルダー) にスケジュールを入力するか、[**Schedule expression**] (スケジュール式) としてスケジュールを入力します。Secrets Manager は、スケジュールを `rate()` 式または `cron()` 式として保存します。**[Start time]** (開始時刻) を指定しない限り、ローテーションウィンドウは午前 0 時に自動的に開始されます。シークレットが 4 時間ごとにローテーションされるように設定できます。詳細については、「[ローテーションスケジュール](rotate-secrets_schedule.md)」を参照してください。

   1. (オプション) **[Window duration]** (ウィンドウ期間) では、Secrets Manager がシークレットをローテーションするウィンドウの長さを選択します (3 時間のウィンドウの場合は **3h** など)。ウィンドウが次のローテーションウィンドウに重ならないようにしてください。時間単位のローテーションスケジュールでは、**ウィンドウ期間**を指定しない場合、ウィンドウは 1 時間後に自動的に終了します。日数単位のローテーションスケジュールの場合、ウィンドウは 1 日の終わりに自動的に終了します。

   1. (オプション) 変更を保存したときにシークレットをローテーションするには、**[Rotate immediately when the secret is stored]** (シークレットが保存されたときにすぐにローテーションする) を選択します。チェックボックスをオフにすると、最初のローテーションは設定したスケジュールから開始されます。

   1. **[ローテーション関数]** で、ステップ 1 で作成した [Lambda 関数] を選択します。

   1. **[保存]** を選択します。

## ステップ 4: ローテーション関数が Secrets Manager とデータベースまたはサービスにアクセスすることを許可する
<a name="rotate-secrets_turn-on-for-other_perms"></a>

Lambda ローテーション関数には、Secrets Manager のシークレットにアクセスする権限と、データベースまたはサービスにアクセスする権限が必要です。このステップでは、これらのアクセス権限を Lambda 実行ロールに付与します。 AWS マネージドキー `aws/secretsmanager` 以外の KMS キーを使用しシークレットを暗号化する場合は、そのキーの使用に関するアクセス許可を、Lambda の実行ロールに付与する必要があります。[SecretArn 暗号化コンテキスト](security-encryption.md#security-encryption-encryption-context)を使用して復号化関数の使用を制限できます。この場合、ローテーション関数ロールには、ローテーションに使用するシークレットを復号化するアクセスのみが許可されます。IAM ポリシーの例については、「[ローテーションへのアクセス許可](rotating-secrets-required-permissions-function.md)」を参照してください。

手順については、「*AWS Lambda 開発者ガイド*」の「[Lambda 実行ロール](https://docs.aws.amazon.com/lambda/latest/dg/lambda-intro-execution-role.html)」を参照してください。

## ステップ 5: Secrets Manager がローテーション関数を呼び出すことを許可する
<a name="rotate-secrets_turn-on-for-other_perms2"></a>

Secrets Manager が設定したローテーションスケジュールで、ローテーション関数を呼び出すことができるようにするには、Lambda 関数のリソースポリシーで Secrets Manager サービスプリンシパルに `lambda:InvokeFunction` アクセス許可を付与する必要があります。

ローテーション関数のリソースポリシーには、Lambda が[混乱した代理プログラム](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html)として使用されることを防ぐために、コンテキストキー「[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 サービスでは、混乱した代理シナリオを避けるために、 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 関数にリソースポリシーをアタッチするには、「[リソースベースのポリシーを使用する](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>

シークレットをローテーションするには、ローテーション関数が必要です。ローテーション関数は、Secrets Manager がシークレットをローテーションさせるために呼び出す Lambda 関数です。詳細については、「[Lambda 関数によるローテーション](rotate-secrets_lambda.md)」を参照してください。このステップでは、シークレットを更新するコードと、シークレットの対象となるサービスまたはデータベースを記述します。

Secrets Manager は、[ローテーション関数のテンプレート](reference_available-rotation-templates.md) で Amazon RDS、Amazon Aurora、Amazon Redshift、Amazon DocumentDB データベースシークレットのテンプレートを提供します。

**ローテーション関数コードを記述する**

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 が引き受けるロール ([Lambda 実行ロール](https://docs.aws.amazon.com/lambda/latest/dg/lambda-intro-execution-role.html)) も設定します。

**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 関数にリソースポリシーを設定し、[https://docs.aws.amazon.com/cli/latest/reference/lambda/add-permission.html](https://docs.aws.amazon.com/cli/latest/reference/lambda/add-permission.html) を呼び出すことで Secrets Manager がそれを呼び出せるようにします。

   ```
   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 はデータベースシークレットに対して、2 つのローテーション戦略を提供します。

## ローテーション戦略: シングルユーザー
<a name="rotating-secrets-one-user-one-password"></a>

この戦略は、1 つのシークレット内で 1 人のユーザーの認証情報を更新します。Amazon RDS Db2 インスタンスの場合、ユーザーは自分のパスワードを変更できないため、管理者の認証情報を別のシークレットで提供する必要があります。**これは最も簡単なローテーション戦略であり、ほとんどのユースケースに使用することができます。**特に、1 回限りの (アドホック) ユーザーまたはインタラクティブユーザーの認証情報には、この方法を使用することを推奨します。

シークレットがローテーションしても、開いているデータベース接続は切断されません。ローテーションの実行中、データベース内のパスワードが変更されてからシークレットが更新されるまでには少し時間がかかります。その間に、ローテーションされた認証情報を使用する呼び出しがデータベースによって拒否されるリスクは低く抑えられています。このリスクは、[適切な再試行戦略](https://aws.amazon.com/blogs/architecture/exponential-backoff-and-jitter/)を適用することで低減することが可能です。ローテーション後、新しい接続は新しい認証情報を使用します。

## ローテーション戦略: 交代ユーザー
<a name="rotating-secrets-two-users"></a>

この戦略は、1 つのシークレット内で 2 人のユーザーの認証情報を更新します。最初のユーザーを作成し、その最初のローテーション中に、ローテーション関数がユーザーのクローンを作成して 2 人目のユーザーを作成します。シークレットがローテーションされるたびに、ローテーション関数はパスワードを更新するユーザーを切り替えます。ほとんどのユーザーにはクローン作成権限がないため、`superuser` の認証情報を別のシークレット内で用意する必要があります。データベース内のクローンユーザーがオリジナルユーザーと同じ権限を持っていない場合や、1 回限り (アドホック) またはインタラクティブなユーザーの認証情報には、シングルユーザーローテーション方法を使用することを推奨します。

この戦略は、1 つ目のロールがデータベーステーブルを所有し、2 つ目のロールにそのデータベーステーブルへのアクセス許可を付与するといった権限モデルのデータベースに適しています。また、高可用性を必要とするアプリケーションにも適しています。アプリケーションは、ローテーション中にシークレットを取得しても、引き続き有効な認証情報セットを取得します。ローテーション後、`user` と `user_clone` の両方の認証情報が有効になります。このタイプのローテーション中にアプリケーションが拒否される可能性は、シングルユーザーのローテーションを比較すると一段と低くなります。データベースをホストしているサーバーファームでパスワードの変更がサーバー全体に伝播するまでに時間がかかる場合には、新しい認証情報を使用する呼び出しがデータベースによって拒否されるおそれがあります。このリスクは、[適切な再試行戦略](https://aws.amazon.com/blogs/architecture/exponential-backoff-and-jitter/)を適用することで低減することが可能です。

Secrets Manager は、元のユーザーと同じアクセス許可を持つクローンユーザーを作成します。クローンユーザーが作成された後に元のユーザーの権限を変更する場合は、クローンユーザー側の権限も変更する必要があります。

例えば、データベースユーザーの認証情報を使用してシークレットを作成した場合、そのシークレットには、使用した認証情報によるバージョンが 1 つ含まれます。

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

**1 回目のローテーション** – ローテーション関数がパスワードを生成し、それを使用してユーザーのクローンを作成します。それらの認証情報は、現在のシークレットバージョンになります。

 ![\[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/ja_jp/secretsmanager/latest/userguide/images/AlternatingUsers2.png) 

**2 回目のローテーション** – ローテーション関数は、元のユーザーのパスワードを更新します。

 ![\[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/ja_jp/secretsmanager/latest/userguide/images/AlternatingUsers3.png) 

**3 回目のローテーション** – ローテーション関数は、クローンされたユーザーのパスワードを更新します。

 ![\[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/ja_jp/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) のソースコードを参照してください。
+ セキュリティのため、 は Lambda ローテーション関数 AWS Secrets Manager のみがシークレットを直接ローテーションできるようにします。ローテーション関数では、別の Lambda 関数を呼び出してシークレットをローテーションすることはできません。
+ デバッグのガイダンスについては、「[サーバーレスアプリケーションのテストとデバッグ](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-test-and-debug.html)」を参照してください。
+ 例えば、外部バイナリとライブラリを使用してリソースに接続する場合、それらにパッチを適用して更新する責任があります。
+ ローテーション関数と *my-function.zip* などの依存関係を ZIP ファイルにパッケージ化します。

**警告**  
プロビジョニングされた同時実行パラメータを 10 未満の値に設定すると、Lambda 関数の実行スレッドが不十分であるためにスロットリングが発生する可能性があります。詳細については、「 AWS Lambda AWS Lambda デベロッパーガイド」の「[予約された同時実行とプロビジョニングされた同時実行について](https://docs.aws.amazon.com/lambda/latest/dg/lambda-concurrency.html#reserved-and-provisioned)」を参照してください。

## ローテーション関数の 4 つのステップ
<a name="rotate-secrets_lambda-functions-code"></a>

**Topics**
+ [`createSecret`: シークレットの新しいバージョンを作成する](#w2aac21c11c29c11b5)
+ [**setSecret**: データベースまたはサービスの認証情報を変更する](#w2aac21c11c29c11b7)
+ [**testSecret**: 新しいシークレットバージョンをテストする](#w2aac21c11c29c11b9)
+ [**finishSecret**: ローテーションを終了する](#w2aac21c11c29c11c11)

### `createSecret`: シークレットの新しいバージョンを作成する
<a name="w2aac21c11c29c11b5"></a>

メソッド `createSecret` は、まず渡された `ClientRequestToken` で [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) を呼び出して、シークレットが存在するかどうかを確認します。シークレットがない場合は、[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` に格納することで、冪等性を確保することができます。何らかの理由でローテーションが失敗した場合は、その後の呼び出しでそのシークレット値を参照できます。詳細については、「[Lambda 関数を冪等にするにはどうすればよいですか?](https://aws.amazon.com/premiumsupport/knowledge-center/lambda-function-idempotent/)」を参照してください。

**独自のローテーション関数を記述するためのヒント**
+ 新しいシークレット値には、データベースまたはサービスで有効な文字のみが含まれていることを確認する必要があります。`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」(6 文字) が追加されるため、ユーザー名は最大 26 文字にする必要があります。

### **setSecret**: データベースまたはサービスの認証情報を変更する
<a name="w2aac21c11c29c11b7"></a>

メソッド `setSecret` は、データベースやサービス内の認証情報を、`AWSPENDING` のバージョンの新しいシークレット値と一致するように変更します。

**独自のローテーション関数を記述するためのヒント**
+ データベースなど、ステートメントを解釈するサービスにステートメントを渡す場合は、クエリパラメータ化を使用します。詳細については、*OWASP ウェブサイト*の「[Query Parameterization Cheat Sheet](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** は、[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) を使用して、ステージングラベル `AWSCURRENT` を以前のシークレットバージョンから新しいシークレットバージョンに移動します。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 には、さまざまなデータベースシステムやサービスの認証情報の安全な管理を自動化するのに役立つ一連のローテーション関数テンプレートが用意されています。テンプレートはすぐに使用可能な Lambda 関数であり、認証情報のローテーションに関するベストプラクティスを実装し、手動による介入なしでセキュリティ体制を維持するのに役立ちます。

テンプレートは 2 つの主要なローテーション戦略をサポートしています。
+ *シングルユーザーローテーション*: シングルユーザーの認証情報を更新します。
+ *代替ユーザーのローテーション*: 認証情報の変更中のダウンタイムを排除するために、2 人の個別のユーザーを維持します。

Secrets Manager には、あらゆるタイプのシークレットの開始点となる汎用テンプレートも用意されています。

テンプレートの使用方法については、以下を参照してください。
+ [データベースシークレットの自動ローテーション (コンソール)](rotate-secrets_turn-on-for-db.md)
+ [非データベースシークレットの自動ローテーション (コンソール)](rotate-secrets_turn-on-for-other.md)

独自のローテーション関数を記述するには、「[Write a rotation function](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 (MongoDB 互換性)](#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)
+ [Amazon Timestream for InfluxDB](#template-TimeStream)
  + [Amazon Timestream for InfluxDB シングルユーザー](#template-TimeStream-singleuser)
  + [Amazon Timestream for InfluxDB のユーザー交代](#template-TimeStream-multiuser)
+ [Amazon ElastiCache](#template-ELC)
+ [Active Directory](#template-AD)
  + [Active Directory 認証情報](#template-AD-password)
  + [Active Directory キータブ](#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://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://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>
+ **テンプレートの名前:** SecretsManagerRDSSQLServerRotationMultiUs
+ **ローテーション戦略:** [ローテーション戦略: 交代ユーザー](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 (MongoDB 互換性)
<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

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

これらのテンプレートを使用するには、「*Amazon Timestream Developer Guide*」の「[How Amazon Timestream for InfluxDB uses secrets](https://docs.aws.amazon.com/timestream/latest/developerguide/timestream-for-influx-security-db-secrets.html)」を参照してください。

### Amazon Timestream for InfluxDB シングルユーザー
<a name="template-TimeStream-singleuser"></a>
+ **テンプレート名:** SecretsManagerInfluxDBRotationSingleUser
+ **期待される `SecretString`構造体:** [Amazon Timestream for InfluxDB のシークレット構造](reference_secret_json_structure.md#reference_secret_json_structure_TIME) 
+ **ソースコード: ** [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 クライアント

### Amazon Timestream for InfluxDB のユーザー交代
<a name="template-TimeStream-multiuser"></a>
+ **テンプレート名:** SecretsManagerInfluxDBRotationMultiUser
+ **期待される `SecretString`構造体:** [Amazon Timestream for InfluxDB のシークレット構造](reference_secret_json_structure.md#reference_secret_json_structure_TIME) 
+ **ソースコード: ** [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 ユーザーガイド*」の「[Automatically rotating passwords for users](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://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://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 キータブ
<a name="template-AD-keytab"></a>
+ **テンプレート名:** SecretsManagerActiveDirectoryAndKeytabRotationSingleUser
+ **期待される `SecretString`構造体:** [Active Directory 認証情報](reference_secret_json_structure.md#reference_secret_json_structure_AD) 
+ **ソースコード: ** [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 で実行されている場合、必要な設定のセットアップを行います。[VPC 内のリソースにアクセスするように Lambda 関数を設定する](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>

 AWS マネージドキー `aws/secretsmanager` 以外の KMS キーを使用しシークレットを暗号化する場合は、そのキーの使用に関するアクセス許可を、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 で実行される場合、必要な設定のセットアップを行います。詳細については、「[VPC 内のリソースにアクセスするように Lambda 関数を設定する](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)」を参照してください。  
インターネットにアクセスできない VPC で Lambda 関数を実行する場合は、Secrets Manager サービスのプライベートなエンドポイントを、VPC 内に設定することをお勧めします。VPC は、リージョンのパブリックなエンドポイントに向けられたリクエストを傍受し、それらをプライベートエンドポイントにリダイレクトします。(詳しくは、「[VPC エンドポイント (AWS PrivateLink)](vpc-endpoint-overview.md)」を参照してください。)  
別の方法としては、[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 のトラフィックはパブリックエンドポイントに到達できます)、Lambda 関数から Secrets Manager のパブリックなエンドポイントへのアクセスを許可することも考えられます。この方法では、VPC がある程度のリスクにさらされることになります。ゲートウェイ向けの IP アドレスには、パブリックなインターネットから攻撃が可能なためです。

**(オプション) データベースまたはサービスにアクセスするには**  
API キーなどのシークレットについては、シークレットと一緒に更新する必要のあるソースデータベースやサービスはありません。  
データベースまたはサービスを VPC の Amazon EC2 インスタンスで実行している場合は、同じ VPC で Lambda 関数を設定することをお勧めします。こうすることで、ローテーション関数はサービスと直接通信できるようになります。詳細については、[Configuring VPC access](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 Logs を確認します。

**注記**  
一部のサービスは、ユーザーのためにシークレットを管理できます (自動ローテーションの管理など)。詳細については、「[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 ms) 場合は、Secrets Manager エンドポイントへのアクセス時に Lambda 関数がタイムアウトしている可能性があります。

ローテーション用の Lambda 関数は、Secrets Manager のエンドポイントにアクセスできる必要があります。Lambda 関数がインターネットにアクセスできる場合は、パブリックなエンドポイントを使用できます。エンドポイントを見つけるには、「[AWS Secrets Manager エンドポイント](asm_access.md#endpoints)」を参照してください。

インターネットにアクセスできない VPC で Lambda 関数を実行する場合は、Secrets Manager サービスのプライベートなエンドポイントを、VPC 内に設定することをお勧めします。VPC は、リージョンのパブリックなエンドポイントに向けられたリクエストを傍受し、それらをプライベートエンドポイントにリダイレクトします。(詳しくは、「[VPC エンドポイント (AWS PrivateLink)](vpc-endpoint-overview.md)」を参照してください。)

別の方法としては、[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 のトラフィックはパブリックエンドポイントに到達できます)、Lambda 関数から Secrets Manager のパブリックなエンドポイントへのアクセスを許可することも考えられます。この方法では、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 Virtual Private Cloud ユーザーガイド」の「[Control traffic to resources using security groups](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 インスタンスで実行している場合は、同じ VPC で Lambda 関数を設定することをお勧めします。こうすることで、ローテーション関数はサービスと直接通信できるようになります。詳細については、[Configuring VPC access](https://docs.aws.amazon.com/lambda/latest/dg/configuration-vpc.html#vpc-configuring) を参照してください。  
Lambda 関数からデータベースまたはサービスへのアクセスを可能にするには、ローテーション用の Lambda 関数にアタッチされたセキュリティグループによって、そのデータベースまたはサービスに対するアウトバウンド接続が許可されている必要があります。同時に、データベースまたはサービスにアタッチされているセキュリティグループでは、ローテーション用 Lambda 関数からのインバウンド接続を許可する必要もあります。

**シークレットの認証情報が正しくありません。**  
タスクの所要時間が短い場合、Lambda ローテーション関数がシークレット内の認証情報を使用しても認証できない可能性があります。コマンド を使用して、 `AWSCURRENT`および `AWSPREVIOUS`バージョンのシークレットの情報を使用して手動でログインし、認証情報を確認します AWS CLI [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 日より前に自動シークレットローテーションを設定した場合、ローテーション関数には `scram-sha-256` をサポートしていない前のバージョンの `libpq` がバンドルされています。`scram-sha-256` をサポートするには、[ローテーション関数を再作成](rotate-secrets_turn-on-for-db.md)する必要があります。

**データベースには SSL/TLS アクセスが必要です。**  
SSL/TLS 接続が必要なデータベースを使用しているが、ローテーション関数が暗号化されていない接続を使用する場合、ローテーション関数はデータベースに接続できません。Amazon RDS (Oracle と Db2 を除く) および Amazon DocumentDB のローテーション関数では、使用可能な場合、データベースへの接続に Secure Sockets 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 ` など)。ARN の末尾から関数名をコピーします (この例では ` SecretsManagerMyRotationFunction `)。

1.  AWS Lambda コンソール [https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/) の **Functions** で、検索ボックスに 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/) **の スタック**で、検索ボックスにキー値を貼り付け、Enter を選択します。

1. スタックのリストがフィルタリングされ、Lambda ローテーション関数を作成したスタックだけが表示されます。**[Created date]** (作成日) 列に、スタックが作成された日付が表示されます。これが、Lambda ローテーション関数が作成された日付です。

## エラー: 「モジュール 'lambda\$1function' をインポートできません」
<a name="tshoot-python-version"></a>

古い (Python 3.7 から新しいバージョンの Python に自動的にアップグレードされた) Lambda 関数を実行している場合に、このエラーが表示されることがあります。このエラーを解決するには、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 が使用されていました。 AWS SDK for Python は、2023 年 12 月に Python 3.7 のサポートを停止しました。詳細については、[AWS SDKs](https://aws.amazon.com/blogs/developer/python-support-policy-updates-for-aws-sdks-and-tools/)」を参照してください。Python 3.9 を使用する新しいローテーション関数に切り替えるには、既存のローテーション関数にランタイムプロパティを追加するか、またはローテーション関数を再作成します。

**Python 3.7 を使用する Lambda ローテーション関数を見つけるには**

1. にサインイン AWS マネジメントコンソール し、[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. **[スタックの更新]** ページで、**[テンプレートの準備]** から **[Application Composer で編集]** を選択し、次に **[Application Composer でテンプレートを編集]** から **[Application Composer で編集]** を選択します。

1. Application Composer で、次の操作を行います。

   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. **[スタックの更新]** ページで、**[テンプレートの準備]** から **[Application Composer で編集]** を選択し、次に **[Application Composer でテンプレートを編集]** から **[Application Composer で編集]** を選択します。

1. Application Composer で、次の操作を行います。

   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 は Lambda ローテーション関数を Python 3.9 から 3.10 に移行しています。Python 3.10 を使用する新しいローテーション関数に切り替えるには、デプロイ方法に基づいてアップグレードパスに従う必要があります。次の手順を使用して、Python バージョンと基盤となる依存関係の両方をアップグレードします。

**Python 3.9 を使用する Lambda ローテーション関数を見つけるには**

1. にサインイン AWS マネジメントコンソール し、[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 関数の依存関係を手動で更新することはできないため、新しい Lambda 関数は AWS Secrets Manager コンソールを介してデプロイする必要があります。

 AWS Secrets Manager コンソールにデプロイされた関数をアップグレードするには、次の手順に従います。

1. [https://console.aws.amazon.com/secretsmanager/](https://console.aws.amazon.com/secretsmanager/) から Secrets Manager コンソールを開きます。

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 には、関数が属する Lambda アプリケーションへのリンク`This function belongs to an application. Click here to manage it.`を含むバナーがあります。

**重要**  
AWS Serverless Application Repository の可用性は AWS リージョン 、 によって異なります。

デプロイ AWS Serverless Application Repository された関数を更新するには、次の手順に従います。

1. [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://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** イベントが見つかった場合: 「Pending secret version *VERSION\$1ID *for Secret *SECRET\$1ARN * was not created by Lambda *LAMBDA\$1ARN.*」。`AWSPENDING` ステージングラベルを削除してローテーションを再起動し、`RotationToken` パラメータを使用するように Lambda 関数を更新する必要があります。<a name="troubleshoot_rotation_procedure"></a>

## Lambda ローテーション関数を更新して `RotationToken` を含める
<a name="troubleshoot_rotation_procedure"></a>

1. Lambda 関数コードをダウンロードする
   + Lambda のコンソールを開く
   + ナビゲーションペインで、**[関数]** を選択する
   + **関数名**の Lambda シークレットローテーション関数を選択する
   + **ダウンロード**では、**関数コード .zip**、**AWS SAM ファイル**、**両方**のいずれかを選択します。
   + **[OK]** を選択して、ローカルマシンに関数を保存します。

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` コードの編集

   `rotation_token` パラメータを受け入れて使用するように `create_secret` 関数を改訂します:

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

**CreateSecret** と **SetSecret** の間など、Lambda 関数がセットのループで停止して、シークレットローテーションが断続的に失敗する場合、問題は同時実行設定に関連している可能性があります。

### 同時実行のトラブルシューティング手順
<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 秒あたりの平均リクエスト数) \$1 (秒単位の平均リクエスト時間）。詳細については、「[予約済み同時実行数の見積もり](https://docs.aws.amazon.com/lambda/latest/dg/configuration-concurrency.html#estimating-reserved-concurrency)」 (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)」を参照してください。

# ローテーションスケジュール
<a name="rotate-secrets_schedule"></a>

Secrets Manager は、設定したローテーションウィンドウ中にスケジュールに従ってシークレットをローテーションします。スケジュールとウィンドウを設定するには、ウィンドウ期間とともに **[cron()]** または **[rate()]** 式を使用します。Secrets Manager は、ローテーションウィンドウ中の任意の時刻にシークレットをローテーションします。シークレットは 4 時間ごとに、1 時間単位でローテーションさせることができます。

ローテーションの有効化については、以下を参照してください。
+ [AWS Secrets Manager シークレットのマネージドローテーション](rotate-secrets_managed.md)
+ [Amazon RDS、Amazon Aurora、Amazon DocumentDB、Amazon Redshift のシークレットで自動ローテーションを設定にする](rotate-secrets_turn-on-for-db.md)
+ [データベース以外の AWS Secrets Manager シークレットの自動ローテーションを設定する](rotate-secrets_turn-on-for-other.md)

Secrets Manager のローテーションスケジュールでは、UTC タイムゾーンが使用されます。

## ローテーションウィンドウ
<a name="rotate-secrets_rotation-windows"></a>

Secrets Manager のローテーションウィンドウは、メンテナンスウィンドウに似ています。シークレットをローテーションするタイミングをローテーションウィンドウに設定し、Secrets Manager はローテーションウィンドウ中にシークレットをローテーションします。

Secrets Manager のローテーションウィンドウは、常に正時に開始されます。日数で `rate()` 式を使用するローテーションスケジュールの場合、ローテーションウィンドウは午前 0 時に開始されます。`cron()` 式を使用して、ローテーションウィンドウの開始時刻を設定できます。例については「[cron 式](#rotate-secrets_schedule-cron)」を参照してください。

デフォルトでは、ローテーションウィンドウは、*時間*単位のローテーションスケジュールの場合は 1 時間後に閉じ、*日*単位のローテーションスケジュールの場合は 1 日の最後に閉じます。

**[ウィンドウ期間]** を設定して、ローテーションウィンドウの長さを変更できます。ローテーションウィンドウは最低 1 時間で設定できます。ローテーションウィンドウが次のローテーションウィンドウに重ならないようにしてください。つまり、*時間*単位のローテーションスケジュールの場合、ローテーションウィンドウがローテーション間の時間数以下であることを確認します。*日*単位のローテーションスケジュールの場合、開始時刻とウィンドウ期間の合計時間が 24 時間以下であることを確認します。

## rate 式
<a name="rotate-secrets_schedule-rate"></a>

Secrets Manager の Rate 式は、次のような形式です。*Value* は正の整数で、*Unit* は `hour`、`hours`、`day`、または `days` にできます。

```
rate(Value Unit)
```

シークレットが 4 時間ごとにローテーションされるように設定できます。最大ローテーション期間は 999 日です。例:
+ `rate(4 hours)` は、シークレットが 4 時間ごとにローテーションされることを意味します。
+ `rate(1 day)` は、シークレットが毎日ローテーションされることを意味します。
+ `rate(10 days)` は、シークレットが 10 日ごとにローテーションされることを意味します。

## cron 式
<a name="rotate-secrets_schedule-cron"></a>

Secrets Manager の Cron 式の形式は次のようになります。

```
cron(Minutes Hours Day-of-month Month Day-of-week Year)
```

時間の増分を含む cron 式は、毎日リセットされます。例えば、`cron(0 4/12 * * ? *)` は午前 4 時、および午後 4 時、次いで翌日の午前 4 時、および午後 4 時を意味します。Secrets Manager のローテーションスケジュールでは、UTC タイムゾーンが使用されます。


| スケジュールの例 | 式 | 
| --- | --- | 
| 8 時間ごと、午前 0 時から開始。 |  `cron(0 /8 * * ? *)`  | 
| 8 時間ごと、午前 8 時から開始。 |  `cron(0 8/8 * * ? *)`  | 
| 10 時間ごと、午前 2 時から開始。 ローテーションウィンドウは 2:00、12:00、および 22:00、次いで翌日の 2:00、12:00、および 22:00 に開始されます。 |  `cron(0 2/10 * * ? *)`  | 
| 毎日午前 10:00。 |  `cron(0 10 * * ? *)`  | 
|  毎週土曜日の午後 6:00。  |  `cron(0 18 ? * SAT *)`  | 
|  毎月 1 日の午前 8:00。  |  `cron(0 8 1 * ? *)`  | 
|  3 か月ごとに第 1 日曜日の午前 1:00。  |  `cron(0 1 ? 1/3 SUN#1 *)`  | 
|  毎月最終日の午後 5:00。  |  `cron(0 17 L * ? *)`  | 
|  月曜日から金曜日までの午前 8:00。  |  `cron(0 8 ? * MON-FRI *)`  | 
|  毎月 1 日と 15 日の午後 4:00。  |  `cron(0 16 1,15 * ? *)`  | 
|  毎月第 1 日曜日の午前 0:00。  |  `cron(0 0 ? * SUN#1 *)`  | 
|  1 月に開始され、最初の月曜日の午前 0 時から 11 か月ごと。  |  `cron(0 0 ? 1/11 2#1 *)`  | 

### Secrets Manager の cron 式要件
<a name="rotate-secrets_schedule-cron-ASM"></a>

Secrets Manager では、cron 式に使用できる設定値にはいくつかの制限があります。Secrets Manager の cron 式では、分フィールドに **0** が必要です。これは、Secrets Manager のローテーションウィンドウが正時に開始されるためです。年フィールドには、**\$1** が必要です。これは、Secrets Manager では 1 年以上離れているローテーションスケジュールがサポートされていないためです。次の表に、使用できるオプションを示します。


| **フィールド** | **値** | **ワイルドカード** | 
| --- | --- | --- | 
|  分  | 0 を指定 | なし | 
|  時間  |  0～23  |  **/** (フォワードスラッシュ) を使用して増分を指定します。例えば、`2/10` は午前 2 時から 10 時間ごとを意味します。シークレットが 4 時間ごとにローテーションされるように設定できます。  | 
|  日  |  1～31  |  **,** (カンマ) を使用して追加の値を含めます。例えば、`1,15` は月の 1 日と 15 日を意味します。 **–** (ダッシュ) を使用して範囲を指定します。例えば、`1–15` は月の 1 日から 15 日までの日を意味します。 **\$1** (アスタリスク) を使用してフィールド内のすべての値を含めます。例えば、`*` は月のすべての日を意味します。 **[?]** (疑問符) のワイルドカードは、任意を意味します。Cron 式の `Day-of-month` フィールドと `Day-of-week` フィールドを同時に指定することはできません。一方のフィールドに値を指定する場合、もう一方のフィールドで **[?]** (疑問符) を使用する必要があります。 **/** (フォワードスラッシュ) を使用して増分を指定します。例えば、`1/2` は 1 日目から 2 日おき、つまり 1 日目、3 日目、5 日目などを意味します。 **L** を使用して月の最終日を指定します。 ***DAY*L** を使用して、月の最終曜日を指定します。例えば、`SUNL` は月の最終日曜日を意味します。  | 
|  月  |  1～12 または JAN～DEC  |  **,** (カンマ) を使用して追加の値を含めます。例えば、`JAN,APR,JUL,OCT` は 1 月、4 月、7 月、および 10 月を意味します。 **–** (ダッシュ) を使用して範囲を指定します。例えば、`1–3` とは1 年の 1 か月目から 3 か月目までを意味します。 **\$1** (アスタリスク) を使用してフィールド内のすべての値を含めます。例えば、`*` はすべての月を意味します。 **/** (フォワードスラッシュ) を使用して増分を指定します。例えば、`1/3` は、1 か月目から 3 か月おき、つまり 1 か月目、4 か月目、7 か月目、10 か月目などを意味します。  | 
|  曜日  |  1～7 または SUN～SAT  |  **\$1** を使用して月内の曜日を指定します。例えば、`TUE#3` は月の第 3 火曜日を意味します。 **,** (カンマ) を使用して追加の値を含めます。例えば、`1,4` は 1 日目の曜日と 4 日目の曜日を意味します。 **–** (ダッシュ) を使用して範囲を指定します。例えば、`1–4` は 1 日目から 4 日目までの曜日を意味します。 **\$1** (アスタリスク) を使用してフィールド内のすべての値を含めます。例えば、`*` はすべての曜日を意味します。 **[?]** (疑問符) のワイルドカードは、任意を意味します。Cron 式の `Day-of-month` フィールドと `Day-of-week` フィールドを同時に指定することはできません。一方のフィールドに値を指定する場合、もう一方のフィールドで **[?]** (疑問符) を使用する必要があります。 **/** (フォワードスラッシュ) を使用して増分を指定します。例えば、`1/2` は 1 日目の曜日から 2 日おき、つまり 1 日目、3 日目、5 日目、7 日目などの曜日を意味します。 **L** を使用して最終曜日を指定します。  | 
|  年  | \$1 を指定してください | なし | 

# シー AWS Secrets Manager クレットをすぐにローテーションする
<a name="rotate-secrets_now"></a>

ローテーションできるのは、ローテーションが設定されているシークレットのみです。シークレットにローテーションが設定されているかどうかを確認するには、コンソールでシークレットを表示し、[**Rotation configuration**] (ローテーション設定) セクションまでスクロールします。[**Rotation status**] (ローテーションステータス) が [**Enabled**] (有効) の場合、シークレットにローテーションが設定されます。そうでない場合は、「[AWS Secrets Manager シークレットのローテーション](rotating-secrets.md)」を参照してください。

**すぐにシークレットをローテーションするには (コンソール)**

1. [https://console.aws.amazon.com/secretsmanager/](https://console.aws.amazon.com/secretsmanager/) から Secrets Manager コンソールを開きます。

1. シークレットを選択します。

1. [Secret Details] (シークレットの詳細) ページの、[**Rotation configuration**] (ローテーション設定)で、[**Rotate secret immediately**] (すぐにシークレットをローテーションさせる) をクリックします。

1. [**Rotate secret**] (シークレットのローテーション) ダイアログボックスで、[**Rotate**] (ローテーション) をクリックします。

## AWS CLI
<a name="rotate-secrets_now_cli"></a>

**Example すぐにシークレットをローテーションする**  
次の [https://docs.aws.amazon.com//cli/latest/reference/secretsmanager/rotate-secret.html](https://docs.aws.amazon.com//cli/latest/reference/secretsmanager/rotate-secret.html) の例では、すぐにローテーションが開始されます。シークレットのローテーションは、すでに設定されている必要があります。  

```
$ aws secretsmanager rotate-secret \
    --secret-id MyTestSecret
```

# ローテーションされていないシークレットを検索する
<a name="find-secrets-not-rotating"></a>

 AWS Config を使用してシークレットを評価し、標準に従ってシークレットがローテーションしているかどうかを確認できます。 AWS Config ルールを使用して、シークレットの内部セキュリティおよびコンプライアンス要件を定義します。その後 AWS Config 、 はルールに準拠していないシークレットを識別できます。また、シークレットメタデータ、ローテーション設定、シークレット暗号化に使用される KMS キー、Lambda ローテーション関数、シークレットに関連付けられたタグの変更を追跡することもできます。

複数の AWS アカウント と組織 AWS リージョン 内にシークレットがある場合は、その設定とコンプライアンスデータを集約できます。詳細については、「[Multi-account Multi-Region data aggregation](https://docs.aws.amazon.com/config/latest/developerguide/aggregate-data.html)」を参照してください。

**シークレットがローテーションしているかどうかを評価するには**

1. [AWS Config ルールを使用してリソースを評価する](https://docs.aws.amazon.com/config/latest/developerguide/evaluating-your-resources.html)手順に従い、次のルールから選択します。
   + `[secretsmanager-rotation-enabled-check](https://docs.aws.amazon.com/config/latest/developerguide/secretsmanager-rotation-enabled-check.html)` — Secrets Manager に保存されているシークレットに対してローテーションが設定されているかどうかを確認します。
   + `[secretsmanager-scheduled-rotation-success-check](https://docs.aws.amazon.com/config/latest/developerguide/secretsmanager-scheduled-rotation-success-check.html)` – 最後に成功したローテーションが、設定されたローテーション頻度の範囲内であるかどうかをチェックします。チェックの最小頻度は日次です。
   + `[secretsmanager-secret-periodic-rotation](https://docs.aws.amazon.com/config/latest/developerguide/secretsmanager-secret-periodic-rotation.html)` — 指定した日数内にシークレットがローテーションされたかどうかを確認します。

1. 必要に応じて、シークレットが準拠していない場合に通知する AWS Config ように を設定します。詳細については、[「 が Amazon SNS トピック AWS Config に送信する通知](https://docs.aws.amazon.com/config/latest/developerguide/notifications-for-AWS-Config.html)」を参照してください。

# Secrets Manager で自動ローテーションをキャンセルする
<a name="cancel-automatic-rotation"></a>

シークレットの[自動ローテーション](rotating-secrets.md)を構成している場合に、ローテーションを停止するには、ローテーションをキャンセルできます。

**自動ローテーションをキャンセルするには**

1. [https://console.aws.amazon.com/secretsmanager/](https://console.aws.amazon.com/secretsmanager/) から Secrets Manager コンソールを開きます。

1. シークレットを選択します。

1. シークレットの詳細ページで、**[ローテーション設定]** から **[ローテーションの編集]** を選択します。

1. **[ローテーション設定の編集]** ダイアログボックスで、**[自動ローテーション]** をオフにして、**[保存]** を選択します。

   Secrets Manager はローテーション設定情報を保持するため、将来ローテーションを再びオンにする場合に、後から使用できます。