🔓
RDSとのSSL通信をやめる
背景
開発環境で動かしていたアプリケーションをコンテナ化してECSに載せました。
GoLangで実装されたバックエンドはAPIとして動き、PostgreSQLのDBと通信します。
ですが、通信できないのです。セキュリティグループも5432/tcpは許可しているのに。
原因
RDSがSSLを要求している一方、アプリケーション側はSSL通信を無効にしているのが原因でした。
ログを見ると以下のようにno encryptionと出力されています。
[error] failed to initialize database, got error failed to connect to `user=***** database=*****`:
10.11.6.236:5432 (db.cbaimfixitb4.ap-northeast-1.rds.amazonaws.com):
server error: FATAL: no pg_hba.conf entry for host "10.11.3.213", user "*****", database "*****",
no encryption (SQLSTATE 28000)
panic: failed to connect database
GoLangのコードは以下の記述になっています。ポイントはsslmode=disableです。
"host=%s user=%s password=%s dbname=%s port=%s sslmode=disable TimeZone=Asia/Tokyo"
考えたこと
sslmodeのdisableをenableに変更するのが王道だと思います。
ただ、開発環境で用意しているDBはSSL設定をしていません。SSLを設定するのは手間です。なので、環境変数として扱って、開発環境はdisableに、ECSではenableにするのがいいかもと思いました。が、コードの変更は時間がかかりそうです。一方、アプリは急いでECSで動かしたいです。
先に進めることを優先して、一時的にRDSのSSLを無効にすることにしました。
対処方法
1. カスタムパラメータグループの作成
カスタムパラメータグループを作成し、rds.force_sslを「1(有効)」から「0(無効)」に変更します。
resource "aws_db_parameter_group" "postgres_custom" {
name = "yamada-custom-postgres-params"
family = "postgres16"
description = "Custom parameter group with rds.force_ssl disabled"
parameter {
name = "rds.force_ssl"
value = "0"
apply_method = "pending-reboot"
}
}
-
family: PostgreSQLのバージョンファミリーを指定(例: postgres16) -
rds.force_ssl: 0で無効、1で有効 -
apply_method:pending-rebootを指定すると、次回再起動時に反映
2. RDSインスタンスに適用
作成したカスタムパラメータグループをRDSインスタンスに適用します。
resource "aws_db_instance" "db" {
identifier = "${var.database_name}-db"
db_name = var.database_name
# 〜省略〜
parameter_group_name = aws_db_parameter_group.postgres_custom.name
}
3. 設定の確認
デフォルトパラメータグループ
デフォルトの定義ではrds.force_sslが1になっています。

カスタムパラメータグループ
作成したカスタムパラメータグループではrds.force_sslが0に変わっています。
カスタムパラメータグループはデフォルトがベースになっていて、明示的に変更したところだけが反映されます。

Discussion