背景
Sprint 1 で構築した RDS 2 インスタンス(tasks: infra/modules/rds/main.tf / Keycloak: infra/shared/modules/keycloak_db/main.tf)はいずれも parameter_group_name 未指定で、デフォルト parameter group(default.mysql8.4)が適用されている。
問題
- time_zone = UTC(ADR-0009 JST 全層統一の前提崩れ)
- コーディング規約 §12.1 は「RDS のパラメータグループで
time_zone = Asia/Tokyo を設定し、JVM・CI・DB 全てが Asia/Tokyo に揃っていることを前提とする」と明記。
- JDBC URL は
connectionTimeZone=SERVER&forceConnectionTimeZoneToSession=true でサーバ TZ をそのまま採用する設計のため、dev では UTC セッションになる。
api/openapi.yaml は「『今日』はサーバ側 Asia/Tokyo で確定」「tenants.created_at は DB に JST で保存される前提」と記述しており、日付判定・保存値がズレる。
- ローカル(
docker-compose.local.yml)は --default-time-zone=Asia/Tokyo 設定済みのため、ローカルと dev で挙動が乖離する(ローカルで通って dev で日付ズレ)。
- collation 規約不一致(実害小)
- MySQL 8.4 のサーバデフォルトは
utf8mb4 / utf8mb4_0900_ai_ci。設計規約は全テーブル utf8mb4_unicode_ci 統一を規定。Flyway DDL はテーブル単位で明示済みのため実害は限定的だが、DB レベルデフォルト・暗黙作成テーブル・一時テーブルが規約とズレる。
対応内容
受入条件
- 両 RDS でセッションの実効
time_zone が Asia/Tokyo(SELECT NOW() が JST を返す)
@@character_set_server = utf8mb4 / @@collation_server = utf8mb4_unicode_ci
- apply 済みで
terraform plan が no-change
注意
- parameter group 付け替えはインスタンス再起動が必要(dev / db.t4g.micro / single-AZ のため影響軽微)。
time_zone 自体は dynamic parameter だが、PG の付け替え反映には reboot を要する。
time_zone は新規セッションから有効。既存コネクションプールには効かないため、アプリ側 ECS Task の再起動(またはプール再接続)も合わせて行う。
- Keycloak は時刻を epoch millis 中心で保持するため timezone 影響は小さいが、運用一貫性(ADR-0009)のため同一設定とする。
関連
背景
Sprint 1 で構築した RDS 2 インスタンス(tasks:
infra/modules/rds/main.tf/ Keycloak:infra/shared/modules/keycloak_db/main.tf)はいずれもparameter_group_name未指定で、デフォルト parameter group(default.mysql8.4)が適用されている。問題
time_zone = Asia/Tokyoを設定し、JVM・CI・DB 全てが Asia/Tokyo に揃っていることを前提とする」と明記。connectionTimeZone=SERVER&forceConnectionTimeZoneToSession=trueでサーバ TZ をそのまま採用する設計のため、dev では UTC セッションになる。api/openapi.yamlは「『今日』はサーバ側 Asia/Tokyo で確定」「tenants.created_atは DB に JST で保存される前提」と記述しており、日付判定・保存値がズレる。docker-compose.local.yml)は--default-time-zone=Asia/Tokyo設定済みのため、ローカルと dev で挙動が乖離する(ローカルで通って dev で日付ズレ)。utf8mb4/utf8mb4_0900_ai_ci。設計規約は全テーブルutf8mb4_unicode_ci統一を規定。Flyway DDL はテーブル単位で明示済みのため実害は限定的だが、DB レベルデフォルト・暗黙作成テーブル・一時テーブルが規約とズレる。対応内容
infra/modules/rds:aws_db_parameter_group(familymysql8.4)を追加し、aws_db_instance.mainにparameter_group_nameを設定time_zone = Asia/Tokyocharacter_set_server = utf8mb4collation_server = utf8mb4_unicode_ciinfra/shared/modules/keycloak_db: 同内容の parameter group を追加(命名はplatform-${var.env}-系、ADR-0004 §D 準拠)SELECT @@time_zone, @@character_set_server, @@collation_server;受入条件
time_zoneがAsia/Tokyo(SELECT NOW()が JST を返す)@@character_set_server = utf8mb4/@@collation_server = utf8mb4_unicode_citerraform planが no-change注意
time_zone自体は dynamic parameter だが、PG の付け替え反映には reboot を要する。time_zoneは新規セッションから有効。既存コネクションプールには効かないため、アプリ側 ECS Task の再起動(またはプール再接続)も合わせて行う。関連
connectionTimeZone=SERVER反映済 — 本 Issue はその DB 側前提の充足)