Terraform で Aurora PostgreSQL のポスト量子 TLS 鍵交換を設定できるか検証してみた

Terraform で Aurora PostgreSQL のポスト量子 TLS 鍵交換を設定できるか検証してみた

Aurora PostgreSQL 18 でポスト量子 TLS が利用可能になりました。クラスタパラメータ `ssl_groups` の設定方法を Terraform で試しましたので、その結果をお伝えします。
2026.10.31

はじめに

クラウド事業本部、あきやまです。

2026年10月29日に、Aurora PostgreSQL Compatible Edition でポスト量子 TLS(PQ-TLS)鍵交換が使えるようになった、という What's New が出ました。
対象は Aurora PostgreSQL 18 以降で、クラスタパラメータ ssl_groups に許可リスト内の暗号グループを指定します。

PQ 用のハイブリッドグループとして、X25519MLKEM768 と SecP256r1MLKEM768 が並んでいます。
専用の Terraform リソースがあるわけではないので、既存の aws_rds_cluster_parameter_group で書けるのかを自分のアカウントで試しました。

環境

項目 値
OS macOS 26.7.2
Terraform v1.14.6
AWS Provider hashicorp/aws v6.71.0
AWS CLI v2.32.32
リージョン ap-northeast-1
エンジン Aurora PostgreSQL 18(family: aurora-postgresql18)
検証範囲 クラスタパラメータグループの作成と反映確認

今回つくったのはクラスタパラメータグループだけです。
Aurora クラスタ本体は起動していません。

結論

Terraform から設定できます。
新しいプロバイダ属性は不要で、既存の aws_rds_cluster_parameter_group に ssl_groups を書けば足ります。

確認項目 結果
Terraform でパラメータグループ作成 できた
ssl_groups = X25519MLKEM768 反映された
複数値(カンマ区切り) 反映された
複数値(コロン区切り) API が拒否した
許可リスト外の値 API が拒否した
パラメータの置き場所 クラスタパラメータグループ(インスタンス側には無い)

PQ 用のハイブリッドグループは X25519MLKEM768 と SecP256r1MLKEM768 です。
公式ドキュメントどおり、ML-KEM を使うなら ssl_min_protocol_version = TLSv1.3 もセットします。

やってみた

Step 1: パラメータの存在確認

まず CLI で、デフォルトのクラスタパラメータグループに ssl_groups があるか見ました。

aws rds describe-db-cluster-parameters \
  --db-cluster-parameter-group-name default.aurora-postgresql18 \
  --query "Parameters[?ParameterName=='ssl_groups' || ParameterName=='ssl_min_protocol_version' || ParameterName=='rds.force_ssl']" \
  --region ap-northeast-1

要点だけ抜き出すと、次のとおりでした。

ParameterName デフォルト AllowedValues ApplyType
ssl_groups prime256v1:X25519 X25519MLKEM768, SecP256r1MLKEM768, prime256v1, X25519, secp384r1 dynamic
ssl_min_protocol_version TLSv1.2 TLSv1.2, TLSv1.3 dynamic
rds.force_ssl 1(PG17 以降) 0,1 dynamic

エンジンバージョンも確認しました。
18.3 / 18.4 / 18.6 は、いずれも family が aurora-postgresql18 でした。

aws rds describe-db-engine-versions \
  --engine aurora-postgresql \
  --query "DBEngineVersions[?starts_with(EngineVersion, '18')].[EngineVersion,DBParameterGroupFamily]" \
  --output table \
  --region ap-northeast-1

インスタンスパラメータグループ default.aurora-postgresql18 には ssl_groups はありませんでした。
クラスタ側で持つパラメータです。

Step 2: Terraform でクラスタパラメータグループを作る

プロバイダ定義は次のとおりです。

versions.tf
terraform {
  required_version = ">= 1.5.0"

  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 6.0"
    }
  }
}

provider "aws" {
  region = "ap-northeast-1"
}

最初は単一値 X25519MLKEM768 でパラメータグループを作りました。

main.tf
resource "aws_rds_cluster_parameter_group" "pq_tls" {
  name        = "aurora-pg18-pq-tls-lab"
  family      = "aurora-postgresql18"
  description = "Lab: post-quantum TLS key exchange via ssl_groups"

  # PQ ハイブリッド鍵交換
  parameter {
    name         = "ssl_groups"
    value        = "X25519MLKEM768"
    apply_method = "immediate"
  }

  # ML-KEM は TLS 1.3 必須
  parameter {
    name         = "ssl_min_protocol_version"
    value        = "TLSv1.3"
    apply_method = "immediate"
  }

  # 名前付きグループ以外の鍵交換を避けるため SSL を強制
  parameter {
    name         = "rds.force_ssl"
    value        = "1"
    apply_method = "immediate"
  }

  tags = {
    Purpose = "pq-tls-lab"
    Managed = "terraform"
  }
}

family は Aurora PostgreSQL 18 向けの aurora-postgresql18 です。
apply_method は immediate にしました。
ssl_groups の ApplyType は dynamic なので、再起動待ちにはしていません。

