トラブルシューティング AWS Secrets Manager 秘密のローテーション - AWS Secrets Manager

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

トラブルシューティング AWS Secrets Manager 秘密のローテーション

この情報を使用して、Secrets Manager シークレットを更新するときに発生する可能性がある一般的なエラーの診断や修復を行います。

AWS Secrets Manager のシークレットの更新では、シークレットを所有するデータベースまたはサービスとやりとりする方法を定義する Lambda 関数を使用する必要があります。

Lambda ローテーション関数の診断ログを確認する方法

ローテーション関数が期待どおりに動作していない場合、最初に CloudWatch ログを確認する必要があります。Secrets Manager では、Lambda ローテーション関数用テンプレートコードを提供し、このコードが CloudWatch ログにエラーメッセージを書き込みます。

Lambda 関数の CloudWatch ログを表示するには

  1. AWS Lambda コンソール (https://console.aws.amazon.com/lambda/) を開きます。

  2. 関数のリストから、シークレットに関連付けられている Lambda 関数の名前を選択します。

  3. [モニタリング] タブを選択します。

  4. [呼び出しエラー] セクションで、[Jump to Logs] (ログにジャンプ) を選択します。

    CloudWatch コンソールが開き、関数のログを表示します。

ローテーションが開始される時を予測できません

次のローテーションの日付のみを予測できます。時間は予測できません。

前のローテーションが完了すると、Secrets Manager は次のローテーションをスケジュールします。Secrets Manager は、最後のローテーションの実際の日付にローテーションの間隔 (日数) を追加して、日付をスケジュールします。サービスは、その 24 時間の日付の枠内で時間をランダムに選択します。分も若干ランダムに選択されますが、正時に向かって重み付けされ、負荷を分散させるのに役立つさまざまな要素に影響されます。

シークレットのローテーションを設定しようとすると「アクセス拒否」が発生する

Lambda ローテーション関数の Amazon リソースネーム (ARN) をシークレットに追加すると、Secrets Manager は、関数のアクセス許可をチェックします。関数のロールポリシーは、Secrets Manager サービスプリンシパル secretsmanager.amazonaws.com に、関数 (lambda:InvokeFunction) を呼び出すアクセス許可を付与する必要があります。

このアクセス許可を追加するには、次の AWS CLI コマンドを実行します。

aws lambda add-permission --function-name ARN_of_lambda_function --principal secretsmanager.amazonaws.com --action lambda:InvokeFunction --statement-id SecretsManagerAccess

ローテーションを有効にすると最初のローテーションに失敗する

「マスター」シークレットを使用して保護されたサービスで認証情報を変更するシークレットのローテーションを有効にすると、Secrets Manager は、ローテーションに必要なほとんどの要素を自動的に設定します。ただし、Secrets Manager は、Lambda 関数にマスターシークレットを読み取るためのアクセス許可を自動的に付与することはできません。このアクセス許可を明示的に付与する必要があります。具体的には、Lambda ローテーション関数にアタッチされた IAM ロールにアタッチされているポリシーにアクセス許可を追加して、アクセス許可を付与します。このポリシーには、次のステートメントが含まれている必要があります (これは、ステートメントのみで、ポリシー全体ではありません)。ポリシー全体については、セクション CloudTrail がローテーション中にアクセス拒否エラーを表示する の 2 番目のサンプルポリシーを参照してください。

{ "Sid": "AllowAccessToMasterSecret", "Effect": "Allow", "Action": "secretsmanager:GetSecretValue", "Resource": "ARN_of_master_secret" }

これにより、ローテーション関数は、マスターシークレットから認証情報を取得することができます。次に、マスターシークレットの認証情報を使用して、ローテーションされるシークレットの認証情報を変更することができます。

シークレット値はローテーション関数が予期する形式ではないため、ローテーションが失敗します。

また、シークレット値はローテーション関数が予期する JSON 構造形式ではないため、ローテーションが失敗する可能性があります。使用するローテーション関数によって、使用する形式が決まります。各回転関数がシークレット値に対して要求する機能の詳細については、 期待値 SecretString 値 関連回転機能の下に入力 Lambda ローテーション関数の作成に使用できる AWS テンプレート .

たとえば、 MySQL シングルユーザー回転機能、 SecretString テキスト構造は次のようになります。

{ "engine": "mysql", "host": "<required: instance host name/resolvable DNS name>", "username": "<required: username>", "password": "<required: password>", "dbname": "<optional: database name. If not specified, defaults to None>", "port": "<optional: TCP port number. If not specified, defaults to 3306>" }

Secrets Manager は、ローテーションを正常に設定したが、パスワードはローテーションしていない

これは、Lambda 関数がセキュリティ保護されたデータベース/サービス、またはパブリックインターネットの Secrets Manager サービスエンドポイントと通信できないようなネットワーク設定の問題がある場合に発生することがあります。VPC でデータベースまたはサービスを実行する場合は、設定に 2 つのオプションのいずれかを使用します。

このタイプの設定の問題がローテーションの失敗の原因であるかどうかを判断するには、以下の手順を実行します。

ローテーション関数とデータベース、または Secrets Manager との間の接続の問題を診断するには

  1. 手順 Lambda ローテーション関数の診断ログを確認する方法 に従って、ログを開きます。

  2. ログファイルを調べ、Lambda 関数と AWS Secrets Manager サービスの間、または Lambda 関数とセキュリティで保護されたデータベースまたはサービスとの間にタイムアウトが発生していることを示していないかを確認します。

  3. VPC 環境内で相互運用するためにサービスと Lambda 関数を設定する方法については、「 Amazon Virtual Private Cloud ドキュメント」と「AWS Lambda Developer Guide」を参照してください。

ローテーションがエラーメッセージ「内部エラー」で失敗する

ローテーション関数で新しいパスワードを生成し、それを新しい認証情報としてデータベースに保管する場合は、指定されたデータベースに有効な文字のみパスワードに含まれていることを確認する必要があります。パスワードにデータベースエンジンで受け入れられない文字が含まれていると、ユーザーのパスワードの設定は失敗します。このエラーは、「内部エラー」として表示されます。使用できる文字のリストについては、データベースのドキュメントを参照してください。次に、GetRandomPassword API コールの ExcludeCharacters パラメータを使用して、その他すべてを除外します。

CloudTrail がローテーション中にアクセス拒否エラーを表示する

ローテーションを設定するときに、Secrets Manager にローテーション関数を作成させると、Secrets Manager により、適切なアクセス許可を付与する関数の IAM ロールにアタッチされたポリシーが自動的に提供されます。カスタム関数を作成する場合、関数にアタッチされているロールに、次のアクセス許可を付与する必要があります。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "secretsmanager:DescribeSecret", "secretsmanager:GetRandomPassword", "secretsmanager:GetSecretValue", "secretsmanager:PutSecretValue", "secretsmanager:UpdateSecretVersionStage", ], "Resource": "*" } ] }

また、ローテーションで、別個のマスターシークレットの認証情報を使用してこのシークレットをローテーションする場合は、マスターシークレットからシークレット値を取得する権限を付与する必要があります。詳細については、ローテーションを有効にすると最初のローテーションに失敗する を参照してください。結合されたポリシーは次のようになります。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowAccessToSecretsManagerAPIs", "Effect": "Allow", "Action": [ "secretsmanager:DescribeSecret", "secretsmanager:GetRandomPassword", "secretsmanager:GetSecretValue", "secretsmanager:PutSecretValue", "secretsmanager:UpdateSecretVersionStage", ], "Resource": "*" }, { "Sid": "AllowAccessToMasterSecret", "Effect": "Allow", "Action": "secretsmanager:GetSecretValue", "Resource": "<arn_of_master_secret>" } ] }