Node.jsアプリケーションをネットワーク経由で通信する小さなサービスの集まりとして構築する手法は、現代のソフトウェア開発において非常に多くの利点をもたらします。
しかし、分散した数多くのサブシステムをすべて正しく稼働させ、同期を保つ作業は、時に非常に煩雑で退屈なものになりがちです。
2012年5月にJames “SubStack” Halliday氏によって発表されたfleetは、こうした複数のサーバーにまたがる複雑なプロセス管理とデプロイを簡素化するために誕生しました。
fleetを利用すれば、gitのリポジトリから複数のサーバー群へと新しいコードをシームレスに送り出し、スタック内のすべてのプロセスを効率的に制御することが可能になります。
fleetの概要と導入のメリット
Node.jsのエコシステムにおいて、マイクロサービスのような小さなプロセスの集合体を管理することは一つの大きな課題でした。
fleetは、チームの誰もがgitを使用して新しいコードをサーバー群(アルマダ)にプッシュし、プロセスの実行状態を管理できるように設計されています。
このツールの最大の特徴は、SSHキーの設定や複雑なポストコミットフックの構築が不要であるという点にあります。
開発者は慣れ親しんだgitの操作を通じて、安全かつ迅速にコードを本番環境へ反映させることができます。
また、複数のサーバーにまたがるデプロイ作業を一つのコマンドに集約できるため、インフラ運用のコストを大幅に削減することが可能です。
2012年当時のリリース時点で、すでにNode.jsにおけるマルチサーバー運用を劇的に効率化するポテンシャルを持っていました。
fleetのインストールとハブの構築
fleetを使い始めるには、まずnpmを使用してコマンドをインストールする必要があります。
# fleetコマンドのグローバルインストール
npm install -g fleet
インストールが完了したら、ネットワークの司令塔となる「fleet hub」をサーバーの一台で起動します。
hubはコマンドの受け付けや、gitサーバーとしての役割を担う重要なコンポーネントです。
作業用のディレクトリを作成し、パスフレーズとポート番号を指定してhubを開始しましょう。
# ハブの起動
fleet hub --port=7000 --secret=beepboop
hub listening on :7000
git listen on :7001
これにより、ポート7000でコマンドを待ち受け、ポート7001でHTTP経由のgitサーバーが稼働し始めます。
面倒な設定を一切排除し、コマンド一つでデプロイの基盤が整う点はfleetの大きな魅力です。
ワーカードローンのセットアップ
次に、実際にプロセスを実行するための「worker drones (ワーカー機)」を設定します。
ドローンはハブからの指示を受け取り、アプリケーションのコードを動かす役割を果たします。
一つのサーバー上で複数のドローンを動かすことも可能ですが、その場合は必ず別々のディレクトリから実行してください。
# ドローンの起動(hubのアドレスとシークレットを指定)
fleet drone --hub=x.x.x.x:7000 --secret=beepboop
このコマンドを実行することで、ドローンがハブに接続され、コードを受け取る準備が整います。
必要に応じて、複数のサーバーで同様の操作を行い、強力なコンピューティング群を構築しましょう。
gitを活用したコードのデプロイ
ドローンの準備ができたら、デプロイしたいアプリケーションのディレクトリへ移動します。
毎回ハブのアドレスやシークレットを入力する手間を省くために、まずはリモート設定を行います。
# リモート設定の保存
fleet remote add default --hub=x.x.x.x:7000 --secret=beepboop
このコマンドを実行すると、設定内容を保存するための fleet.json ファイルが自動的に生成されます。
設定が完了したら、いよいよアプリケーションをデプロイします。
# アプリケーションのデプロイ実行
fleet deploy
fleet deploy コマンドを実行すると、内部でgit pushが実行され、ハブを経由してすべてのドローンに最新のコードが配布されます。
デプロイのたびに各ドローン上の新しいディレクトリへコードがチェックアウトされるため、履歴の管理も容易です。
プロセスの実行と管理
fleet におけるデプロイは、単にコードを転送するだけではありません。
転送されたコードからプロセスを起動するには、fleet spawn コマンドを使用します。
# プロセスの起動
fleet spawn -- node server.js
デフォルトでは、fleet は利用可能なドローンの中からランダムに一台を選択してプロセスを実行します。
特定のサーバーで実行したい場合は、--drone スイッチを使用して個別に指定することも可能です。
現在稼働しているプロセスの状態を確認するには、以下のコマンドを使用します。
# 稼働状況の確認
fleet ps
drones:
- 10.0.1.5
- pid: 1234, status: running, commit: a1b2c3d
- 10.0.1.6
- pid: 5678, status: running, commit: a1b2c3d
新しいコードをプッシュした後に fleet spawn を実行すると、そのプロセスは最新のgitコミットハッシュに基づいた新しいディレクトリで起動します。
これにより、古いサービスを停止させる前に新しいサービスの動作を確認するといった、安全な更新が可能になります。
特定のプロセスを終了させたい場合は、fleet stop コマンドで簡単に対処できます。
高度な運用と統合
fleet の真価は、他のツールと組み合わせた際にさらに発揮されます。
例えば、seaport のようなサービスレジストリと併用することで、ホストやポートの管理を動的に行うことができます。
これにより、既存のサービスを停止させることなく、アドホックなステージング環境を構築してテストを行うことが可能になります。
異種混合のデプロイや、カスタムHTTPプロキシを利用した段階的なロールアウトなども、アイデア次第で実現可能です。
fleet help コマンドを叩けば、gitのようなマニュアル形式で詳細なコマンド一覧を確認することができます。
運用の柔軟性を高めるための多くの機能が、このシンプルなツールに凝縮されています。
まとめ
fleet は、Node.jsアプリケーションのマルチサーバー管理における複雑さを解消するために開発された強力なツールです。
gitと連携した直感的なワークフローにより、開発者はインフラの細部を意識することなく、コードの作成と改善に集中できます。
2012年5月の登場以来、このアプローチは継続的デプロイメントの重要性を世に示してきました。
小規模なマイクロサービスから大規模なシステムまで、効率的なデプロイパイプラインの構築にぜひ fleet を役立ててください。
