Chef + Terraformで実現する「破壊的変更を恐れない」インフラ検証パイプライン
IaCの現場において、Terraformで箱(リソース)を作り、Chefで中身(構成)を詰める。この二刀流こそが、スケーラブルかつ堅牢なシステムを構築する最適解だ。しかし、多くの現場では「Chefの適用結果が意図通りか」を確認するために、わざわざインスタンスにログインして手動確認している。
それはエンジニアの仕事ではない。テストコードに語らせるべきだ。
今回は、`kitchen-terraform`を活用し、TerraformとChefをシームレスに統合した「検証パイプライン」の構築術を伝授する。
—
1. なぜ「Kitchen-Terraform」なのか?
`test-kitchen`はChefの標準ツールだが、デフォルトのプロビジョナーではクラウド上の既存VPCや複雑な依存関係を持つリソースの検証が困難だ。`kitchen-terraform`を挟むことで、「Terraformで環境を爆速構築し、その直後にChefで構成を流し込み、InSpecで検証する」という一連の流れが、単一のコマンド`kitchen test`に集約される。
究極の`.kitchen.yml`構成例
まず、現場の生産性を爆上げする構成例を見てほしい。
.kitchen.yml
driver:
name: terraform
root_module_directory: terraform/ # TFコードの場所
variable_files:
- terraform/vars/test.tfvars
provisioner:
name: chef_solo
# 冪等性を担保するため、複数回実行をデフォルトにする
multiple_converge: 2
verifier:
name: inspec
sudo: true
platforms:
- name: amazonlinux-2023
suites:
- name: web-server
provisioner:
attributes:
my_cookbook:
env: “test”
—
2. 現場で震えるほど役立つ「プロのテクニック」
① 開発スピードを最大化する隠れたショートカット
`kitchen test`は強力だが、遅い。開発中は以下のコマンドを使い分けろ。
- `kitchen converge`: Chefの適用のみ実行(既存環境を使い回す)。
- `kitchen verify`: テストのみ実行(コード修正後に即座に結果を確認)。
- `kitchen login`: インスタンスにSSHログイン。トラブル時はこれに尽きる。
② チーム開発で「環境のズレ」を消滅させる神設定
チームメンバー間で「俺のPCでは動く」という悲劇を避けるため、プロジェクトルートに `Gemfile` を配置し、バージョンを固定せよ。
Gemfile
source ‘https://rubygems.org’
gem ‘test-kitchen’
gem ‘kitchen-terraform’
gem ‘kitchen-inspec’
gem ‘chefstyle’ # コードスタイルを強制する
これを配置し、`bundle install` を強要する。これがプロの「暗黙の合意」だ。
③ インフラ検証の「神」プラグイン
VS Codeを使っているなら、以下の拡張は必須だ。
- Chef Extension for VS Code: インデント、シンタックスハイライト、リソース補完が必須。
- HashiCorp Terraform: 必須中の必須。
- Remote – SSH: Kitchenで立ち上げたコンテナやインスタンスに、VS Codeから直接接続してデバッグできる。これができれば、ログの読み取り効率が10倍になる。
—
3. トラブルシューティング:現場の泥沼を回避する設計思想
冪等性が崩れる原因は「状態の放置」にある
Chefのレシピが「初回は成功するが二回目で失敗する」場合、それは冪等性が担保されていない証拠だ。
- 回避策: `kitchen.yml`の`multiple_converge: 2`を絶対に入れろ。
- 極意: `file`リソースなどでディレクトリを管理する際は、`owner`や`mode`の指定を忘れるな。明示的な定義こそが、Chefを「構成管理ツール」たらしめる。
ネットワーク待機問題の解決
Terraformで構築直後のインスタンスに対してChefが接続しようとすると、SSHが立ち上がっておらず失敗することがある。
- プロの修正: `kitchen-terraform`の`wait_for_ssh`オプションを適切に調整せよ。
driver:
name: terraform
retry_on_ssh_errors: true
max_retries: 5
—
4. テックリードからの提言:パイプラインを「信頼の源泉」にせよ
このパイプラインを構築する目的は、単に自動化することではない。「破壊的変更を、恐怖なしに行える状態」を作ることだ。
もしあなたが、「Chefのレシピを修正して本番に適用するのが怖い」と感じているなら、それはテストが足りないのではなく、「本番と同一環境を、数分でゼロから再構築する仕組み」が欠如しているからだ。
今日からこの`kitchen-terraform`の環境を導入し、`kitchen test`がグリーン(成功)になることだけを信じてコードを書く文化をチームに根付かせてほしい。技術の力で、インフラ担当者の胃痛を消し去るのが、我々SREの使命だ。
さあ、ターミナルを開け。今日はコードを破壊し、再構築し、そして完璧なインフラを設計する日だ。