Terraformモジュールを”作品設計”で考える:再利用性と世界観の作り方【2025年版】
最初は「コードを使い回すための箱」くらいの認識かもしれません。でも、実務でモジュールを使い倒すうちに、ある設計思想が芽生えてきます。それは、
Terraformモジュールは、単なる部品ではなく、明確な設計思想と再利用性を持つ”作品”である
ということです。
僕自身、最初は適当にコピペしてモジュールを作ってしまい、後のメンテナンスで地獄を見た経験があります。本記事では、僕の失敗談を交えながら、どうすれば「世界観が統一された、再利用性の高いモジュール」を設計できるか、具体的な考え方をお伝えします。
🎨 モジュール設計を「作品」として捉える3つの視点
Terraformモジュールの設計を「作品作り」として捉えると、グッと分かりやすくなります。
1 最小の世界観を定義する(単一責務の原則)
まず、モジュールが「何をするものか」を明確に定義します。これは、オブジェクト指向設計でいう「単一責務の原則(Single Responsibility Principle / SRP)」と同じ考え方です。
例えば、「VPCを作るモジュール」の中に、「EC2を作るロジック」や「RDSのセキュリティ設定」まで混ぜてしまうと、どうなるでしょうか?
- 作品として破綻:VPCだけを使いたい別プロジェクトが、EC2の不要な設定まで引きずり込む。
- 世界観が曖昧:「このモジュールは何の世界観(責務)なんだろう?」と読者を迷わせます。
⚠️ 失敗談
僕も過去、一つのモジュールにDB, Cache, Webのすべてを詰め込んで「オールインワン・インフラ」と名付けたことがありますが、結果的にパラメータが複雑すぎて誰も使えなくなりました。
🚀 学びの瞬間
責務は単一に。 VPCならVPC、S3バケットならS3バケット。独立した「最小の世界観」として作りましょう。
2 インターフェースを洗練させる(パラメータの厳選)
モジュールを使う側から見ると、variables.tf の定義が、モジュールへの「入口(インターフェース)」になります。このインターフェースがごちゃごちゃしていると、作品の使い勝手は最悪です。
- 使いやすい作品:
name,vpc_cidr,tagsなど、必要最小限かつ汎用的なパラメータで動く。 - 使いにくい作品: モジュール内部のニッチな設定(例:
enable_detailed_cloudwatch_metrics_for_nic_0など)まで外部に公開してしまう。
📘 デフォルト値の重要性
特に、default値は非常に重要です。モジュール利用者が何も指定しなくても、セキュアかつ実用的に動くデフォルト設定を持たせることで、利用のハードルが下がります。
3 変更不可のルールを設ける(意図的な制限)
モジュールは再利用性を高めるために、ある程度、設計者の「意図」を強制的に適用する必要があります。これは、アニメでいう「世界観のルール」のようなものです。
例えば:
- 必ず特定のタグ(
Project,Ownerなど)を付けることを義務付ける。 - 特定のセキュリティ設定(例:パブリックアクセスを強制的に
falseにする)を内部で固定する。
これにより、「このモジュールを使えば、うちの会社のセキュリティ基準は満たせる」という信頼が生まれます。
💬 実体験
僕は、セキュリティチームから「このモジュールでデプロイすればOK」というお墨付きをもらうために、あえて一部のvariableを削除し、固定値にしたことがあります。正直かなり勇気が要りましたが、結果的にミスが減り、デプロイが高速化しました。
⚠️ 注意点・失敗談:モジュールは「魔法の箱」ではない
最も陥った落とし穴
モジュール設計で、僕が最も陥った「落とし穴」は、「汎用性を求めすぎて、何もできない箱」になってしまうことです。
失敗談:パラメータ地獄
あらゆるプロジェクトの要望に応えようと、全てのパラメータをvariableとして外出しにしてしまった時期がありました。結果、variables.tfが100行を超え、モジュールを利用する側は「どのパラメータを設定すればいいんだ?」と途方に暮れることになりました。これでは、設計が抽象的すぎて、誰も使えない「作品」になってしまいます。
✅ 学びの整理
- 再利用性 ≠ 汎用性の最大化。再利用性は「ターゲットとする共通部分」に絞ったときに最大化します。
- 「変えてはいけないもの」は固定する。変える必要があるものだけを
variableとして公開しましょう。
📚 まとめ:モジュール設計の「思想」を磨こう
Terraformモジュールは、単なるコードのコピペ集ではありません。それは、あなたの設計思想が詰まった「作品」です。
3つの設計原則
- 単一責務で最小の世界観を定義する。
- 必要な情報だけを公開し、インターフェースを洗練させる。
- 会社のルールやベストプラクティスを内部で固定し、信頼性を高める。
モジュールを設計する際は、「次にこのモジュールを使う自分(または同僚)が、感動するくらい使いやすいか?」という視点を持ってみてください。きっと、より堅牢で美しいインフラが構築できるようになるはずです。

コメント