スキップしてコンテンツを表示

IAM 認証を使用して Amazon RDS for PostgreSQL インスタンスまたは Aurora PostgreSQL クラスターに接続する際に発生するエラーをトラブルシューティングする方法を教えてください。

所要時間2分
0

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 アクションを許可します。ユーザーのアクセス許可境界を変更する方法については、「ユーザーのアクセス許可境界を変更する方法」を照してください。

AWS公式更新しました 6ヶ月前
コメントはありません

関連するコンテンツ