【実務・中級編】Chef Cookbooksのテスト自動化:Kitchen-TerraformとTest Kitchenを連携させたインフラ検証パイプラインの構築 – インフラ構成管理(IaC)活用バイブル

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の使命だ。

さあ、ターミナルを開け。今日はコードを破壊し、再構築し、そして完璧なインフラを設計する日だ。

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