Amazon Aurora DSQL に接続すると「unable to accept connection, access denied」で接続できない場合のトラブルシュート

AWS

2024.12.11

Topics

この記事は NHN テコラス Advent Calendar 2024 の 11 日目の記事です。

概要

re:Invent 2024 で「Amazon Aurora DSQL」が新しく登場しました。
Introducing Amazon Aurora DSQL | AWS Database Blog

パブリックプレビューのため、早速触って見た方も多いのではないでしょうか。
私もその中の一人です。

ただ、実際に psql で Aurora DSQL に接続しようとすると以下のようにエラーが出て接続できません。

[cloudshell-user@ip-10-130-93-64 ~]$ PGSSLMODE=require \
> psql --dbname postgres \
> --username admin \
> --host wyabtvdc2i6mqs4opmldtti6iy.dsql.us-east-1.on.aws
Password for user admin:
psql: error: connection to server at "wyabtvdc2i6mqs4opmldtti6iy.dsql.us-east-1.on.aws" (52.21.87.57), port 5432 failed: FATAL:  unable to accept connection, access denied
DETAIL:  Session Id: yrsonox665bv4orxpgkina6pve

2 時間ぐらい時間を溶かしてトラブルシューティングしたのでその結果をまとめます。
同事象のエラーでも解決策が異なる可能性がありますので、参考程度にご覧ください。

結論

困っている人に向けて、先に結論を述べます。

認証トークンを生成する際に IAM ユーザー を利用していないから

そのため、解決策としては 、IAM ユーザーで認証トークンを生成してから接続を試みると接続できるかもしれません。
詳細な原因までは、調べきれてないですが、検証した限り AssumeRole からだと認証できず、IAM ユーザーからなら接続できました。

発生した事象

Aurora DSQL に接続できない事象が発生した環境の前提は以下のとおりです。

  • IAM Identity Center(以下、IdC) を使用し、AWS アカウントに接続している状態
  • CloudShell から Aurora DSQL へ接続を試みている

では、早速事象を再現してみます。

まずは、CloudShell 上で AssumeRole の認証情報を確認します。
sts の IAM ロールがアタッチされています。
※一部マスク

[cloudshell-user@ip-10-140-113-159 ~]$ aws sts get-caller-identity
{
    "UserId": "AXXXXXXXXXXT:XXXXX.XXXXX@nhn-techorus.com",
    "Account": "XXXXXXXXXXXX",
    "Arn": "arn:aws:sts::XXXXXXXXXXXX:assumed-role/AWSReservedSSO_AdministratorAccess_XXXXXXXXXXX/XXXXX.XXXXX@nhn-techorus.com"
}

この状態で、Aurora DSQL の認証トークンを生成します。
※結果は長いので一部抜粋

[cloudshell-user@ip-10-140-113-159 ~]$ aws dsql generate-db-connect-admin-auth-token --region us-east-1 --expires-in 3600 --hostname wyabtvdc2i6mqs4opmldtti6iy.dsql.us-east-1.on.aws
wyabtvdc2i6mqs4opmldtti6iy.dsql.us-east-1.on.aws/?Action=DbConnectAdmin&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=A

この認証トークンを使って Aurora DSQL に接続をします。
すると、以下のようにエラーとなり認証が失敗します。

[cloudshell-user@ip-10-130-93-64 ~]$ PGSSLMODE=require \
> psql --dbname postgres \
> --username admin \
> --host wyabtvdc2i6mqs4opmldtti6iy.dsql.us-east-1.on.aws
Password for user admin:
psql: error: connection to server at "wyabtvdc2i6mqs4opmldtti6iy.dsql.us-east-1.on.aws" (52.21.87.57), port 5432 failed: FATAL:  unable to accept connection, access denied
DETAIL:  Session Id: yrsonox665bv4orxpgkina6pve

なお、私が試した限りでは IdC の IAM ロールで認証している場合は、CloudShell 以外のコンソールやプログラムから実行しても認証失敗しました。

解決策

色々と調べて検証してみましたが、解決策は今のところ一つのようです。

  • IAM ユーザーで接続する

IAM ロールを作成しても接続ができそうでしたが、以下の理由から諦めました。

  • IdC の assumed-role を指定できなかった
  • DB 内部でも設定が必要なため、初回アクセス時には利用できなかった

IAM ロールを使用したデータベース ロールの使用 – Amazon Aurora DSQL

