IAM 認証を使用して Amazon RDS for PostgreSQL または Aurora PostgreSQL クラスターに接続する際の問題のトラブルシューティングを行うにはどうすればよいですか。
Amazon Relational Database Service (Amazon RDS) for PostgreSQL インスタンスまたは Amazon Aurora PostgreSQL-Compatible クラスターに接続したいのですが、どうすればよいですか。AWS ID アクセス管理 (IAM) 認証を使用して接続しようとすると、「ユーザーの PAM 認証に失敗しました」というエラーが表示されます。
簡単な説明
以下のいずれかの理由により、IAM 認証を使用して Amazon RDS for PostgreSQL または Aurora DB インスタンスに接続できない場合があります。
- IAM 認証がオフになっています
- IAM ロールの権限が不十分であるか、ポリシーが正しくありません
- データベースユーザーの設定が不適切
- 接続文字列が正しくない
- IAM エンティティが正しくありません
解決方法
IAM 認証はオフになっています
デフォルトでは、IAM 認証は無効になっています。お使いの RDS for PostgreSQL インスタンスまたは Aurora PostgreSQL クラスターの構成設定を確認してください。IAM 認証が有効になっていることを確認します。Amazon RDS コンソールから、[Database Authentication] (データベース認証) を選択して、Aurora クラスターか RDS インスタンスを変更できます。次に、[IAM database authentication] (IAM データベース認証) を選択し、[Continue] (続行) をクリックして設定を更新します。
注: クラスター設定の更新時に [Apply Immediately] (すぐに適用) を選択すると、保留中のすべての変更がただちに適用されます。このアクションを実行してもダウンタイムは発生しません。
IAM ロールのアクセス許可が不十分
[{IAM database authentication]](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/UsingWithRDS.IAMDBAuth.html) {IAM データベース認証) を使用して DB インスタンスに正常に接続するには、rds-db:connect アクションにアクセスできる必要があります。rds-db:connect アクションにより、DB インスタンスへ接続できます。
例:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "rds-db:connect" ], "Resource": [ " arn:aws:rds-db:region:account-id:dbuser:(DbiResourceId for RDS PostgreSQL or DbClusterResourceId for Aurora PostgreSQL)/db_user_name" ] }]
注: db-username は、IAM 認証に関連付けられているデータベースアカウントユーザーに置き換えます。
さらに、ARN を指定するだけではなく、正しいリソース ID を使用していることを確認してください。DB インスタンスのリソース ID を見つけるには、Amazon RDS コンソールで DB インスタンスまたはクラスターを選択します。次に、[Configuration] (設定) タブを選択して、リソース ID を表示します。
IAM ポリシーの例にリストされている要素の詳細については、「IAM データベースのアクセス用の IAM ポリシーの作成と使用」を参照してください。
注: IAM 認証は、ポリシーステートメントの条件要素で使用できるサービス固有のコンテキストキーをサポートしていません。IAM 認証は、すべてのグローバル条件コンテキストキーをサポートしているわけでもありません。グローバル条件コンテキストキーの詳細については、IAM ユーザーガイドの「AWS グローバル条件コンテキストキー」を参照してください。
データベースユーザーの設定が不適切
PostgreSQL で IAM 認証を使用するには、データベースユーザーに rds_iam ロールを付与します。このロールがユーザーに関連付けられていることを確認するには、次のコマンドを実行します。
注: このコマンドは PostgreSQL クライアントでのみ実行されます。
\du
出力は以下のようになります。
List of roles Role name | Attributes | Member of -----------------+------------------------------------------------------------+------------------------------------------------------------- db_user_name | | {rds_iam} postgres | Create role, Create DB +| {rds_superuser} | Password valid until infinity |
次のクエリも使用できます。どのプラットフォームでも実行できます。
SELECT r.rolname, ARRAY(SELECT b.rolname FROM pg_catalog.pg_auth_members m JOIN pg_catalog.pg_roles b ON (m.roleid = b.oid) WHERE m.member = r.oid) memberof FROM pg_catalog.pg_roles r WHERE r.rolname !~ '^pg_' ORDER BY 1;
ユーザーを作成して rds_iam ロールを付与するには、次のコマンドを実行します。
CREATE USER db_user_name WITH LOGIN; GRANT rds_iam TO db_user_name;
接続文字列が正しくない
認証トークンは複数の文字で構成されているため、コマンドラインでは扱いにくい場合があります。代わりにトークンを環境変数に保存し、PostgreSQL DB インスタンスに接続するときにその変数を使用してください。
例:
export RDSHOST='aurorapostgresql.cluster-abcdef12ghi.us-east-1.rds.amazonaws.com' export PGPASSWORD="$(aws rds generate-db-auth-token --hostname $RDSHOST --port 5432 --region us-east-1 --username db_user_name)" psql "host=$RDSHOST port=5432 sslmode=verify-full sslrootcert=global-bundle.pem dbname=postgres user=db_user_name password=$PGPASSWORD"
環境変数を使用して PostgreSQL DB インスタンスに接続する方法の詳細については、「Aurora PostgreSQL クラスターに接続する」を参照してください。
この例のようなエラーが発生した場合、クライアントは SSL なしで DB インスタンスに接続しようとしています。
FATAL: no pg_hba.conf entry for host "host.ip", user "<username>", database "postgres", SSL off FATAL: password authentication failed for user "db_user_name"
IAM データベース認証では、SSL 接続を使用する必要があるため、RDS DB インスタンス間で送受信されるデータはすべて暗号化されます。このエラーを回避するには、接続に SSL が使用されていることを確認してください。sslmode オプションを verify-full として使用し、接続文字列の sslrootcert オプションに証明書を指定するのがベストプラクティスです。
最新の CA 証明書をダウンロードするには、「SSL/TLS を使用して DB クラスターへの接続を暗号化する」を参照してください。
IAM エンティティが正しくありません
認証トークンが正しい IAM ロールによって生成されていることを確認してください。現在の IAM ユーザーのロールを確認するには、次のコマンドを実行します。
aws sts get-caller-identity
引き受けたロールが正しくない場合は、正しい IAM ユーザー/ロールに切り替えるか、正しいロールを引き継ぐことができます。正しい IAM ロールを使用して認証トークンを生成していることを確認してください。
生成しても「PAM authentication failed for your user」(ユーザーの PAM 認証に失敗しました) に似たエラーが表示される場合は、AWS アカウントが AWS Organizations の組織の一部であるかどうかを確認します。アカウントが組織の一部である場合は、rds-db:* を組織の SCP に追加します。詳細については、「サービスコントロールポリシーの作成、更新、削除」を参照してください。
アカウントが組織の一部である場合は、rds-db アクセス許可を持たない IAM ユーザーまたはロールの階層があるかどうかを確認します。詳細については、「サービスコントロールポリシーを使用して、AWS Organization のアカウント間に許可ガードレールを設定する方法」を参照してください。
IAM エンティティの権限境界を使用している場合は、お使いの IAM ユーザー/ロールに rds-db: connect アクションが許可されていることを確認してください。アクセス許可境界に関する詳細については、「IAM エンティティのアクセス許可境界」を参照してください。ユーザーの権限境界を変更するには、「ユーザーのアクセス許可の境界の変更」を参照してください。
関連するコンテンツ
- 質問済み 2ヶ月前lg...
- 質問済み 2ヶ月前lg...