依存パッケージのインストールPostfixの設定MySQLユーザーとデータベースの作成Healthchecks用ユーザーの作成ソースコードの取得と依存ライブラリのインストールHealthchecksの設定マイグレーションとスーパーユーザーの作成テストサーバーの起動と動作確認WSGIで動作させるHealthchecksの使い方インテグレーションの設定sendalertsをsystemdのサービスとして動作させる毎日のバックアップやログの集計などをはじめ、サーバーでは定期的に様々な処理が実行されていますよね。当然ですが、管理者はこうした処理が失敗したことに気づけなければなりません。スクリプトの中でエラーをハンドリングしたり、あるいはスクリプトの戻り値を見てメールを送信したりSlackに発言したり......といった処理を仕込んでいるのではないでしょうか。admin@example.comしかしこのアプローチには問題があります。サーバーに意図しない問題が起きている状態では、エラーメールの送信にも失敗してしまう可能性があります。その場合管理者は、正常に終了したからアラートが来ないのか、アラートの送信にすら失敗しているのか判断がつかず、問題を見逃してしまうでしょう。その結果「毎日正常に動いていたと思っていたバックアップ処理が、実は半年前から失敗し続けていることをディスク故障後に知る」といった悲劇に見舞われることになります。そこで逆に「ジョブの成功時に監視サーバーにPingを打ち、一定期間Pingがなかったジョブを失敗したと見なす」という考え方で作られた監視システムが、今回紹介するHealthchecksです[1]⁠。[1]つまるところ、一般的な死活監視システムと同じ考えを、プログラムの成否判定の監視に適用したものです。実はHealthchecksはSaaSとして運営されており、ここにサインアップするだけで監視機能を利用できます。今回はこれと同じ監視サーバーを自前で構築する手順から紹介します[2]⁠。[2]こういったマネージドなサービスは非常に便利なのですが、色々なしがらみからすべて自社内で用意せざるをえないことが多々あるのは、読者の皆様でしたらご理解いただけるのではないでしょうか。依存パッケージのインストールまずは必要なパッケージをインストールします[3]⁠。LTS上でPython3を使うことを前提とします。HealthchecksはPython製のソフトウェアで、依存ライブラリのインストールにpipを利用するため、python3-pipパッケージが必要です。バックエンドのデータベースにはSQLite(デフォルト)のほかに、MySQL、PostgreSQLが選べます。筆者はMySQLを選択したので、データベース本体であるmysql-serverと、Python3のインターフェイスであるpython3-mysqldbをインストールします。後述するアラートをメールで送信するため、postfixも必要です。postfixインストール中にPostfixの構成タイプとメールサーバー名を訊かれます。Site」を選択し、サーバーのFQDNを入力してください。Postfixの設定。Siteを選択する同様に、MySQLのrootユーザーのパスワードを訊かれるので、パスワードを設定してください。今回Postfixはアラートの送信にしか使用せず、外部からのSMTP送信やメール受信でのPingは受け取らないため、「⁠inet_interfaces」に「localhost」を指定し、外部に対して25番ポートを晒さないようにします。25番でのsasl_authを禁止しておきます。postconfで設定を行ったら、postfixを再起動します。postfix.serviceMySQLユーザーとデータベースの作成MySQLに、Healthchecks用のMySQLユーザーとデータベースを作成します。ここではユーザー名、データベース名ともに「healthchecks」としていますが、お好みで変えても構いません。utf8;Healthchecks用ユーザーの作成Healthchecks用のユーザーを作成します。Healthchecksはこのユーザーのホームディレクトリ以下にインストールし[4]⁠、後述するアラート通知用サービスも、このユーザーの権限で起動させます。以後の作業はhealthchecksユーザーで行うため、sudoを実行可能にしておきます[5]⁠。[4]「/opt以下にインストールしたい」というような方は、以後のパスを適宜読み替えてください。sudoソースコードの取得と依存ライブラリのインストールhealthchecksユーザーにスイッチしたら、Healthchecksのソースコードをcloneします。https://github.com/healthchecks/healthchecks.git「/home/healthcecks/healthchecks」ディレクトリが作成され、コードがcloneされました。この中にある「requirements.txt」には、依存しているPythonのライブラリが列挙されています。pip3コマンドの「-r」オプションにこのファイルを渡して、依存ライブラリをインストールしてください[6]⁠。[6]ここでもわかりやすさを優先するため、root権限で/usr/local以下にライブラリをインストールしています。これが気になる方は、virtualenv環境を使うのもよい考えでしょう。最近では、この手のアプリは専用のコンテナに閉じ込めることが多いので、コンテナ内でシステムワイドにインストールしてしまうのが楽でいいのではないか、というのが筆者の考えです。実際に筆者は本記事の手順でインストールしたHealthchecksを、LXCコンテナ内で運用しています。requirements.txtHealthchecksの設定Healthchecksの設定ファイルは、hcディレクトリ内の「settings.py」と「local_settings.py」です。settings.pyにはデフォルトの設定が書かれています。local_settings.pyに設定を記述すると、settings.pyの設定を上書きできます。settings.pyを直接編集することはせず、サイト固有の設定はlocal_settings.pyで行いましょう。local_settings.pyは初期状態では存在しないため、サンプルの「local_settings.py.example」をコピーして雛形を作ります。hc/local_settings.pyテキストエディタでlocal_settings.pyを開いてください。冒頭に以下の3行がコメントアウトされています。コメントを解除して、適切な値を設定してください。"noreply@my-monitoring-project.com"SITE_ROOTはHealthchecksのFQDNです。メール通知などの中に埋め込まれるので、ブラウザーでアクセスできる正しいURLを記述してください。SITE_NAMEはその名の通り、テンプレート全体で利用されるサイトの名前です。変更しなくても動作に支障はありませんが、自社のプロジェクト名などにしておくとわかりやすいでしょう。DEFAULT_FROM_EMAILは、Healthchecksが送信するメールのFromです。スパムと判定されないためにも、自分のドメイン名にしておきましょう。その下に、以下の行を追記してください。'Asia/Tokyo'HOSTに設定した値は、メールでPingを送る際の(受信アドレスの)ドメイン名になります。UI上での表記がデフォルトのlocalhostのままなのもかっこ悪いので、このサーバーのFQDNを設定しておきます。PING_ENDPOINTはPingを送る際のURLになります。先ほど設定したSITE_ROOTの値を元にしています。ALLOWED_HOSTSは、サービスにアクセスを許可するホストです。デフォルトではlocalhostのみになっているため、アクセスを許可したいIPアドレスを列挙してください。UIにアクセスするホストと、Pingを送信するサーバーのすべてが含まれている必要があります。上記の例ではすべてのホストを許可しています。UIからのサインアップを許可するかどうかです。クローズドな環境下で、限られたメンバーだけで運用するのであれば、不特定多数のサインアップを許可する必要はないため、Falseに設定しておくとよいでしょう。誰でも自由に使ってよいというポリシーであれば、この行は省略して構いません。その下にはデータベースの設定を記述します。最初からコメントアウトされた状態で各設定の例が記述されていますので、下記のようにMySQLのセクションのコメントを解除し、NAME、USER、PASSWORDに先ほどデータベースを作成した時の値を指定してください。}}データベースの設定のさらに下に、メール送信の設定がコメントアウトされた状態で記述されています。今回はローカルにあるPostfixからメールを送信するため、設定を書き換える必要はありません。外部のSMTPサーバーを利用する場合は、適宜設定を書き換えてください。マイグレーションとスーパーユーザーの作成アプリケーションの設定が完了したら、マイグレーションとスーパーユーザーの作成を行います。createsuperuser」を実行してください。ユーザー名を入力する。ブランクのままで構わない。スーパーユーザーのログインに使うメールアドレスを指定する。スーパーユーザーのパスワードを指定する。successfully.この際、インタプリタとしてpython3を明示的に指定して実行しています。python」が指定されているのですが、最近のUbuntuサーバーではPython2がインストールされていないため、以下のようにスクリプトを実行するとエラーになってしまうためです。directoryテストサーバーの起動と動作確認ここまでの作業が完了したら、Healthchecksを動かせます。以下のコマンドを実行し、manage.pyでテスト用Webサーバーを起動してください[7]⁠。[7]ユーザー権限でサーバーを起動しているため、一時的に8080番ポートを使っています。前述のアプリケーションの設定は、Apacheを経由して80番ポートを使うことを想定した設定のため、この状態とは齟齬があります。動作確認なので無視してください。0.0.0.0:8080Webブラウザーからサーバーの8080番ポートに接続してください。Healthchecksのトップページが表示されていれば成功です。HealthchecksのトップページCtrl+Cでテストサーバーを終了できます。WSGIで動作させるrunserverはあくまでテスト用のサーバーですので、本番での利用は推奨されません。そこでアプリケーションが動作することが確認できたら、Apacheでアプリケーションをホストするようにしましょう。ApacheとWSGIモジュールをインストールします。libapache2-mod-wsgi-py3「/etc/apache2/sites-enabled/000-default.conf」を、以下の内容に置き換えます。インストールしているパスが異なる場合は、適宜変更してください。</Directory></VirtualHost>Apacheを再起動します。apache2.service今度はWebブラウザーから、サーバーの80番ポートに接続してください。先ほどと同じトップページが表示されていれば成功です。Healthchecksの使い方それでは実際にHealthchecksを使ってみましょう。先ほどcreatesuperuserで作成したユーザーでログインします。In」をクリックしてください。In」ボタンをクリックすると、そのアドレスにログイン用のURLが送信されます。リンクをクリックしてログインしてください。password」にチェックを入れると、パスワード入力欄が表示されます。メール経由でなく、パスワードでログインしたい場合はこちらを使います。Check」ボタンをクリックすると、Pingを送信するユニークなURLが生成されます。これが「チェック」です。新しいチェックを作成する「Name」の部分をクリックすると、チェックに名前とタグをつけられます。わかりやすい名前をつけておきましょう。UI上でチェックのフィルタリングに使います。スペースで区切ることで複数のタグをつけられるので、「⁠web」「⁠mail」「⁠backup」等々、整理しやすいタグをつけておくと便利かもしれません。生成されたばかりでPingを受信していないチェックは、ステータスが「New」となっています。ためしにこのチェックに対してPingを送信してみましょう。Examples」をクリックすると、各種ツールや言語でPingを送信する例が表示されます。ここの「Bash」のタブにはcurlコマンドやwgetコマンドを使った例がありますので、これをコピペするのが楽でしょう。正常にPingが送信できると、チェックのステータスが「Up」になり、アイコンが緑色に変化します。Pingを受け取った状態。指定された時間内にコマンドが正常に終了したことを表している「Period」「⁠Grace」は、ステータスが変化してアラートが発生するまでの時間です。「⁠Period」にはPingが送信されるインターバルを指定します。day」に設定します。前回のPing送信からPeriodに設定した時間が経過すると、チェックのステータスが「Up」から「Late」になり、アイコンが黄色くなります。「Grace」には、ステータスが「Late」になってから実際にアラートが送信されるまでの猶予時間を設定します。日によって処理にかかる時間が異なるジョブの場合、単純に「24時間以上経過したらアラート」という設定だと、処理は正常に行われているのにアラートが鳴る日と鳴らない日が出てきてしまうからです。hours」に設定した場合、前回Pingを受け取ってから27時間経過した時点でステータスが「Late」から「Down」になり、このタイミングでアラートが送信されます。最後のPing送信からの時間経過によるステータスの変化。赤いベルのアイコンがDownで、アラートとなるインテグレーションの設定アラートが送信される条件は前述の通りなのですが、チェックを設定しただけでは実際にアラートは飛びません。アラートの送信先を登録し、チェックと関連づける必要があります。このアラートの送信先をインテグレーションと呼び、インテグレーションにはメールのほか、SlackやWebhook、HipChatなどが用意されています。ここではよく使うであろう、メールのインテグレーションの設定を例に紹介します。Integration」ボタンをクリックします。Integration」ボタンをクリックします。アラートを送信するメールアドレスを入力するインテグレーションが追加されますが、この状態ではまだ(unconfirmed)になっています。不正なメール送信を防止するため、メールインテグレーションでは受信者の同意が必要なためです。設定したメールアドレス宛てに確認のメールが送信されていますので、その中に記載されているURLを開いてください。Verified」のページが表示されれば確認は完了です。以後、このアドレス宛てにアラートの送信ができます。Checks」をクリックすると、そのインテグレーションをどのチェックと関連づけるかを選択できます。チェックごとに送信先を変えたい場合に便利です。インテグレーションとチェックの関連づけを設定するさて、実はこれだけではまだアラートは送信されません。アラートの送信は別プロセスによって行われるため、このプロセスをバックグラウンド起動しておかないと、インテグレーションを設定してもアラートは送信されないのです。インテグレーションを設定したら以下のコマンドを実行して、アラートが送信されることを確認してください。テストのためにはチェックのPeriodとGraceを極端に短くした上で、curlでPingを送ってみるとよいでしょう。sendalertssendalertsをsystemdのサービスとして動作させるsendalertsを毎回手で起動するのは面倒ですので、正常にアラートが飛ぶことが確認できたら、systemdのサービスとして起動させましょう。「⁠/etc/systemd/system/sendalerts.service」というファイルを、下記の内容で作成してください(例によってインストールしたパスが違う場合は適宜読み替えてください⁠)⁠。multi-user.targetサービスを起動します。sendalerts.serviceいかがでしょうか。Cronモニタリングシステムと名乗っているHealthchecksですが、一定時間内に応答があったかどうかを見張るという仕組みは、他にも色々と応用できそうです。インストールも簡単ですので、お手軽なプロセス監視システムがほしい方は導入を検討してみてもいいかもしれませんね。Ltd.ページ内容の全部あるいは一部を無断で利用することを禁止します⁠。個別にライセンスが設定されている記事等はそのライセンスに従います。