AWS Identity Access Management (IAM) 認証を使用して Amazon Relational Database Service (Amazon RDS) for PostgreSQL インスタンスまたは Amazon Aurora PostgreSQL 互換エディションクラスターに接続する際、エラーが発生します。
簡単な説明
次の条件に当てはまる場合、「PAM authentication failed for user」というエラーメッセージが表示される場合があります。
- IAM 認証が無効である
- IAM ポリシーに rds-db:connection アクションが含まれていない
- rds_iam ロールがデータベースユーザーに関連付けられていない
- 接続が誤っている
- 正しい IAM ロールを使用していない
解決策
注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI で発生したエラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。
IAM 認証が無効である
デフォルトでは、IAM 認証は無効になっています。Amazon RDS for PostgreSQL インスタンスまたは Aurora PostgreSQL 互換クラスターで、IAM 認証を有効にします。
IAM ポリシーに rds-db:connect アクションが含まれていない
IAM データベース認証を使用して DB インスタンスに接続するには、ポリシーを rds-db:connect アクションを含めて更新します。
ポリシー例を次に示します。
{ "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"
]
}
]
}
注: ポリシーに正しいリソース ID と Amazon リソースネーム (ARN) を使用していることを確認してください。
Amazon RDS コンソールで DB インスタンスまたはクラスターを選択して [設定] タブを選択し、DB インスタンスのリソース ID を特定します。詳細については、「IAM データベースアクセス用の IAM ポリシーを作成、使用する」を参照してください。
注: IAM 認証は、ポリシーステートメントの条件要素において、サービス固有のコンテキストキー、グローバル条件コンテキストキーをサポートしていません。
rds_iam ロールがデータベースユーザーに関連付けられていない
PostgreSQL で IAM 認証を使用するには、データベースユーザーが rds_iam ロールを引き受ける必要があります。このロールがユーザーに関連付けられていることを確認するには、PostgreSQL クライアントで次のコマンドを実行します。
\du
想定される出力を次に示します。
List of rolesRole 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
) AS 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;
接続が誤っている
認証トークンには、コマンドラインでは使いにくい文字がいくつか含まれています。そのまま入力するのではなく、認証トークンを環境変数に保存し、Aurora PostgreSQL クラスターへの接続時に、その環境変数を使用します。
環境変数を使用した認証トークンの生成例を次に示します。
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"
クライアントが SSL/TLS 接続を行わずに DB インスタンスに接続しようとすると、次のエラーが表示されます。
"FATAL: "host.ip" に対する pg_hba.conf エントリがありません。ユーザー "<username>"、データベース "postgres"、SSL 無効。FATAL: "db_user_name" に対するパスワード認証に失敗しました"
DB インスタンスとの間で送受信されるデータはすべて暗号化されるため、IAM データベースの認証には SSL/TLS 接続が必要です。上記のエラーを回避するには、SSL/TLS 接続を使用していることを確認してください。sslmode オプションに verify-full を使用し、接続文字列の sslrootcert オプションで証明書を指定することをおすすめします。
最新の認証機関 (CA) 証明書のダウンロードについては、「SSL/TLS を使用して DB クラスターへの接続を暗号化する」を参照してください。
正しい IAM ロールを使用していない
認証トークンの生成に誤った IAM ロールを使用している場合、エラーメッセージが表示される場合があります。現在の IAM ユーザーが引き受けているロールを確認するには、get-caller-identity コマンドを実行します。
aws sts get-caller-identity
引き受けているロールが誤っている場合は、IAM ユーザーから正しい IAM ロールに切り替えるか、正しいロールを引き受けます。エラーメッセージが解消されない場合は、その AWS アカウントが AWS Organizations 組織に属しているかどうかを確認してください。アカウントが組織に属している場合は、rds-db: を許可するサービスコントロールポリシーを作成します。詳細については、「SCP のアクセス許可に対する効果」を参照してください。
rds-db アクセス許可のない IAM ユーザーの階層の有無についても確認してください。詳細については、「サービスコントロールポリシーを使用して AWS Organization の複数アカウントにわたり、アクセス許可ガードレールを設定する方法」を参照してください。
IAM エンティティのアクセス許可境界を使用する場合は、IAM ユーザーまたはロールに rds-db:connect アクションを許可します。ユーザーのアクセス許可境界を変更する方法については、「ユーザーのアクセス許可境界を変更する方法」を照してください。