Terraform state file removed by S3 Lifecycle
こんにちわ。最近キャンプばっかり行っているのでブログ更新が滞っています。あかん!
さて、このブログが動いているサーバはterraformでインフラの管理をしています。
terraformのstateファイルの管理はS3バックエンドを使っています。
また、S3の設定でバージョニングとライフサイクルの設定をしていました。
この設定が原因でtfstateファイルが消えてしまったので記録しておきます…。
起きたこと
terraform plan
を実行したら全てのリソースがcreateされる差分が出てしまいました。
急いでS3のバケットを見たところ、なんと空になっていました…。泣きながら削除済みオブジェクトを表示してみたところ、以下のように削除マーカーが設置されていました。削除マーカー以前のバージョンのtfstateファイルも見れる状態でした。
とりあえずtfstateファイルが見れる状態ではあったので落ち着きを取り戻しました…。
原因
前述の通り、S3のライフサイクルの設定で「最新バージョンのオブジェクトを90日後に失効させる」ようにしていたのが原因です。
つまり、「90日間tfstateに更新がない場合は削除マーカーがつけられてしまう」状態でした。
よく見るとちょうど最終更新日から3ヶ月後に削除マーカーが打たれていますね。
ということは今まで90日に一回以上はtfstateを更新していたのか…。
復旧方法
幸いなことにバージョニング下のオブジェクトの完全削除は「最新バージョンのオブジェクトに削除マーカーが打たれてから1年後」としていたのでオブジェクトの完全削除は免れました。
- 完全削除は削除マーカーのつけられた最新バージョンのオブジェクトに対しては行われない?のかな?ちょっと理解が曖昧
以下のようにバージョニングされたtfstateの最新版(削除マーカーを除く)をダウンロードし、再度バケットにアップロードすることで解決しました。
ライフサイクルの設定は削除しました。
ライフサイクルについて
バージョニングが有効なオブジェクトに対するライフサイクルの効果について、以下のドキュメントにまとめられていました。
でも実際にやってみないといまいち実感がわかない感じですね…。
感想
バージョニング超大事…!
こういうミスや復旧も含めて自分で管理しているサーバであれば勉強になるので良いですね(ポジティブ)。プロダクトのサーバでやってしまったらSEPPUKUですね…。
バージョニングされたS3のオブジェクトに対するライフサイクルの挙動については、別途まとめてみようと思います。