はじめに
Google Cloud の Cloud SQL がサポートしている PostgreSQL 12 以前のメジャーバージョンが 2025 年 5 月 1 日以降拡張サポートに変わり,追加料金が発生してしまうため,担当プロダクトの PostgreSQL バージョンアップをする必要がありました.バージョンアップ自体は Terraform 経由で行う手順となっていましたが,(自分の)想定外の挙動により開発環境のデータを DB インスタンスごと消してしまった話を共有します.
何をしたのか
元々 Terraform で管理されていた担当プロダクトの Cloud SQL は以下のように定義されていました.
resource "google_sql_database_instance" "main" {
name = "cloudsql_instance_POSTGRES11"
database_version = "POSTGRES11"
...
}
このリソースを以下のように更新しました.
resource "google_sql_database_instance" "main" {
name = "cloudsql_instance" # 名前も合わせて変更
database_version = "POSTGRES15" # PostgreSQL15 に更新
# インプレースバージョンアップするため削除保護を無効化する
deletion_protection = false
deletion_protection_enabled = false
...
}
上記の変更を適用した後,中身が空っぽなデータベースだけが残ってしまいました...
terraform plan には書いてあった
この時の terraform plan は以下のようになっていました.適用前にも確認はしていましたが,IP が変わりそうで接続情報を更新しないと,ぐらいにしか認識できていませんでした.
# google_sql_database_instance.main must be replaced
-/+ resource "google_sql_database_instance" "main" {
~ name = "cloudsql_instance_POSTGRES11" -> "cloudsql_instance" # forces replacement
~ database_version = "POSTGRES_11" -> "POSTGRES_15"
~ private_ip_address = "192.168.xxx.xxx" -> (known after apply)
...
}
terraform plan コマンドの実行結果は以下の表にあるような表示が用いられます.
操作 | サマリ表記 | Change Result 記号 |
---|---|---|
追加 | Create |
+ |
削除 | Delete |
- |
置換 | Replace |
-/+ |
更新 | Update |
~ |
今回適応されていた「置換」の操作は,削除したのちに追加する挙動になっています.つまり,データが入っているインスタンスを削除した後に,新しくインスタンスを作成したため,データがないデータベースが残りました.また,今回想定していたインプレースバージョンアップの場合,「更新」操作が適応されるはずで,同じインスタンスを保ちながら PostgreSQL のバージョンを上げてもらえるものでした.
今後への対策
今回データを消してしまった環境は幸いにも開発環境でしたが,今後同じようなことが起こらないように対策を考えました.予防策の一つとしてまず,自分と同じ境遇の人に向けた terraform plan の読み方を含めた Terraform で気をつけるべき点を記載したドキュメントを作成し,エンジニア全体に周知をしました.
また後日発覚したのが,インプレースアップデートに削除保護を無効化する(リソースの更新時に追記していた deletion_protection = false
と deletion_protection_enabled = false
)必要がなかったことです.インスタンスを削除する必要がない限り,削除保護を有効のままにしておけるのも予防策となりました.
最後に,2025 年 2 月リリースの final backup 及び,2025 年 3 月リリースの retained backup から,Cloud SQL インスタンスに紐づかないバックアップを作成することができるため,最悪事後に復元の手段が取れそうです.
当時,Cloud SQL インスタンスを削除してしまうと,そのリソースに紐づいているバックアップも削除されてしまいました.削除されたインスタンスのバックアップは Google Cloud で 4 日間保持しているので,それまでに Google Cloud カスタマーケアにお問い合わせする方法しかありませんでした.
まとめ
Terraform 操作の失敗から大きな学びを得られました.データベース周りは気をつけましょう!