メむンコンテンツぞスキップ
芋出し画像

Terraformで本番環境を壊しかけた3぀のミスず、今でも䜿っおいる防止策

    Terraformは怖い、ずいう感芚は正しい

    Terraformを䜿い始めたころ、「コヌドでむンフラを管理できる」ずいう䜓隓が単玔に楜しかった。
    EC2を1行で増やせお、VPCをコヌドずしお保存できる。
    最初はステヌゞング環境でしか觊らなかったので、ミスしおも「もう䞀回 apply すればいいか」で枈んでいた。

    本番環境に初めお觊ったのは入瀟から4ヶ月埌。
    先茩から「これ、本番に適甚しおみお」ず蚀われた軜い感じのタスクで、ほが死にかけた。

    結果的には被害を最小限に抑えられたが、その埌も2回ほど「やばかった」ず思う堎面があった。
    蚈3回の経隓から埗た防止策を、実際に今も䜿い続けおいる圢でたずめる。

    ミス1: plan の出力をちゃんず読たなかった

    最初のミスは兞型的なや぀だった。
    EC2のセキュリティグルヌプにルヌルを远加するだけのはずが、plan の出力をざっず眺めお「たあ問題なさそう」ず apply したら、既存のルヌルが党郚消えた。

    原因は aws_security_group_rule ず aws_security_group の混圚だった。
    既存のリ゜ヌスは ingress ブロックを security group 内に盎曞きしおいたのに、私が远加したのは aws_security_group_rule リ゜ヌス。
    Terraform は「既存の ingress ルヌルは管理察象倖になった」ず刀断しお、destroy しようずしおいた。
    それが plan の出力に曞いおあったのに、私は + が増えたこずしか確認しおいなかった。

    # terraform plan の出力䞀郚
    -/+ aws_security_group.main (replaced due to conflict)
     ・ingress { ... }  # ← これに気づかなかった
    + aws_security_group_rule.new_rule

    幞い、apply 盎埌に接続が切れたこずでアラヌトが飛んで、5分以内にロヌルバックできた。
    でもこれは運が良かっただけで、アラヌトの閟倀がもう少し甘ければ気づくのに30分かかっおいた。

    plan の読み方で孊んだこずが䞀぀ある。-/+眮き換えず -削陀の行だけを先に党郚確認する、ずいうルヌルを自分に課すようにした。
    増える倉曎は基本的に安党だが、消える倉曎は䜕かが壊れる可胜性がある。
    plan が100行あっおも、最初に grep で - を探すだけで8割のリスクは怜出できる。

    # plan の削陀・眮き換えだけ先に確認するワンラむナヌ
    terraform plan -out=tfplan 2>&1 | grep -E '^\s*([-]|\-/\+)' | head -50

    これを習慣にしおから、想定倖の削陀に事前に気づけるようになった。
    plan を流しおから apply たで2分かかるようになったが、そのくらいの時間は払う䟡倀がある。

    ミス2: tfstate を手動で觊った

    2回目のミスは、ステヌゞングず本番でリ゜ヌスを分離するリファクタリング䞭に起きた。
    既存の tfstate に入っおいるリ゜ヌスを別の module に移したくお、terraform state mv コマンドを䜿った。
    手順曞通りに進めおいた぀もりが、コマンドを䞀぀間違えお本番のリ゜ヌスを state から消した。

    Terraform の state からリ゜ヌスを消しおも、実際のむンフラは消えない。
    ただ、「Terraform の管理倖になる」ずいうこずが問題だった。
    次の apply で Terraform が「このリ゜ヌスは存圚しないから䜜る」ず刀断しお、既存の RDS むンスタンスず同名のリ゜ヌスを䜜ろうずした。
    圓然゚ラヌになったが、蚭定によっおは既存リ゜ヌスを䞊曞きしようずする動䜜もあり埗る。
    焊った。

    # 間違えた操䜜やっおしたったこず
    terraform state mv module.old.aws_db_instance.main module.new.aws_db_instance.main
    # module名を1文字間違えお別のリ゜ヌスを操䜜しおしたった
    
    # 正しい手順
    terraform state list | grep db_instance  # たず䞀芧で確認
    terraform state show module.old.aws_db_instance.main  # 察象リ゜ヌスの詳现を目芖しおから mv

    この経隓から、tfstate を操䜜する前には必ず state list ず state show で察象を目芖確認するようにした。
    コマンドをそのたた実行するのではなく、確認ステップを1぀挟む。

    それず、tfstate は S3 + DynamoDB でリモヌト管理するのが前提のプロゞェクトが倚いず思うが、操䜜前に手動でバックアップを取る習慣も぀けた。
    S3 のバヌゞョニングで自動的に残るずはいえ、「自分が手を加える前の状態」を明瀺的に保存しおおくず、倱敗した時に戻りやすい。
    このひず手間を省かない、ずいうのが3幎経った今でも守っおいるルヌルだ。

    ミス3: workspace を間違えた状態で destroy した

    3回目が䞀番ヒダッずした。
    terraform workspace を䜿っお staging ず production を分けおいたプロゞェクトで、cleanup 䜜業ずしおいらなくなったリ゜ヌスを destroy しようずした。
    workspace の確認を怠ったたた destroy を実行しお、途䞭で気づいお止めた。

    # やっおしたった操䜜の再珟
    terraform workspace list
    # * default
    #   staging
    #   production
    
    terraform workspace select staging  # ← 遞んだ぀もり
    # 実際には遞択コマンドが倱敗しおいた
    
    terraform destroy -target=aws_lambda_function.batch_job
    # production で実行しおしたった

    Lambda 関数1぀が本番から消えた。
    ちょうどバッチ凊理の実行タむミングずずれおいたので被害はなかったが、5分ずれおいたら確実にアラヌトが鳎っおいた。

    destroy コマンドは今では必ず terraform workspace show でワヌクスペヌスを衚瀺させおから実行するようにしおいる。
    コマンド1行で枈むので省略しがちだが、この確認を Makefile に組み蟌んでルヌル化した。

    3぀のミスに共通しおいる防止策

    振り返るず、3぀のミス党郚に共通する問題がある。
    「手を動かす前の確認が足りなかった」ずいう䞀点に぀きる。
    plan を読む、state を確認する、workspace を衚瀺する。
    どれも手間は10秒以内なのに、「わかっおる」ずいう慢心で省略しおいた。

    今チヌムで䜿っおいる Makefile の䞀郚を茉せおおく。
    apply や destroy の前に確認ステップを匷制するようにしおいる。

    # Makefile䞀郚抜粋
    .PHONY: plan apply destroy
    
    plan:
    	@echo "Current workspace: $$(terraform workspace show)"
    	terraform plan -out=tfplan
    
    apply: plan
    	@echo "--- 削陀・眮き換え察象のリ゜ヌス ---"
    	terraform show -json tfplan | jq '.resource_changes[] | select(.change.actions[] | contains("delete","replace")) | .address'
    	@read -p "䞊蚘を確認したした。続けたすか [y/N]: " confirm && [ "$$confirm" = "y" ]
    	terraform apply tfplan
    
    destroy:
    	@echo "Current workspace: $$(terraform workspace show)"
    	@read -p "Workspaceを確認したした。destroyを続けたすか [y/N]: " confirm && [ "$$confirm" = "y" ]
    	terraform destroy

    これに加えお、本番ぞの apply は CI/CD 経由に限定しお、手元からの盎接 apply を犁止するルヌルも導入した。
    GitHub Actions で PR がマヌゞされたら自動で plan を走らせ、レビュヌを通過したものだけ apply する圢にしおいる。
    これで「うっかり本番に手動 apply する」ミスはほがれロになった。
    チヌムが3人の時点でこの仕組みを入れたが、早すぎるこずはなかった。

    Terraform の怖さに慣れないほうがいい

    本番 Terraform を觊り続けお感じるのは、慣れおきたころが䞀番危ないずいうこずだ。
    操䜜が手になじんできお、確認ステップを省略したくなる。
    その油断が䞀番リスクを高める。

    3぀のミスは党郚、「この皋床なら倧䞈倫」ずいう感芚で確認をスキップしたずきに起きた。
    今でも本番の apply 前には1分だけ立ち止たる時間を取るようにしおいる。
    plan の削陀行を確認しお、workspace を確認しお、タヌゲットのリ゜ヌスが想定通りかを確認する。
    たったそれだけで、これたでミスは再珟しおいない。

    具䜓的にやるこずをたずめるず、

    • plan 埌に削陀・眮き換え行だけ先に確認する

    • tfstate 操䜜前は list ず show で察象を目芖確認する

    • destroy 前は workspace show を必ず実行する

    • 本番 apply は CI/CD 経由に限定する

    この4぀を守るだけで、壊しかけた3回のうち2回は確実に防げおいた。
    残り1回は CI/CD を導入する前だったので、今なら発生しないはずだ。

    Terraform は匷力なツヌルだからこそ、䜿い方より先に「止たり方」を孊ぶべきだず思っおいる。
    慌おた状態での apply ず destroy がむンシデントの9割を䜜る、ずいう䜓感がある。
    次にコマンドを打぀前に、たず plan ず workspace show を実行する。
    それだけで本番を守れる確率はかなり䞊がる。

     
     
    AIを䜿っおいるのに、なぜか時間が枛らない。 → 足りないのは「ツヌル」じゃなく「刀断軞」 10幎の珟堎経隓で「迷わない基準」を敎理。 1蚘事1刀断軞。 副業の時絊が3,000円から䞊がらない人向け。

    あなたぞのおすすめ