IAM 認証を使用して Amazon RDS for PostgreSQL または Aurora PostgreSQL クラスターに接続する際の問題のトラブルシューティングを行うにはどうすればよいですか。

所要時間2分
0

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 エンティティのアクセス許可境界」を参照してください。ユーザーの権限境界を変更するには、「ユーザーのアクセス許可の境界の変更」を参照してください。


AWS公式
AWS公式更新しました 2年前
コメントはありません

関連するコンテンツ