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

こんにちは。クラウドの深淵を覗き込み、インフラを「コード」という芸術に昇華させる旅へようこそ。

インフラエンジニアの仕事において、最も精神をすり減らすのは「手作業の不確実性」と「壊すことへの恐怖」ですよね。Chefで構成管理をしているのに、本番に投入するまで動くかどうかわからない……そんな博打のような運用は、今日で終わりにしましょう。

今回は、Terraformで土台(インフラ)を築き、Chefで魂(構成)を吹き込む。 この一連のプロセスを自動テストする「夢のパイプライン」を構築します。

—

なぜ「Kitchen-Terraform」なのか?

通常、Test Kitchenは仮想マシン(Vagrantなど)を立ち上げてテストしますが、Kitchen-Terraformを使うと、Terraformが管理する実際のクラウド環境(AWS, GCP, Azure)をプロビジョニングし、その上でChefを実行して検証できます。

  • 完全な再現性: ローカルのPCもCI(GitHub Actionsなど)も、全く同じコードでインフラを構築・検証できます。
  • 冪等性の証明: 「何度実行しても同じ結果になる」というChefの真髄を、自動テストで担保します。

—

1. 準備:魔法のツールを揃える

まずは、現場で戦うための武器を揃えましょう。以下のツールがインストールされている前提で話を進めます。

  • Chef Workstation: `chef`コマンドや`test-kitchen`が含まれています。
  • Terraform: インフラの設計図。
  • Ruby / Bundler: テスト環境の制御に使います。

`Gemfile`を作成し、プロジェクトのルートで以下の依存関係を記述してください。

Gemfile
source ‘https://rubygems.org’

gem ‘test-kitchen’
gem ‘kitchen-terraform’ # Terraformとの連携用ドライバ
gem ‘kitchen-inspec’ # 検証用フレームワーク

インストールは `bundle install` で一発です。

—

2. 核心:`kitchen.yml` の設計

ここが今回の心臓部です。Test Kitchenの設定ファイル `kitchen.yml` を以下のように記述します。

—
driver:
name: terraform
# Terraformのディレクトリを指定
variable_files:

  • terraform/terraform.tfvars

provisioner:
name: chef_solo
# 適用するレシピを指定
run_list:

  • recipe[my_cookbook::default]

verifier:
name: inspec
# 構築されたサーバーが意図通りか検証するテストコード
inspec_tests:

  • test/integration/default

platforms:

  • name: terraform

ポイント: `driver`を`terraform`にすることで、Test Kitchenは「VMを立てる」代わりに「Terraformを実行する」という動きに変わります。

—

3. HelloWorld的検証:InSpecで「正解」を定義する

インフラが正しく構築されたかどうかの答え合わせは、InSpecに任せます。例えば、「Webサーバー(Nginx)がインストールされ、起動していること」を検証するコードを書いてみましょう。

test/integration/default/default_spec.rb

Nginxがインストールされているか?
describe package(‘nginx’) do
it { should be_installed }
end

Nginxが起動してリクエストを受け付けているか?
describe port(80) do
it { should be_listening }
end

—

4. 実行:自動化の快感を味わう

準備ができたら、以下の魔法のコマンドを叩いてください。

kitchen test

このコマンド一つで、以下のドラマが自動的に進行します。
1. `terraform init` & `apply`:クラウド上にリソースを構築。
2. `chef-client`:構築されたサーバーにChefを適用。
3. `inspec`:定義したテストを実行し、正否を判定。
4. `terraform destroy`:テストが終われば綺麗にクリーンアップ。

もし途中で失敗すれば、その瞬間に何が原因か(Chefの記述ミスか、インフラの権限不足か)が明確になります。

—

5. トラブルシューティング:現場でハマるポイント

  • 「Terraformの状態が壊れた?」:

`kitchen-terraform`はディレクトリ内に`.kitchen/`という隠しフォルダを作ります。もし挙動がおかしい時は、一度 `kitchen destroy` して環境を更地にするのが一番の近道です。

  • 「冪等性が取れない!」:

`kitchen converge` を2回連続で実行してみてください。2回目にChefが何も変更を適用しなければ、あなたのレシピは完璧な冪等性を持っています。

—

最後に:エンジニアとしての心構え

インフラのテストを自動化するということは、「未来の自分を救う」という行為です。手作業で確認する時間を削り、その分を「どうすればもっと堅牢なインフラになるか」という設計の思考に充ててください。

最初は設定ファイルと格闘するかもしれませんが、一度このパイプラインを組んでしまえば、インフラ構築は「コマンド一つで安全に完了する作業」に変わります。

さあ、あなたのコードで、世界を自動化しましょう。何か詰まったら、いつでも戻ってきてくださいね。応援しています。

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