AWS Secrets Manager におけるローテーションのトラブルシューティング - AWS Secrets Manager

AWS Secrets Manager におけるローテーションのトラブルシューティング

多くのサービスでは、Secrets Manager は、Lambda 関数を使用してシークレットをローテーションします。詳細については、「Lambda 関数によるローテーション」を参照してください。Lambda ローテーション関数は、シークレットの対象となるデータベースまたはサービス、および Secrets Manager とやり取りします。ローテーションが想定通りに動作していないときは、まず CloudWatch Logs を確認します。

注記

一部のサービスは、ユーザーのためにシークレットを管理できます (自動ローテーションの管理など)。詳細については、「AWS Secrets Manager シークレットのマネージドローテーション」を参照してください。

Lambda 関数の CloudWatch Logs を表示するには
  1. Secrets Manager のコンソール (https://console.aws.amazon.com/secretsmanager/) を開きます。

  2. シークレットを選択し、詳細ページの [Rotation configuration] (ローテーション設定) で、Lambda ローテーション関数を選択します。Lambda コンソールが開きます。

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

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

「環境変数に認証情報が見つかりました」の後にアクティビティがない

「環境変数に認証情報が見つかりました」の後にアクティビティがなく、タスクの所要時間が長い (例: デフォルトの Lambda タイムアウトは 30000 ms) 場合は、Secrets Manager エンドポイントへのアクセス時に Lambda 関数がタイムアウトしている可能性があります。

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

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

別の方法としては、NAT ゲートウェイまたはインターネットゲートウェイを VPC に追加して (これで VPC のトラフィックはパブリックエンドポイントに到達できます)、Lambda 関数から Secrets Manager のパブリックなエンドポイントへのアクセスを許可することも考えられます。この方法では、VPC がある程度のリスクにさらされることになります。ゲートウェイ向けの IP アドレスには、パブリックなインターネットから攻撃が可能なためです。

「CreateSecret」の後にアクティビティがない

CreateSecret の実行後にローテーションが停止する原因となる問題は次のとおりです。

VPC ネットワーク ACL では、HTTPS トラフィックの送受信が許可されません。

詳細については、「Amazon VPC ユーザーガイド」の「ネットワーク ACL を使用してサブネットへのトラフィックを制御する」を参照してください。

Lambda 関数のタイムアウト設定が短すぎてタスクを実行できません。

詳細については、「AWS Lambda デベロッパーガイド」の「Lambda 関数オプションの設定」を参照してください。

Secrets Manager VPC エンドポイントは、割り当てられたセキュリティグループへの進入時に VPC CIDR を許可しません。

詳細については、「Amazon Virtual Private Cloud ユーザーガイド」の「Control traffic to resources using security groups」(セキュリティグループを使用してリソースへのトラフィックを制御する) を参照してください。

Secrets Manager VPC エンドポイントポリシーでは、Lambda が VPC エンドポイントを使用することを許可していません。

詳細については、「AWS Secrets Manager VPC エンドポイントの使用」を参照してください。

シークレットは交代ユーザーローテーションを使用し、スーパーユーザーシークレットは Amazon RDS によって管理され、Lambda 関数は RDS API にアクセスできません。

スーパーユーザーシークレットが他の AWS サービスによって管理されている交代ユーザーローテーションでは、Lambda ローテーション関数がサービスエンドポイントを呼び出してデータベース接続情報を取得できる必要があります。データベースサービスに VPC エンドポイントを設定することを推奨します。詳細については、以下を参照してください。

エラー:「KMS へのアクセスは許可されていません」

ClientError: An error occurred (AccessDeniedException) when calling the GetSecretValue operation: Access to KMS is not allowed が表示されている場合、シークレットの暗号化に使用された KMS キーを使用してシークレットを復号化するアクセス許可が、ローテーション関数に付与されていません。暗号化コンテキストを特定のシークレットに制限する条件が、アクセス許可ポリシーに含まれている可能性があります。必要なアクセス許可の詳細については、「カスタマーマネージドキーのポリシーステートメント」を参照してください。

エラー: 「シークレット JSON にキーがありません」

Lambda ローテーション関数では、シークレット値が特定の JSON 構造になっている必要があります。このエラーが表示される場合は、ローテーション関数がアクセスしようとしたキーが JSON にない可能性があります。各タイプのシークレットの JSON 構造については、「AWS Secrets Manager シークレットの JSON 構造 」を参照してください。

エラー: 「setSecret: データベースにログインできません」

このエラーを引き起こす可能性のある問題は次のとおりです。

ローテーション関数はデータベースにアクセスできません。

タスクの所要時間が長い (例: 5000 ミリ秒以上) 場合、Lambda ローテーション関数はネットワーク経由でデータベースにアクセスできない可能性があります。

データベースまたはサービスを VPC の Amazon EC2 インスタンスで実行している場合は、同じ VPC で Lambda 関数を設定することをお勧めします。こうすることで、ローテーション関数はサービスと直接通信できるようになります。詳細については、Configuring VPC access を参照してください。

Lambda 関数からデータベースまたはサービスへのアクセスを可能にするには、ローテーション用の Lambda 関数にアタッチされたセキュリティグループによって、そのデータベースまたはサービスに対するアウトバウンド接続が許可されている必要があります。同時に、データベースまたはサービスにアタッチされているセキュリティグループでは、ローテーション用 Lambda 関数からのインバウンド接続を許可する必要もあります。

シークレットの認証情報が正しくありません。

タスクの所要時間が短い場合、Lambda ローテーション関数がシークレット内の認証情報を使用しても認証できない可能性があります。AWS CLIのコマンド get-secret-valueAWSCURRENTAWSPREVIOUS のバージョンのシークレットの情報を使用し、手動でログインして認証情報を確認します。

データベースは scram-sha-256 を使用してパスワードを暗号化します。

Aurora PostgreSQL バージョン 13 以降のデータベースで、パスワードの暗号化に scram-sha-256 を使用しているが、ローテーション関数が scram-sha-256 をサポートしていない libpq バージョン 9 以前を使用している場合、ローテーション関数はデータベースに接続できません。

scram-sha-256 暗号化を使用するデータベースユーザーを判別するには
  • ブログ「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 ファイルを作業ディレクトリに解凍します。

  2. コマンドラインの作業ディレクトリで、以下を実行します。

    readelf -a libpq.so.5 | grep RUNPATH

  3. 文字列 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]

