【入門編】Chef Infra Clientの実行ログを構造化する!JSONフォーマット出力とfluentd/Logstash連携によるログ解析基盤の構築 – インフラ構成管理(IaC)活用バイブル

こんにちは。インフラの現場で「なぜChefが失敗したのか」をgrepコマンドと睨めっこしながら夜を明かした経験はありますか?

Chefは強力なツールですが、デフォルトのテキストログは人間が読む分には良くても、「大規模なインフラ環境で何が起きたか」を自動で追跡するにはあまりに非力です。

今回は、ChefのログをJSON形式で出力させ、それをログ解析基盤へ流し込むことで、「どのノードで、どのリソースが、なぜ失敗したか」を秒速で特定するための極限のプラクティスを伝授します。これさえ構築すれば、深夜の障害対応から解放され、運用の質が劇的に変わります。

—

1. なぜ「JSONログ」なのか?

Chefの標準ログは「テキストの塊」です。これをFluentdやLogstashで解析しようとすると、複雑な正規表現(Regexp)地獄に陥ります。一方、JSON形式ならキーバリューの構造が保たれるため、ElasticsearchやLokiでのフィルタリングが極めて容易になります。

「発生時刻」「ノード名」「リソース名」「アクション」「ステータス」が構造化されていること。これがSREの鉄則です。

—

2. Chef Infra ClientをJSON出力モードに設定する

Chefのログフォーマットは、`client.rb`の設定一つで変更可能です。以下の設定を各ノードの `/etc/chef/client.rb` に追記してください。

/etc/chef/client.rb

ログを標準出力ではなくJSONフォーマットで出力する設定
これにより、Fluentdなどがパースしやすい形式になります
log_format :json

ログレベルをinfo以上に設定(必要に応じてdebugへ)
log_level :info

ログの出力先をファイル指定(後述のFluentdがこれをtailします)
log_location “/var/log/chef/client.json”

設定後、`chef-client` を実行すると、`/var/log/chef/client.json` にJSONが追記されていくはずです。これが解析の「原石」です。

—

3. Fluentdによるログ収集パイプライン

次に、吐き出されたJSONを収集するFluentd(td-agent)の設定です。JSON形式であれば、`parser`セクションで `json` を指定するだけで、パースの手間がゼロになります。

/etc/td-agent/td-agent.conf@type tail
path /var/log/chef/client.json
pos_file /var/log/td-agent/chef.log.pos
tag chef.log @type json # ここで一発パース完了


@type elasticsearch
host localhost
port 9200
logstash_format true
logstash_prefix chef-client

—

4. 実践:異常検知クエリ(Grafana Loki / Elasticsearch)

データが溜まったら、次にやるべきは「異常検知」です。例えば、Loki (LogQL) を使って「失敗したリソース」を即座に抽出するクエリは以下の通りです。

異常検知クエリ(LogQL)

ログの中からstatusが”failed”のものだけを抽出
{job=”chef-client”} | json | status = “failed”

なぜこれが最強なのか?

Chefの冪等性を担保していても、依存パッケージの不整合などで失敗は必ず起きます。このクエリをGrafanaのアラートに設定しておけば、「Chefが失敗した瞬間にSlackへ通知が飛ぶ」環境が完成します。エラーログを追いかける時間は今日で終わりです。

—

5. 伝説のエンジニアからのアドバイス

初心者の皆さんが最初につまずくのは、「ログが多すぎて何が重要かわからない」という点です。

  • フィルターを活用せよ: すべてのログをElasticsearchに突っ込むとコストが爆発します。Fluentd側で `status == “updated”` や `status == “failed”` に絞り込んで転送するだけでも、ストレージコストと解析速度が劇的に改善します。
  • ノードのメタデータを付与せよ: `client.rb` で `ohai` の情報をログに含める設定をしておくと、どのリージョン、どのOS環境での失敗かまで一撃で特定できるようになります。

まとめ

ChefのログをJSON化し、パイプラインに乗せる。たったこれだけのことですが、これができるかできないかで、インフラエンジニアとしての「生存戦略」が変わります。

「Chefが何をしたか」を人間が解読する時代は終わりです。システムに語らせ、機械に分析させる。 このスマートな運用こそが、クラウド時代のSREの第一歩です。

まずは手元の検証用ノード一台から、JSONログを出力してみてください。そのJSONの美しさに、きっと感動するはずです。何か詰まったら、いつでも聞いてくださいね。応援しています!

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