【入門編】TerraformにおけるJSON/YAMLファイルからのデータ駆動型インフラ構築:templatefileとyamldecodeの極意 – インフラ構成管理(IaC)活用バイブル

インフラエンジニアの皆さん、こんにちは。

IaC(Infrastructure as Code)の旅路において、誰もが一度は「同じような環境を何個も作らなきゃいけない」「微妙にパラメータが違うだけのコードが大量に増えて管理不能になった」という壁にぶつかります。

今日は、その泥沼から脱出し、「データとロジックを完全に分離する」という、プロフェッショナルが辿り着く極意を伝授します。Terraformにおける`templatefile`と`yamldecode`を使いこなし、インフラを「プログラム」として昇華させる手法です。

—

なぜ「外部ファイル化」が必要なのか?

初心者のうちは、`main.tf`の中に直接リソースの値を書き込みがちです。しかし、本番・検証・開発と環境が増えるたびに、そのコードはスパゲッティ化し、修正ミスによる障害のリスクが高まります。

「設定はYAML(データ)に、構築ロジックはHCL(コード)に」。この分離こそが、冪等性(何度実行しても同じ結果になること)を担保し、運用を劇的に楽にするための黄金律です。

—

1. 準備:この手法の「型」を作る

まずは、プロジェクトのディレクトリ構成を整理しましょう。これが美しいインフラの第一歩です。

.
├── environments/
│ └── dev.yaml # 環境ごとのパラメータ
├── modules/
│ └── instance/ # リソース定義
├── main.tf # terraformのメインロジック
└── variables.tf

設定ファイル(`environments/dev.yaml`)

YAMLは人間が読みやすく、かつ構造化に適しています。

インスタンスの構成パラメータ
instance:
name: “app-server-dev”
instance_type: “t3.micro”
tags:
Environment: “dev”
ManagedBy: “Terraform”

—

2. 魔法の関数:`yamldecode` でデータを読み込む

Terraformには、外部ファイルを読み込んでデータ構造として扱う関数が備わっています。`file()`関数でファイルを読み込み、それを `yamldecode()` に渡すだけで、HCLが扱えるオブジェクトに変換されます。

`main.tf` の記述例

1. YAMLファイルを読み込み、データとしてパースする
locals {
config = yamldecode(file(“${path.module}/environments/dev.yaml”))
}

2. パースされたデータを使ってリソースを定義する
resource “aws_instance” “web” {
ami = “ami-0c55b159cbfafe1f0” # 実際は適宜変更してください
instance_type = local.config.instance.instance_type

tags = local.config.instance.tags
}

これで、環境を増やしたいときは`dev.yaml`をコピーして`prod.yaml`を作るだけ。`main.tf`自体に手を入れる必要はありません。これが「データ駆動型」の真骨頂です。

—

3. さらに深淵へ:`templatefile` でテンプレートを動的に

もし、UserDataや複雑な設定ファイル(Apacheのconfなど)を動的に生成したい場合は `templatefile` の出番です。

`scripts/init.sh.tftpl` (テンプレートファイル)

!/bin/bash
echo “Hello, ${name}!”
echo “Environment is set to ${env}”

`main.tf` での呼び出し

resource “aws_instance” “web” {
# … 省略 …
user_data = templatefile(“${path.module}/scripts/init.sh.tftpl”, {
name = local.config.instance.name
env = local.config.instance.tags.Environment
})
}

この手法を使えば、「実行時に動的に値を埋め込む」という高度なカスタマイズが、非常にクリーンな形で行えます。

—

4. 精度を高めるための「HelloWorld」動作確認

いきなり巨大なインフラを構築するのではなく、まずは `terraform plan` で出力結果を確認する癖をつけてください。

1. 初期化: `terraform init`
2. プラン確認: `terraform plan`

もし設定したYAMLの値が正しく読み込まれていれば、プランの出力画面に意図した `instance_type` や `tags` が表示されるはずです。この「プラン結果が自分の意図と完全に一致する」という感覚こそが、SREとして最も安心できる瞬間なのです。

—

最後に:プロフェッショナルへの道

今回紹介した `yamldecode` と `templatefile` を組み合わせる手法をマスターすれば、あなたのインフラコードは以下のように変わります。

  • 属人性の排除: 誰が書いても同じ作法で構築できる。
  • 変更の容易性: 設定ファイルの修正だけで、インフラのパラメータを変更できる。
  • テストの容易性: インフラの差分をYAMLの差分として可視化できる。

「毎回同じコードを書く」のは今日で終わりにしましょう。コードは賢く再利用し、あなたはもっとクリエイティブな設計に時間を使ってください。

インフラの世界は奥深いですが、一つずつ「道具」を使いこなしていけば、必ず自由になれます。応援していますよ。何かあればまた聞いてくださいね。

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