シークレットの AWS Secrets Manager ローテーションのトラブルシューティング - AWS Secrets Manager

シークレットの AWS Secrets Manager ローテーションのトラブルシューティング

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

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

Lambda ローテーション関数の診断ログを確認します

ローテーション関数が想定通りに動作していないときは、まず CloudWatch Logs を確認します。Secrets Manager が Lambda ローテーション関数用のテンプレートコードを提供し、このコードが CloudWatch Logs にエラーメッセージを書き込みます。

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

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

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

  3. [Monitor] (モニター) タブで、[Logs] (ログ)、[View logs in CloudWatch] (CloudWatch にログを表示) の順に選択します。

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

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

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 構造形式ではないため、ローテーションが失敗する可能性があります。使用するローテーション関数によって、使用する形式が決まります。シークレット値のために各ローテーション関数で必要となる項目の詳細については、Secrets Manager でのローテーション関数テンプレート の関連するローテンション関数の下の、Expected SecretString Value エントリを参照してください。

例えば、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 デベロッパーガイドを参照してください。

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

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

データベースに SSL/TLS 接続が必要だが、Lambda ローテーション関数が SSL/TLS を使用していない

ローテーション関数が暗号化されていない接続が、SSL/TLS 接続が必要なデータベースに使用されている場合、ローテーション関数はデータベースに接続できず、ローテーションは失敗します。Amazon CloudWatch では、ローテーション関数により次のいずれかのエラーがログに記録されます。

  • シングルユーザーのローテーションの場合は次のようになります。

    setSecret: Unable to log into database with previous, current, or pending secret of secret arn SecretArn

  • マルチユーザーのローテーションの場合は次のようになります。

    setSecret: Unable to log into database using current credentials for secret SecretArn

Amazon RDS (Oracle を除く) および Amazon DocumentDB のローテーション関数では、使用可能な場合、データベースへの接続に Secure Sockets Layer (SSL) または Transport Layer Security (TLS) が使用されます。使用できない場合は、暗号化されていない接続が使用されます。

注記

2021 年 12 月 20 日より前に自動シークレットローテーションを設定した場合は、ローテーション関数が SSL/TLS をサポートしていない古いテンプレートに基づいている可能性があります。SSL/TLS を使用する接続をサポートするには、ローテーション関数を再作成する必要があります。

ローテーション関数がいつ作成されたかを特定するには

  1. Secrets Manager コンソール (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)。

  2. AWS Lambda コンソール (https://console.aws.amazon.com/lambda/) の [Functions] (関数) で、Lambda 関数名を検索ボックスに貼り付けて、[Enter] (入力) を選択してから、Lambda 関数を選択します。

  3. 関数の詳細ページで、[Configuration] (設定) タブの [Tags] (タグ) で、キー aws:cloudformation:stack-name の横にある値をコピーします。

  4. AWS CloudFormation コンソール (https://console.aws.amazon.com/cloudformation) の [Stacks] (スタック) で、キー値を検索ボックスに貼り付けてから、[Enter] (入力) を選択します。

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