こんにちは。クラウドの荒波を乗りこなすSREの世界へようこそ。
Chefは「古臭い」なんて言う人もいますが、それは表面しか見ていない証拠です。Chefは「インフラをコードで定義する」という概念の先駆者であり、その冪等性(べきとうせい:何度実行しても同じ結果になること)を担保する設計思想は、現代のTerraformやAnsibleの根幹を支えています。
今日は、AWS環境でChefを運用する際、「なぜかChefサーバーの負荷が高い」「EC2の起動が遅い」「無駄なポーリングでコストが溶けている」といった悩みを解決し、インフラを「正しく」動かすための極意を伝授します。
—
1. Chefの本質:なぜ「ポーリング」を止める必要があるのか?
Chefの基本動作は「Client-Serverモデル」です。ノードが定期的にChefサーバーに問い合わせ(ポーリング)を行い、設定を取得します。しかし、デフォルトの30分間隔で数千台のノードが一斉にアクセスすれば、Chefサーバーはパンクし、AWSのデータ転送コストも馬鹿になりません。
極限の最適化戦略:
1. Pull型からEvent型への意識転換: 定期実行を極限まで減らす。
2. ブートストラップの高速化: インスタンス起動時のオーバーヘッドを排除する。
3. ライフサイクルとの統合: ASG(Auto Scaling Group)削除時のクリーンアップを徹底する。
—
2. インストールと最も重要な基礎セットアップ
まずは、Chef Workstationを導入し、あなたのPCを「インフラを操る司令塔」にします。
1. [Chef Downloads](https://downloads.chef.io/) から `Chef Workstation` をインストール。
2. ターミナルで `chef –version` を打ち、準備完了を確認してください。
最も重要なセットアップ:`knife.rb`の最適化
`knife`はChefサーバーへの窓口です。ここで接続設定を最適化します。
~/.chef/knife.rb
通信のタイムアウトを短くし、無駄なリトライを防ぐ
knife[:hints] = { “ec2” => {} } # AWS環境であることを明示し、メタデータを賢く取得
chef_server_url “https://your-chef-server/organizations/your-org”
ログレベルをinfoに抑え、I/Oを節約
log_level :info
—
3. Hello World:インフラを定義する「レシピ」の作成
Chefの最小単位は「レシピ」です。ここでは「Nginxを入れる」というシンプルな処理を、冪等性を担保して記述します。
cookbooks/my_web/recipes/default.rb
パッケージが存在するか確認し、なければインストールする(冪等性の担保)
package ‘nginx’ do
action :install
end
設定ファイルが更新された時だけサービスを再起動する(リソースの無駄を排除)
template ‘/etc/nginx/nginx.conf’ do
source ‘nginx.conf.erb’
notifies :restart, ‘service[nginx]’, :delayed
end
service ‘nginx’ do
action [:enable, :start]
end
このコードは、何度実行しても「Nginxが正しい状態であること」を保証します。これがChefの美学です。
—
4. AWSコスト最適化:スマートなスケジューリング術
ここからが現場の知見です。
A. 不要なポーリングの削減
デフォルトの `chef-client` がバックグラウンドで動き続けるのはリソースの無駄です。ASGで起動した直後の一回だけ実行し、その後はサービスを停止するのが最強のコスト削減術です。
`user-data` スクリプトでの工夫:
EC2起動時に一度だけChefを実行
chef-client –once
完了したらサービスを停止し、不要な通信を止める
systemctl stop chef-client
B. ASGライフサイクルとの統合
インスタンスがスケールイン(削除)される際、Chefサーバーに古いノード情報が残り続けると、ライセンスコストや管理負荷に繋がります。これを自動化しましょう。
削除フック(LifeCycle Hook)の活用:
ASGが終了シグナルを出した際、以下のコマンドを走らせます。
サーバーから自身を削除(Clean up)
knife node delete
knife client delete
これをAWS Lambdaと組み合わせれば、自動的にChefサーバーが整理整頓されます。
—
5. 最後に:インフラエンジニアとしての心得
Chefでインフラを構築することは、単なる「自動化」ではありません。「システムの状態を常に定義された通りに保つ」という責任をコードに委ねることです。
- 冪等性を信じろ: コードは何度実行しても安全であるべきです。
- 無駄を削れ: 通信回数、メモリ消費、起動時間。その1秒の短縮が、1年後には数百万のコスト削減になります。
最初は難しく感じるかもしれませんが、この「コードで世界を定義する感覚」を掴めば、あなたはもう手作業の奴隷ではありません。インフラを支配する側の人間です。
さあ、まずは小さなレシピから書き始めてみましょう。何か詰まったら、いつでも戻ってきてください。現場の知見は、いつでもここにありますよ。