注記

2021 年 12 月 30 日より前に自動シークレットローテーションを設定した場合、ローテーション関数には scram-sha-256 をサポートしていない古いバージョンの libpq がバンドルされています。scram-sha-256 をサポートするには、ローテーション関数を再作成する必要があります。

データベースには 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 を使用する接続をサポートするには、ローテーション関数を再作成する必要があります。

ローテーション関数がいつ作成されたかを特定するには
  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 ローテーション関数が作成された日付です。

エラー: 「モジュール 'lambda_function' をインポートできません」

古い (Python 3.7 から新しいバージョンの Python に自動的にアップグレードされた) Lambda 関数を実行している場合に、このエラーが表示されることがあります。このエラーを解決するには、Lambda 関数のバージョンを Python 3.7 に戻してから、既存のローテーション関数を Python 3.7 から 3.9 にアップグレードする を実行します。詳細については、「AWSre:Post」の「Secrets Manager Lambda 関数のローテーションが「pg モジュールが見つかりません」というエラーで失敗したのはなぜですか?」 を参照してください。

既存のローテーション関数を Python 3.7 から 3.9 にアップグレードする

2022 年 11 月よりも前に作成された一部のローテーション関数では、Python 3.7 が使用されていました。AWS SDK for Python は、2023 年 12 月に Python 3.7 のサポートを終了しました。詳細については、「AWS SDK およびツールの Python サポートポリシーに関する最新情報」を参照してください。Python 3.9 を使用する新しいローテーション関数に切り替えるには、既存のローテーション関数にランタイムプロパティを追加するか、またはローテーション関数を再作成します。

