1. 背景
RDSにPostgresqlを使用しています。
バージョン12を使用していましたが、サポート終了となり利用料金が上がります。そのため、バージョンを16に変更しました。
検証環境のバージョンを16にあげて、2週間動かしていました。で、特に問題がなかったので、本番環境もバージョンをあげました。
そしたら、データベースをメンテするのに使用しているA5:SQL Mk-2で接続できないという申告がありました。このツールはWindows用のツールです。このツールを動かすためにEC2にWindowsServer2022を入れて動かしていました。
2. 事象をもう少し詳しく
接続しようとすると、以下のメッセージが出ます。no encryption
とあるので、TLS/SSL関連とあたりをつけます。
no pg_hba.conf entry for host “10.12.1.38”, user “xxxuser”, database “dbname”, no encryption
調査すると、以下の記事にあるようにPostgresqlの15から強制的にSSLを使用するようになったみたいです。
RDSのPostgre15からSSL通信がデフォルトでONになって接続エラーが発生した件
3. SSL通信したくて、試したこと
ツールの接続設定で、「SSLを使用する」設定をONにしました。しかし、以下のメッセージです。
The other side has sent a failure alert: [40]
エラーコード40はハンドシェイク中のエラーなので、以下を考えました。
- CA証明書が入ってない
- 暗号スイートの不一致
- TLSバージョンの不一致
というわけで、CA証明書等を以下からダウンロードして、インポートしました。
SSL/TLS を使用した DB インスタンスまたはクラスターへの接続の暗号化 - Amazon Relational Database Service
が、NG。。。
暗号スイートやTLSバージョンの不一致はツール問題だと思い、TLSは諦めました。。。。←悔しい。
4. 対応
強制SSLをやめて、ツールはそのまま暗号化しないで通信するようにしました。Linuxだと問題なく通信できるんですけどね。。。
対応の流れは以下です。
4.1. DBインスタンスパラメータグループ作成
これに「rds.force_ssl」に「0(無効)」を設定します。
4.2. DBインスタンスに適用
上で作成したDBインスタンスパラメータグループをDBインスタンスに適用する。
4.3. DB再起動
適用したDBインスタンスパラメータグループを有効にするため、DBを手動で再起動する。
ちなみに、この再起動を自分でやることがわからず、30分ぐらい溶かしました。
RDSの設定欄には作成した「DBインスタンスパラメータグループ」があるので、適用されていると思い込んでました。しかし、再起動して初めて有効になるのでした。
5. terraformのコード
以下のようにDBインスタンスパラメータグループを作成します。
resource "aws_db_parameter_group" "this" {
name = "${var.env}-ars-no-ssl-parameter"
family = "postgres16"
description = "Custom parameter group with rds.force_ssl disabled"
parameter {
name = "rds.force_ssl"
value = "0"
apply_method = "immediate" # immediateでも手動再起動が必要
}
}
既存のデータベース定義に入れます。
resource "aws_db_instance" "db" {
〜省略〜
db_name = var.database_name
〜省略〜
parameter_group_name = aws_db_parameter_group.this.name ← 適用する
}