

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

# 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)」を参照してください。