【実務・中級編】Terraformのdepends_onアンチパターン:なぜ依存関係の明示はコードの保守性を下げるのか – インフラ構成管理(IaC)活用バイブル

Terraformの`depends_on`は「逃げ」である。依存関係の深淵から脱却するアーキテクチャ設計論

Terraformを触り始めて数年、「どうしてもリソースが作成順序を守ってくれない」という壁にぶつかり、思考停止で`depends_on`を書き殴った経験はないだろうか。

はっきり言おう。`depends_on`の多用は、Terraformコードに対する「敗北宣言」だ。

グラフ理論に基づき、リソース間の依存関係を暗黙的に解決するTerraformの美しいアーキテクチャを破壊し、保守性を劇的に下げる。今回は、この「アンチパターン」の正体を暴き、真にスケーラブルなコードを書くための作法を伝授する。

—

1. なぜ`depends_on`が「害悪」なのか

Terraformの実行計画(Plan)は、リソース間の参照関係(`id`や`arn`などのプロパティ参照)を解析し、DAG(有向非巡回グラフ)を構築することで並列実行の最大効率を追求する。

ここに`depends_on`を差し込むとどうなるか:
1. 並列処理の阻害: 本来は独立して作成可能なリソースまで直列化され、デプロイ時間が線形に増加する。
2. スパゲッティ依存の誘発: 「Aが壊れたらBも作り直し」という連鎖がブラックボックス化し、`terraform destroy`が予測不可能な挙動を示す。
3. リファクタリングの拒絶: モジュール化しようとした瞬間、ハードコードされた依存関係が邪魔をして、コードの移動や再利用が不可能になる。

2. 「暗黙の依存」を活かす正しい設計アプローチ

依存関係を明示する必要がある場合、それは「参照すべき値が足りていない」というサインだ。

悪い例:無理やり順番を固定する

resource “aws_iam_role” “app_role” { … }

resource “aws_instance” “app_server” {
# 意味のないdepends_onで順序を強制している
depends_on = [aws_iam_role.app_role]
iam_instance_profile = aws_iam_instance_profile.app_role.name
}

良い例:属性参照でグラフを構築する

IAMプロファイルの`name`を直接参照することで、Terraformは「インスタンス作成にはプロファイルの完了が必須」と自動的に理解する。`depends_on`は1行も不要だ。

resource “aws_iam_instance_profile” “app_profile” {
role = aws_iam_role.app_role.name
}

resource “aws_instance” “app_server” {
# 属性参照により、暗黙的に依存関係が解決される
iam_instance_profile = aws_iam_instance_profile.app_profile.name
}

—

3. 開発速度を劇的に高める「プロの道具箱」

ツールに踊らされるのではなく、ツールを掌で転がす。これがSREの鉄則だ。

VS Code神プラグイン

  • Terraform (HashiCorp公式): 言わずもがな。
  • TFLint: `depends_on`の乱用や、クラウド特有の非推奨設定をCI前に検知する「守護神」。
  • Error Lens: エラー箇所を行末に表示。修正までのコンテキストスイッチをゼロにする。

開発を爆速にするキーボードショートカット (VS Code)

  • `Ctrl + P` (Quick Open): ファイル間を瞬時に移動。
  • `Alt + Shift + F`: Terraformの自動整形(`terraform fmt`を保存時に自動実行する設定が必須)。
  • `Ctrl + B` (サイドバー開閉): 画面を広く使い、コードに集中する。

チーム開発における「絶対設定」

`.vscode/settings.json`をリポジトリルートに置き、チーム全員の環境を統一せよ。これが「環境差異によるバグ」を消す最短ルートだ。

{
“editor.formatOnSave”: true,
“terraform.languageServer”: {
“enabled”: true,
“args”: [“serve”]
},
“editor.codeActionsOnSave”: {
“source.fixAll.terraform”: “explicit”
}
}

—

4. リファクタリングの作法:依存の鎖を断ち切る

もし現行コードに`depends_on`が溢れているなら、以下の手順でリファクタリングせよ。

1. データソース化: 依存先リソースを`data`ブロックとして参照できないか検討する。
2. Outputの活用: モジュール境界を跨ぐ場合は、必ず`output`で必要な属性を渡し、呼び出し元でそれを参照する形に書き換える。
3. `terraform graph`で可視化: `terraform graph | dot -Tpng > graph.png`で現状の依存ツリーを出力せよ。スパゲッティになっている箇所は一目でわかる。

—

最後に:コードは「インフラの設計書」である

`depends_on`は、料理で言えば「材料が届くのを待つ」のではなく「店員に『待て』と命令する」ようなものだ。材料(参照)さえあれば、自動的に調理(作成)は始まる。

Terraformの真価は、宣言的な記述によって「あるべき状態」を定義することにある。手続き的な順序付けに頼るのではなく、リソース同士の論理的な結びつきをコードに落とし込むこと。それこそが、エンジニアとしての格を上げる唯一の道だ。

さあ、今すぐ`depends_on`を検索し、削除する作業から始めよう。そこから、君たちのインフラは真の自律性を手に入れるはずだ。

タイトルとURLをコピーしました