🔓

RDSとのSSL通信をやめる

に公開
2026/07/24

背景

開発環境で動かしていたアプリケーションをコンテナ化してECSに載せました。

Goで実装されたバックエンドはAPIとして動作し、PostgreSQLのDBと通信します。

しかし、通信できません。セキュリティグループではTCPポート5432を許可しています。

原因

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

Goのコードは以下の記述になっています。ポイントは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に変わっています。

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

GitHubで編集を提案

Discussion