
Terraform で Aurora PostgreSQL のポスト量子 TLS 鍵交換を設定できるか検証してみた
はじめに
クラウド事業本部、あきやまです。
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 でクラスタパラメータグループを作る
プロバイダ定義は次のとおりです。
terraform {
required_version = ">= 1.5.0"
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 6.0"
}
}
}
provider "aws" {
region = "ap-northeast-1"
}
最初は単一値 X25519MLKEM768 でパラメータグループを作りました。
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 に書けば反映できました。
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 で回せました。
クラスタ接続まで踏み込む人がいれば、クライアントの対応状況もあわせて教えてもらえると助かります。