RDS の場合は認証時に DB ユーザーを指定することができるみたいですが、Aurora DSQL の認証トークン生成コマンドの「generate-db-connect-admin-auth-token」ではそういったオプションがないため出来ないと思われます。
Connect to an Amazon RDS or Amazon Aurora instance using a federated user with AWS IAM Identity Center and IAM database authentication | AWS Database Blog

IAM ユーザーで接続する

では、IAM ユーザーを使って接続をしてみます。
※認証トークンを生成する権限(IAM ロール/IAM ユーザー)のみを変更、その他は同一条件

同じ様に、IAM ユーザーの認証情報を確認します。

[cloudshell-user@ip-10-134-36-178 ~]$ aws sts get-caller-identity
{
    "UserId": "AIXXXXXXXXXXXX6Y5UZT",
    "Account": "XXXXXXXXXXXX",
    "Arn": "arn:aws:iam::XXXXXXXXXXXX:user/cold_airfow"
}

では、認証トークンを生成します。
※結果は長いので一部抜粋

[cloudshell-user@ip-10-134-36-178 ~]$ aws dsql generate-db-connect-admin-auth-token --region us-east-1 --hostname wyabtvdc2i6mqs4opmldtti6iy.dsql.us-east-1.on.aws
wyabtvdc2i6mqs4opmldtti6iy.dsql.us-east-1.on.aws/?Action=DbConnectAdmin&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Crede

では、Aurora DSQL に psql で接続します。
こちらは、問題なく繋がります。

[cloudshell-user@ip-10-134-36-178 ~]$ PGSSLMODE=require  psql --dbname postgres --username admin --host wyabtvdc2i6mqs4opmldtti6iy.dsql.us-east-1.on.aws
Password for user admin:
psql (15.8, server 16.5)
WARNING: psql major version 15, server major version 16.
         Some psql features might not work.
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_128_GCM_SHA256, compression: off)
Type "help" for help.

postgres=>

ちなみに、認証トークンを IAM ユーザーで生成すればいいみたいなので、以下でも接続可能でした。

  1. IAM ユーザーで認証トークンを生成する
  2. IdC の環境で IAM ユーザーで生成したトークンで認証を行う

先ほど生成した認証トークンを使って、AssumeRole で CloudShell 環境から接続します。

[cloudshell-user@ip-10-140-113-159 ~]$ aws sts get-caller-identity
{
    "UserId": "AXXXXXXXXXXT:XXXXX.XXXXX@nhn-techorus.com",
    "Account": "XXXXXXXXXXXX",
    "Arn": "arn:aws:sts::XXXXXXX:assumed-role/AWSReservedSSO_AdministratorAccess_XXXXXXXXXXX/XXXXX.XXXXX@nhn-techorus.com"
}
[cloudshell-user@ip-10-140-113-159 ~]$ PGSSLMODE=require  psql --dbname postgres --username admin --host wyabtvdc2i6mqs4opmldtti6iy.dsql.us-east-1.on.aws
Password for user admin:
psql (15.8, server 16.5)
WARNING: psql major version 15, server major version 16.
         Some psql features might not work.
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_128_GCM_SHA256, compression: off)
Type "help" for help.

postgres=>

接続できました。

まとめ

Keynote の発表を見てからパブリックプレビューを触ろうとして 2 時間ぐらい時間が溶けました。

クラスターを作り変えたり、AWS アカウントを変えてみたり、できる限りに案を試した結果、どれも同じ結果で SNS とかでも、同じ事象の人がいなかったので個人依存のエラーだなと判断しずっとドキュメントを眺めてました。
その時、「IAM ロールを使用したデータベース ロールの使用」という言葉がどうも引っかかったので、IAM ユーザーで試してみたら行けました。

これでやっと本題の Aurora DSQL を触ってみることができます。

参考情報

Aurora DSQL を使い始める – Amazon Aurora DSQL
Connect to an Amazon RDS or Amazon Aurora instance using a federated user with AWS IAM Identity Center and IAM database authentication | AWS Database Blog

テックブログ新着情報のほか、AWSやGoogle Cloudに関するお役立ち情報を配信中!

Cold-Airflow

2021年新卒入社。インフラエンジニアです。RDBが三度の飯より好きです。 主にデータベースやAWSのサーバレスについて書く予定です。あと寒いのは苦手です。

Recommends

こちらもおすすめ

Special Topics

注目記事はこちら