ForgeVision Engineer Blog

フォージビジョン エンジニア ブログ

これからTerraformerを目指す冒険者たちへ - IaCがChaosになる前に、現場で学んだ三大教訓

こんにちは、AWSグループの長友です。
(あだ名:アミーゴ ← 呼ばれてない)

先日、他ベンダーさんのイベントにご招待をいただきまして、名古屋で発表してきました。
味噌カツが美味しかったです。あと夜のイベントも...。
また行きたいです。

今日は当日お話しした内容から、Terraformを触る中で、現場で実際に踏んだ地雷 と、そこから得た学びをまとめます。

これからTerraformを始める冒険者の方のために

これからTerraformを始める冒険者の方のために、そして既にTerraformを触っている熟練冒険者の方は「あるある…」って頷いてもらえたらうれしいです。

先に結論:Terraform標準化・三大教訓

いきなり結論からいきます。私の学びはこの3つです!

  • ディレクトリは冷蔵庫: 整理しないと腐る(定期的に整理整頓)
  • モジュールはレンタカー感覚で: 使い回し前提でメンテコストを減らす
  • stateは命: 人の記憶に頼るな、適切な管理が全ての土台

……これだけ覚えて別の記事を読んでください
(ナガトモ・期末テストに出します)。

Terraformを書いたら動いた。だがそれは地獄の始まりだった...。

Terraformを触り始めたとき、だいたいこう思いません?

「とりあえず全部 main.tf に書けばいいよね」

最初は動くんです。planも通るしapplyも成功する。
「あ、理解した(してない)」の瞬間。

でも現実はこう。

「git diff が真っ赤。どこ修正したか分からん。誰が変更加えたんだ…?」
(※ 実は私)

インフラ管理は“動く”だけじゃ不十分なんですよね。
単一ファイル詰め込みは、最初は楽。でもチーム開発に入った瞬間に破綻します。

こんな↑悲劇映画の幕が上がる前に立ち止まって考えてみてください!

みんな違ってみんないい(のか?)——ディレクトリ統制が崩れる瞬間

Terraformって、ディレクトリ構成の自由度が高すぎます。
結果、チームが分かれるとこうなります。

各チームが独自のディレクトリ構成を採用した結果、知識の共有もメンテナンスも困難に

知識共有もメンテも困難に。

「みんなちがってみんないい」…じゃないんですよね、たぶん。

ディレクトリは冷蔵庫、整理しないと腐る

私の中で一番しっくり来た例えがこれ。

  • 整理された冷蔵庫: どこに何があるか一目瞭然/腐らない/料理が速い
  • ぐちゃぐちゃ冷蔵庫: 何があるか不明/気づいたら腐る/探してる間に心が折れる

Terraformも同じで、最初から仕切りを作る+定期リファクタが必要です。

規模に応じた分割戦略(仕切りを増やせばいいわけでもない)

小規模なら、シンプルでOK。過度な分割は逆効果です。
逆に大規模では、責任範囲が曖昧だとコンフリクト祭りが始まります。

ポイント

  • 小規模: 1段構成でOK。迷わないのが正義
  • 大規模: 棚ごとに分割して、責任範囲を明確に
  • 万能モジュールは闇鍋: 詰め込みすぎは地獄

次の地雷はモジュール設計

便利そうに見えて、やりがちな例をご紹介します。

これで何が起きるかというと、

  • 変更影響がデカすぎる
  • 再利用性が落ちる
  • テストが複雑
  • 見通しが悪い

でプロジェクトが破綻します。

単一責任の原則は、ほんと大事で「モジュールは小さく、目的を明確に」が正義です。

車を作るか、レンタカーを借りるか

内部モジュールとパブリックモジュールに関しては、車を当てはめるとシックリきます。

内部モジュール=マイカーは、カスタム性があり、自由ですが整備は自分でやらないといけません。これに対して、パブリックモジュール=レンタカーは、すぐ使えるけど、制約があります。

アプリケーション開発の場合も、全部自作すると、愛着は湧くけど手間も増えます。一方で、パブリックモジュールはうまく使うと運用が軽くなるので、可能なら活用がおすすめです。

ただし:パブリックモジュールは「選んで使え!」を強調したいです。

メンテされてないモジュール

メンテされてないモジュールは、普通に危ないです。

  • 最終更新が2年前
  • Issue放置
  • 古いTerraformバージョン前提

ブラインドインストールせずに、更新頻度/コミュニティ/ドキュメントは必ずチェックしましょう。

State管理は生命線

最後に、State 管理の話をします。キーワードは、

ローカルに置くな!Gitにコミットするな!

Terraformの state(terraform.tfstate)は、インフラの現状が詰まった命のファイルです。
しかもセンシティブな情報が入ることもあります。

適切に管理しないと、チーム全体の作業に大きな影響を与えます。

NGなStateの運用例

  • ローカル保存している
  • Gitにコミットしている
  • チームで共有されない

Stateは、S3や、コストをかけることができるなら、HCP Terraform(旧Terraform Cloud)を利用し、適切な権限管理をしましょう。

State分割戦略:「正解は“人が迷わない単位”】【環境別/サービス別/レイヤー別】

では、Stateはどこで分けるべきか? よくある分割はこの3つです。

  1. 環境別(dev/stg/prod): シンプルでオペミスが起きにくい
  2. サービス別: State肥大化を抑え、衝突しにくい
  3. レイヤー別: ネットワーク層/アプリ層などで責任分界点を明確に

ブログや記事を見ると「これが正解!」って流派が分かれますが、結局のところ現場の人が迷わない単位が正解だと思います。

まとめ: IaCは「コード」より「運用設計」が命

Terraformは Infrastructure as Code。でも Infrastructure as Teamwork にしないと壊れます。
ここまでをまとめます。

  • 環境分離: backend設定は必ず環境ごとに分ける
  • 追跡可能性: 「壊した本人が分からない環境」より怖いものはない
  • 自動化: CI/CD経由で安全性を確保する

最後にもう一度!三大教訓。

  • ディレクトリは冷蔵庫(腐らせない)
  • モジュールはレンタカー感覚(メンテコスト減)
  • stateは命(人の記憶に頼らない)

このキーワードを踏まえて、Terraformを IaF(Infrastructure as Fun) に!

ここまで読んでいただきありがとうございました!