Python 3.7 を使用する Lambda ローテーション関数を見つけるには
  1. AWS Management Console にサインインして AWS Lambda コンソール (https://console.aws.amazon.com/lambda/) を開きます。

  2. [関数] のリストで、SecretsManager をフィルタリングします。

  3. フィルタリングされた関数のリストの [ランタイム] で、Python 3.7 を見つけます。

オプション 1: AWS CloudFormation を使用してローテーション関数を再作成する

Secrets Manager コンソールを使用してローテーションをオンにすると、Secrets Manager は Lambda ローテーション関数などの必要なリソースを作成するために AWS CloudFormation を使用します。コンソールを使用してローテーションをオンにした場合、または AWS CloudFormation スタックを使用してローテーション関数を作成した場合は、同じ AWS CloudFormation スタックを使用して新しい名前でローテーション関数を再作成できます。新しい関数は、より新しいバージョンの Python を使用します。

ローテーション関数を作成した AWS 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

ローテーション関数を再作成するには (AWS CloudFormation)
  1. AWS CloudFormation で、名前でスタックを検索し、[更新] を選択します。

    ルートスタックの更新を推奨するダイアログボックスが表示された場合は、[ルートスタックに移動] を選択し、[更新] を選択します。

  2. [スタックの更新] ページで、[テンプレートの準備] から [Application Composer で編集] を選択し、次に [Application Composer でテンプレートを編集] から [Application Composer で編集] を選択します。

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

    1. テンプレートコードの SecretRotationScheduleHostedRotationLambda で、"functionName": "SecretsManagerTestRotationRDS" の値を新しい関数名 (JSON の "functionName": "SecretsManagerTestRotationRDSupdated" など) に置き換えます

    2. [テンプレートの更新] を選択します。

    3. [AWS CloudFormation に進む] ダイアログボックスで、[確認して AWS CloudFormation に進む] を選択します。

  4. AWS CloudFormation スタックワークフローを続行し、[送信] を選択します。

オプション 2: AWS CloudFormation を使用して、既存のローテーション関数のランタイムを更新する

Secrets Manager コンソールを使用してローテーションをオンにすると、Secrets Manager は Lambda ローテーション関数などの必要なリソースを作成するために AWS CloudFormation を使用します。コンソールを使用してローテーションをオンにした場合、または AWS CloudFormation スタックを使用してローテーション関数を作成した場合は、同じ AWS CloudFormation スタックを使用してローテーション関数のランタイムを更新できます。

ローテーション関数を作成した AWS 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

ローテーション関数のランタイムを更新するには (AWS CloudFormation)
  1. AWS CloudFormation で、名前でスタックを検索し、[更新] を選択します。

    ルートスタックの更新を推奨するダイアログボックスが表示された場合は、[ルートスタックに移動] を選択し、[更新] を選択します。

  2. [スタックの更新] ページで、[テンプレートの準備] から [Application Composer で編集] を選択し、次に [Application Composer でテンプレートを編集] から [Application Composer で編集] を選択します。

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

    1. テンプレート JSON で、SecretRotationScheduleHostedRotationLambdaPropertiesParameters"runtime": "python3.9" を追加します。

    2. [テンプレートの更新] を選択します。

    3. [AWS CloudFormation に進む] ダイアログボックスで、[確認して AWS CloudFormation に進む] を選択します。

  4. AWS CloudFormation スタックワークフローを続行し、[送信] を選択します。

オプション 3: AWS CDK ユーザー向けに CDK ライブラリをアップグレードする

バージョン v2.94.0 よりも前の AWS CDK を使用してシークレットのローテーションを設定した場合は、v2.94.0 以降にアップグレードすることで Lambda 関数を更新できます。詳細については、「AWS Cloud Development Kit (AWS CDK) v2 デベロッパーガイド」を参照してください。