【入門編】Chef実務応用:カスタムResource(Custom Resources)の自作とDRYなコード設計 – インフラ構成管理(IaC)活用バイブル

こんにちは。クラウドインフラの深淵を覗き、日々「自動化の美学」を追求しているエンジニアです。

今日は、Chefを扱う上で「脱・初心者」を果たすための最大の関門であり、最強の武器である「Custom Resources(カスタムリソース)」について語ります。

「Chefの標準リソースだけでは、複雑な設定を書ききれない……」
「レシピの中に似たような`execute`や`template`の記述が散乱して、修正が怖い……」

そんな悩みを抱えたことはありませんか?その苦しみは、あなたがChefを正しく使いこなそうとしている証拠です。今日は、あなたのコードを圧倒的にDRY(Don’t Repeat Yourself)で、堅牢なものに変える極意を伝授しましょう。

—

1. なぜ標準リソースだけでは不十分なのか?

Chefの標準リソース(`package`や`file`など)は強力ですが、現場の要件はもっと複雑です。「特定のディレクトリを作成し、所有権を変更し、特定の環境変数を読み込ませてサービスを再起動する」といった一連のプロセスを、レシピ内で毎回書くのはアンチパターンです。

コードの肥大化は、障害の温床です。 変更が必要になった際、あちこちに散らばった記述を探して修正するのは、まさに悪夢でしょう。ここで登場するのが、自分専用のコマンドを作るような感覚で記述できる「Custom Resources」です。

—

2. Custom Resourcesの基本:ディレクトリ構成

ChefのCustom Resourceは、Cookbook内の `resources/` ディレクトリに定義します。

my_cookbook/
├── recipes/
│ └── default.rb # ここからリソースを呼び出す
└── resources/
└── app_config.rb # ここに自作リソースを定義する

まずはこれだけでOKです。では、実際に「設定ファイルを配置して権限を整える」という処理をカプセル化してみましょう。

—

3. 実践:再利用可能なCustom Resourceを作る

例えば、`app_config` というリソースを自作します。

resources/app_config.rb

リソースのプロパティを定義(入力値のバリデーションも可能)
property :path, String, name_property: true
property :owner, String, default: ‘root’
property :content, String, required: true

アクションの定義(デフォルトは :create)
action :create do
# 自作リソースの中で標準リソースを組み合わせる
directory ::File.dirname(new_resource.path) do
recursive true
end

file new_resource.path do
content new_resource.content
owner new_resource.owner
mode ‘0644’
action :create
end
end

recipes/default.rb(呼び出し側)

驚くほどシンプルになる
app_config ‘/etc/myapp/config.conf’ do
content ‘timeout=30’
owner ‘webuser’
end

これだけで、複雑なディレクトリ生成や権限設定が、わずか数行で記述可能になりました。これが「抽象化」の力です。

—

4. 保守性を高めるリファクタリングの極意

Custom Resourceを真にプロフェッショナルなものにするには、以下の3点を意識してください。

1. 冪等性(Idempotency)を死守する:
自作リソース内でも、必ずChefの標準リソース(`file`, `template`など)をラップしてください。Chefは標準リソースを使って「現在の状態」と「あるべき状態」を比較します。自前で `if File.exist?` などと書くのは禁じ手です。

2. デフォルト値の活用:
繰り返し使う設定(オーナー名やパーミッションなど)は、`property`の `default` 値として設計に組み込みます。これにより、呼び出し側の記述が極限まで削ぎ落とされます。

3. 「アクション」を粒度良く分割する:
例えば「設定作成」と「サービス再起動」は分けます。複雑なリソースであれば、`action :create` だけでなく `action :restart` も用意し、リソースの役割を明確に保ちましょう。

—

さあ、自動化の先へ

Custom Resourcesをマスターするということは、「インフラをコードで記述するための言語を自ら拡張する」ということです。

これを使いこなせば、あなたのCookbookは読みやすく、壊れにくく、そして何より「触るのが楽しい」ものになります。毎日の運用作業から「繰り返し作業」という名のストレスが消え去る瞬間を、ぜひ体感してください。

もし途中で詰まったら、Chefの `resource_collection` の動きを思い出してください。Chefは常に「どうあるべきか」を計算しています。その計算を助けてあげるのが、優秀なSREの仕事です。

あなたの自動化ライフが、より豊かで洗練されたものになりますように。応援しています!

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