terraform init
terraform apply

1 秒ほどで作成が終わりました。

Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

Outputs:

parameter_group_arn = "arn:aws:rds:ap-northeast-1:**********:cluster-pg:aurora-pg18-pq-tls-lab"
parameter_group_name = "aurora-pg18-pq-tls-lab"

Step 3: 反映値の確認

aws rds describe-db-cluster-parameters \
  --db-cluster-parameter-group-name aurora-pg18-pq-tls-lab \
  --source user \
  --region ap-northeast-1 \
  --output table

Terraform で書いた値が、user 由来で入っていました。

ParameterName ParameterValue Source
ssl_groups X25519MLKEM768 user
ssl_min_protocol_version TLSv1.3 user

単一値 X25519MLKEM768 の反映は問題ありませんでした。

Step 4: 複数値と通らない指定を試す

次に、許可リスト外の値を投げました。

aws rds modify-db-cluster-parameter-group \
  --db-cluster-parameter-group-name aurora-pg18-pq-tls-lab \
  --parameters "ParameterName=ssl_groups,ParameterValue=invalid-group,ApplyMethod=immediate" \
  --region ap-northeast-1
InvalidParameterValue: Invalid parameter value: invalid-group for: ssl_groups
allowed values are: X25519MLKEM768, SecP256r1MLKEM768, prime256v1, X25519, secp384r1

ドキュメント上のデフォルトは prime256v1:X25519 で、区切りはコロンです。
カスタム値を同じコロン区切りで送ると、こちらも拒否されました。

InvalidParameterValue: Invalid parameter value: X25519MLKEM768:X25519 for: ssl_groups
allowed values are: X25519MLKEM768, SecP256r1MLKEM768, prime256v1, X25519, secp384r1

一方、カンマ区切りは通ります。

aws rds modify-db-cluster-parameter-group \
  --db-cluster-parameter-group-name aurora-pg18-pq-tls-lab \
  --cli-input-json '{
    "Parameters": [{
      "ParameterName": "ssl_groups",
      "ParameterValue": "X25519MLKEM768,SecP256r1MLKEM768",
      "ApplyMethod": "immediate"
    }]
  }' \
  --region ap-northeast-1

Terraform でも同じカンマ区切り文字列を value に書けば反映できました。

main.tf
  parameter {
    name         = "ssl_groups"
    value        = "X25519MLKEM768,SecP256r1MLKEM768"
    apply_method = "immediate"
  }
terraform apply

反映後の値です。

ParameterName ParameterValue
ssl_groups X25519MLKEM768,SecP256r1MLKEM768
ssl_min_protocol_version TLSv1.3

複数グループを並べるときは、PostgreSQL のコロン表記ではなく、RDS API 側のカンマ区切りを使う、と覚えておくとハマりにくいです。

Step 5: クラスタへの紐づけ方

既存の Aurora クラスタへ載せるときは、db_cluster_parameter_group_name を指せば足ります。
※ 今回はパラメータグループ単体までの検証です。クラスタ起動まではしていません。

resource "aws_rds_cluster" "example" {
  # ...
  engine                          = "aurora-postgresql"
  engine_version                  = "18.6"
  db_cluster_parameter_group_name = aws_rds_cluster_parameter_group.pq_tls.name
}

注意点・制約

分かったこと

  • PQ-TLS 用の Terraform 専用リソースは無い。普通のクラスタパラメータグループで足りる
  • ssl_groups はクラスタパラメータ。DB パラメータグループ側には無い
  • ApplyType は dynamic。パラメータグループ単体の作成と更新は再起動なしで通った
  • カスタム値の複数指定はカンマ区切り。コロン区切りは拒否される
  • ML-KEM を使うなら ssl_min_protocol_version = TLSv1.3 をセットする

まだやっていないこと

  • Aurora クラスタへパラメータグループを紐づけて、SHOW ssl_groups; を見る
  • ML-KEM 対応クライアントから実際に握手し、選ばれたグループを確認する

クライアント側も PQ 対応が必要です。
サーバだけ X25519MLKEM768 にしても、クライアントが対応していなければ別グループか接続失敗になります。
公式ドキュメントでは、リスト先頭がサーバ優先で、双方が対応する最初のグループが使われる、とあります。

まとめ

  • Aurora PostgreSQL 18 の PQ-TLS は、クラスタパラメータ ssl_groups で有効化する
  • Terraform では aws_rds_cluster_parameter_group の parameter ブロックで設定できた
  • X25519MLKEM768 の単一指定も、X25519MLKEM768,SecP256r1MLKEM768 の複数指定も反映できた
  • あわせて ssl_min_protocol_version = TLSv1.3 を入れる
  • 複数値はカンマ区切り。コロン区切りは使えない

パラメータグループの作成までは、特別なプロバイダ対応を待たずに Terraform で回せました。
クラスタ接続まで踏み込む人がいれば、クライアントの対応状況もあわせて教えてもらえると助かります。

参考

この記事をシェアする

関連記事