AWS Secrets Manager におけるローテーションのトラブルシューティング
Secrets Manager は、Lambda 関数を使用してシークレットをローテーションします。詳細については、「ローテーションの仕組み」を参照してください。Lambda ローテーション関数は、シークレットの対象となるデータベースまたはサービス、および Secrets Manager とやり取りします。ローテーションが想定通りに動作していないときは、まず CloudWatch Logs を確認します。
Lambda 関数の CloudWatch Logs を表示するには
Secrets Manager のコンソール (https://console.aws.amazon.com/secretsmanager/
) を開きます。 -
シークレットを選択し、詳細ページの [Rotation configuration] (ローテーション設定) で、Lambda ローテーション関数を選択します。Lambda コンソールが開きます。
-
[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 にアクセスできません。
-
スーパーユーザーシークレットが Amazon RDS によって管理される代替ユーザーローテーションでは、Lambda ローテーション関数が Amazon RDS サービスエンドポイントを呼び出してデータベース接続情報を取得できる必要があります。Amazon RDS の VPC エンドポイントすることを推奨します。詳細は、「Amazon RDS ユーザーガイド」の「Amazon RDS API およびインターフェース VPC エンドポイント」をご覧ください。
エラー: 「シークレット 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-value
でAWSCURRENT
とAWSPREVIOUS
のバージョンのシークレットの情報を使用し、手動でログインして認証情報を確認します。- データベースは
scram-sha-256
を使用してパスワードを暗号化します。 Aurora PostgreSQL バージョン 13 以降のデータベースで、パスワードの暗号化に
scram-sha-256
を使用しているが、ローテーション関数がscram-sha-256
をサポートしていないlibpq
バージョン 9 以前を使用している場合、ローテーション関数はデータベースに接続できません。暗号化を使用するデータベースユーザーを判別するには
-
ブログ「SCRAM Authentication in RDS for PostgreSQL 13
」(RDS for PostgreSQL 13 での SCRAM 認証) の「Checking for users with non-SCRAM passwords」(SCRAM 以外のパスワードを持つユーザーの確認) を参照してください。
ローテーション関数が使用する
libpq
のバージョンを判別するにはLinux ベースのコンピュータの Lambda コンソールで、ローテーション関数に移動し、デプロイバンドルをダウンロードします。zip ファイルを作業ディレクトリに解凍します。
-
コマンドラインの作業ディレクトリで、以下を実行します。
readelf -a libpq.so.5 | grep RUNPATH
文字列
、または 10 未満のメジャーバージョンが表示されている場合、ローテーション関数はPostgreSQL-9.4.x
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 を除く) および Amazon DocumentDB のローテーション関数では、使用可能な場合、データベースへの接続に Secure Sockets Layer (SSL) または Transport Layer Security (TLS) が使用されます。使用できない場合は、暗号化されていない接続が使用されます。
注記
2021 年 12 月 20 日より前に自動シークレットローテーションを設定した場合は、ローテーション関数が SSL/TLS をサポートしていない古いテンプレートに基づいている可能性があります。SSL/TLS を使用する接続をサポートするには、ローテーション関数を再作成する必要があります。
ローテーション関数がいつ作成されたかを特定するには
-
Secrets Manager コンソール (https://console.aws.amazon.com/secretsmanager/
) で、シークレットを開きます。[Rotation configuration] (ローテーション構成) セクションの [Lambda rotation function] (Lambda ローテーション関数) の下に、[Lambda function ARN] (Lambda 関数 ARN) が表示されます ( arn:aws:lambda:
など)。ARN の末尾から関数名をコピーします (この例ではaws-region
:123456789012
:function:SecretsManagerMyRotationFunction
SecretsManagerMyRotationFunction
-
AWS Lambda コンソール (https://console.aws.amazon.com/lambda/
) の [Functions] (関数) で、Lambda 関数名を検索ボックスに貼り付けて、[Enter] (入力) を選択してから、Lambda 関数を選択します。 -
関数の詳細ページで、[Configuration] (設定) タブの [Tags] (タグ) で、キー aws:cloudformation:stack-name の横にある値をコピーします。
-
AWS CloudFormation コンソール (https://console.aws.amazon.com/cloudformation
) の [Stacks] (スタック) で、キー値を検索ボックスに貼り付けてから、[Enter] (入力) を選択します。 -
スタックのリストがフィルタリングされ、Lambda ローテーション関数を作成したスタックだけが表示されます。[Created date] (作成日) 列に、スタックが作成された日付が表示されます。これが、Lambda ローテーション関数が作成された日付です。
-