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
fallback

調査すると、以下の記事にあるようにPostgresqlの15から強制的にSSLを使用するようになったみたいです。

RDSのPostgre15からSSL通信がデフォルトでONになって接続エラーが発生した件

3. SSL通信したくて、試したこと

ツールの接続設定で、「SSLを使用する」設定をONにしました。しかし、以下のメッセージです。

The other side has sent a failure alert: [40]
fallback

エラーコード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でも手動再起動が必要
  }
}
fallback

既存のデータベース定義に入れます。

resource "aws_db_instance" "db" {

  〜省略〜

  db_name                 = var.database_name

 〜省略〜

  parameter_group_name    = aws_db_parameter_group.this.name  適用する

}
terraform