Amazon QuickSight で RDS for PostgreSQL 14 へ接続するデータセットを作成するとき、デフォルトパラメータだと接続出来ない問題に対処する

2023.05.15

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

いわさです。

QuickSight ではデータセット作成時に Amazon RDS リソースをデータソースに指定することが出来ます。

通信経路としてはパブリックアクセスを有効化した RDS の場合はインターネット通信経路で、プライベートサブネット内の RDS の場合は QuickSight の VPC 接続機能を使うことでプライベート通信経路で接続することが出来ます。
この時、設定によってうまく接続が出来ない経験をされた方も多いと思いますが、大抵の場合は次の記事のように QuickSight ENI あるいは RDS のセキュリティグループを見直すことで解決します。

しかし、今回それ以外で接続出来ないケースにぶつかりました。
事象と対処方法を紹介します。

「接続がタイムアウトしました。データソース ネットワーク設定 を確認してください」が発生

先日 QuickSight の VPC 接続機能が新しくなりました。

これをもう少し掘り下げ評価するために次のようなマルチ AZ を有効化した RDS に対して接続を行おうとしました。
DB エンジンは何でも良かったのですが、適当に PostgreSQL を選択し、バージョンは本日時点でデフォルトで選択される 14.6 を選択していました。

データベースも適当な内容で作成し、パラメータグループはデフォルトのものを使いました。

その後 QuickSight で VPC 接続を作成し、セキュリティグループの設定を行った後にデータセット作成画面から接続を行いました。 そうすると次のようにタイムアウトが発生してうまく接続が出来ません。

Security Hub に叱られる覚悟で、関連するセキュリティグループのインバウンドとアウトバウンドを全開放してみましたがそれでも接続が出来ません。
これはセキュリティグループのせいじゃないな...。

原因は QuickSight が使用している JDBC ドライバーが古いため

今回発生した問題と同じ事象が QuickSight コミュニティで投稿されており、それに対して「デフォルトの PostgreSQL 14 の構成だと QuickSight で動かないぜ」と回答されています。なんと。

回答者は QuickSight チームの方なので、ブラックボックスな内部仕様を把握している中の人からの準公式と考えて良いでしょう。

ざっくりいうと、PostgreSQL では複数のパスワード暗号化方式が用意されています。
RDS for PostgreSQL 13 までは、デフォルトは MD5 が使用されていましたが、PostgreSQL 14 からは SCRAM-SHA-256 がデフォルトになりました。
そして、SCRAM-SHA-256 の場合は、クライアントの JDBC ドライバーバージョンは 42.2 以上である必要があるとのこと。

現時点では QuickSight が使用する JDBC ドライバーのバージョンは 42.0 であるため、SCRAM-SHA-256 では QuickSight のデータセットは動作しないという回答のようです。なるほど。

確認してみたところ、RDS for PostgreSQL 14 のデフォルトパラメータグループは次のように未設定の状態で、この場合 SCRAM-SHA-256 で動作しています。

一方で RDS for PostgreSQL 13 のデフォルトパラメータグループは次のようにデフォルト値に MD5 が設定されていました。

試しに RDS for PostgreSQL 13 をデフォルト設定で構築した場合は問題なく QuickSight から接続が出来ます。

パラメータ変更後にパスワード再設定することで対処

上記に記載のあるように、より安全な SCRAM-SHA-256 を使うことが推奨されていますが、接続するクライアントライブラリが対応出来てから SCRAM-SHA-256 に変更する必要があります。
今回だと QuickSight 側が対応しておらず、そこは介入出来ないので QuickSight のドライバーがアップデートされるまでは MD5 を使うしかありません。

RDS for PostgreSQL 14 で動作させる場合はまず上記パラメータを変更する必要があります。
次のように MD5 を設定しました。

ただし、このままだとまだ QuickSight から接続が出来ませんでした。
これはユーザーのパスワードを暗号化する方式なので、必要なユーザーのパスワードを再設定(ALTER USER)することで変更後の暗号化方式で再設定されます。

[ec2-user@ip-172-31-7-209 ~]$ psql -h hoge0515psql2.cpnu9ipu74g4.ap-northeast-1.rds.amazonaws.com -U postgres -d hogedb
Password for user postgres: 
psql (15.0, server 14.6)
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, compression: off)
Type "help" for help.

hogedb=> show password_encryption;
 password_encryption 
---------------------
 md5
(1 row)

hogedb=> ALTER USER postgres WITH PASSWORD 'password';
ALTER ROLE

パスワードの再設定後、次のように QuickSight のデータセット接続画面から接続することが出来ました。

やったー。

さいごに

本日は Amazon QuickSight で RDS for PostgreSQL 14 へ接続するデータセットを作成するとき、デフォルトパラメータだと接続出来ない問題に対処しました。

新規で RDS を作成する際にはカスタムパラメータグループをアタッチして password_encryption を事前に MD5 に変更しておくことで、初期ユーザーでもそのまま QuickSight に接続することが出来ます。
エラーメッセージがタイムアウトでセキュリティグループの見直しばかりしていたのですが、データベースレイヤーが原因で QuickSight 上タイムアウトエラーが起きる場合もあるという一例として知っておいてください。