Amazon Aurora DSQL に接続すると「unable to accept connection, access denied」で接続できない場合のトラブルシュート
2024.12.11
この記事は 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 ユーザーで生成すればいいみたいなので、以下でも接続可能でした。
- IAM ユーザーで認証トークンを生成する
- 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に関するお役立ち情報を配信中!
Follow @twitter2021年新卒入社。インフラエンジニアです。RDBが三度の飯より好きです。 主にデータベースやAWSのサーバレスについて書く予定です。あと寒いのは苦手です。
Recommends
こちらもおすすめ
-
NHN テコラスの広報活動(2024年4月〜12月)
2024.12.15
-
2024年のセミナー登壇を具体的な Tips と共に振り返る
2024.12.25
Special Topics
注目記事はこちら
データ分析入門
これから始めるBigQuery基礎知識
2024.02.28
AWSの料金が 10 %割引になる!
『AWSの請求代行リセールサービス』
2024.07.16