Upgrade to Pro — share decks privately, control downloads, hide ads and more …

tfstate を失った話 ― そういえば、tfstate どこだっけ

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
Avatar for 田邊正燿 田邊正燿
September 04, 2026
7

tfstate を失った話 ― そういえば、tfstate どこだっけ

エンジニア人生における最大の失敗LT

Avatar for 田邊正燿

田邊正燿

September 04, 2026

Transcript

  1. Profile たなべ まさてる 田邊 正燿 KDDIアイレット株式会社 セキュリティ事業部クラウド・イノベーション本部 Security Platform Engineeringセクション

    Forward Deployed Engineerグループ 経歴 2024年7月アイレット入社、今年4月からセキュリティ事業部に移動 クラウドセキュリティのプリセールス・導入支援を担当 温泉旅行が好き teru_engineer
  2. tfstate は、インフラの台帳 コード (.tf) あるべき姿を書く tfstate aws_instance.web = i-0a1b2c3d AWS

    リソース 実際に動いているもの この対応表が無いと、 Terraform は実物を認識できない。 台帳が消えても、実物は動き続ける。 5
  3. 始まりは SaaS導入のための terraform apply Terraform 公式モジュール tfstate 4種 CloudFormation StackSet

    7つ AWSアカウント 300 各アカウントに IAMロールと KMSキー、リージョンごとに EventBridge ルール 14〜15リージョンに展開。スタックインスタンスは大量 6
  4. 聞いたときには、もう消えていた Q.そういえば、 tfstate どこだっけ ? A.「CloudShell で terraform apply しました」

    CloudShell で apply 誰も見られない $HOME 120日経過で 自動削除 $HOME は private to you。通知も記録も残らない。 誰も、消えたことに気づいていなかった。 出典: AWS 公式 https://docs.aws.amazon.com/cloudshell/latest/userguide/limits.html 7
  5. 壊れてないのに、直せない リソースを作り直そうとして、plan を打った。 terraform plan Plan: 3 to add, 0

    to change, 0 to destroy. リソースを削除しようとして、destroy を打った。 terraform destroy Destroy complete! Resources: 0 destroyed. 「成功」と出るのに、実物は 1つも消えていない。 ※ 当時の画面ではなく、手元の検証環境で再現した出力 8
  6. 問いは「どう主導権を取り戻すか」だった A B C import で state を復旧 ツールで 一括生成

    全消しして 作り直す 選んだのは C。理由を1枚で説明します。 10
  7. 3案を、同じ物差しで並べた A import で state 復旧 工数 大 確実性 低

    B ツールで一括生成 工数 中 確実性 低 C 全消しして作り直す 工数 小 確実性 高 見たのは「復旧できるか」ではなく「復旧に見合うか」。 11
  8. 手動で消して回ったのは、 7つの StackSet だった Step1.消す Step2.戻す StackSet からスタックインスタンスを削除 更新した tf

    ファイルで terraform apply スタックインスタンスは大量。でも操作の単位は StackSet だった。 13
  9. 違いは、証跡があったかどうかだけだった tfstate CloudFormation 個人環境にあり、消えた AWS が状態を保持していた 0 destroyed StackSet 単位で撤去

    同じインフラなのに、証跡がある層だけが助けてくれた。 (まとめて消せる単位が無かったら、300アカウントを1つずつ…ゾッとする😱) 14
  10. やることは、証跡が残る場所に移すだけだった コードを Git 管理へ 必要なチームメンバーが見られる場所に置く state を個人環境から出す ローカルや CloudShell に置かない

    S3 バックエンドに置く バージョニングとロックを有効にする ただし本当は、作る前に決めておくべきでした。 15