こんにちは。インフラの深淵を覗き込み、自動化の果てにたどり着いたSREの先輩です。
Chefと聞くと「古い」と感じる人がいるかもしれません。しかし、大規模なクラウドインフラにおいて、「宣言的な構成管理」と「強力なRBAC(ロールベースアクセス制御)」を単一のインフラ基盤で完結させるという点で、Chef Infra Serverは今なお最強の選択肢の一つです。
今日は、単なる「設定ツール」としてのChefを卒業し、「マルチテナント・インフラ」を支配するためのアーキテクチャ設計術を伝授します。
—
1. なぜ「Organizations」がインフラの境界線なのか
Chef Infra Serverにおける `Organization` は、単なる名前空間ではありません。「信頼の境界線(Security Boundary)」です。
複数のプロジェクトやチームを一つのChef Serverで管理する場合、彼らを一つの箱に詰め込んではいけません。Organizationsを活用することで、以下のことが可能になります。
- データ分離: クックブック、ノード、ロール、環境設定を完全に独立。
- 権限分離: 「Aチームは開発環境のノードのみ操作可能」といった制御。
- 可視性: チームごとの運用負荷を明確に分離。
2. インフラ設計の極意:RBACの階層構造
Chefのアクセス制御は、「誰が(User)」「どの組織で(Organization)」「何を(Objects)」できるかを定義するパズルです。
ベストプラクティス:権限最小化の原則
初心者が陥りがちな罠が、全てのユーザーに `admin` 権限を与えることです。これをやると、一人のミスが全組織を破壊します。
- Administrators: 組織内の全権限を持つ。CI/CDパイプラインのサービスアカウントなどが該当。
- Clients: ノード自身。`nodes` と `clients` オブジェクトに対してのみ読み書き権限を与える。
- Users: 開発者は `cookbooks` をアップロードできるが、`nodes` の削除権限は持たない、といった粒度でグループ(Groups)を作成します。
—
3. 【実践】Chef Infra ServerのセットアップとHelloWorld
まずは土台作りです。Chef Infra Serverを構築し、最初の組織を作成する手順を最小構成で示します。
ステップ1:サーバーの構築
Chef Serverのインストールはシンプルですが、DNSが命です。ホスト名が解決できないと、鍵の検証で全滅します。
Chef Infra Serverのパッケージをインストール(CentOS/RHEL想定)
rpm -ivh chef-server-core-
chef-server-ctl reconfigure
ステップ2:組織の作成とクライアントの生成
ここが「マルチテナント」の入り口です。
組織を作成(短縮名と完全名を指定)
chef-server-ctl org-create my_project “My Project Team” –filename my_project-validator.pem
クライアント(ノード)を追加するためのユーザーを作成
chef-server-ctl user-create dev_user “Dev” “User” “dev@example.com” ‘password123’ –filename dev_user.pem
ステップ3:動作確認(HelloWorldとしてのノード登録)
ChefにおけるHelloWorldは「ノードがServerにチェックインし、設定を適用すること」です。
1. Workstation(手元のPC)で `knife.rb` を設定。
2. `knife client list` を叩いて組織の中身が見えるか確認。
3. ノード側で `chef-client` を実行。
現場で震えるヒント:
ノードの鍵認証には `validator.pem` を使い回すのではなく、ノードごとに個別のクライアント鍵を発行する設計にしてください。`validator.pem` は「一度きりの認証用」と割り切り、ノードが初回登録した直後に削除するのがセキュリティの鉄則です。
—
4. 現場で差がつく!鍵ローテーションの自動化
Chefの運用で最も恐ろしいのは、「クライアント鍵の紛失」や「漏洩」です。これを防ぐために、鍵のローテーションを自動化しましょう。
例えば、以下のようなRubyスクリプトをCI/CDや定期実行ジョブに仕込みます。
Chef APIを使って特定のクライアントの鍵を再生成するサンプル
require ‘chef’
権限のあるクライアントとしてAPIを叩く
rest = Chef::REST.new(‘https://chef-server.local/organizations/my_org’)
鍵をローテーションし、新しい秘密鍵を取得
new_key = rest.post(‘clients/web-node-01/keys’, { ‘name’ => ‘default’, ‘create_private_key’ => true })
新しい鍵を安全な場所(Vaultなど)へ保存
File.write(‘/etc/chef/client.pem’, new_key[‘private_key’])
—
先輩からのアドバイス:自動化の先にあるもの
Chefを導入する最大のメリットは、サーバーの状態を「コード」という言葉で定義し、誰がいつ変更したかを追跡できることです。
マルチテナント運用において最も重要なのは、「ツールを使いこなすこと」ではなく、「誰が何をして良いかを、Chefのポリシーとしてコードに落とし込むこと」です。これができれば、インフラは「管理される対象」から「自動的に成長する資産」へと変わります。
最初は難しく感じるかもしれませんが、まずは一つの組織を作り、そこに一つのノードを登録してみてください。その一歩が、巨大なクラウドインフラを支配する第一歩になります。
何か詰まったら、いつでも聞いてください。応援していますよ。