# PM2 のエラーを Slack に通知
PM2 は Node.js アプリケーションのプロセス管理ツールとして広く利用されています。本番環境でアプリケーションがクラッシュしたり、エラーが発生した際に、即座に Slack に通知することで、迅速な対応が可能になります。
# この記事の対象読者
- PM2 で Node.js アプリケーションを管理している方
- 本番環境のエラーをリアルタイムで監視したい方
- Slack に通知を送信する仕組みを構築したい方
- サーバーの異常を早期に検知したい方
# 前提条件
実装を開始する前に、以下の条件を確認してください:
- PM2: PM2 がインストールされていること
- Node.js: Node.js がインストールされていること
- Slack ワークスペース: Slack のワークスペースにアクセスできること
- Webhook URL: Slack の Incoming Webhook URL を取得できること
確認方法
# PM2の確認
pm2 -v
# Node.jsの確認
node -v
npm -v
# PM2 とは
PM2(Process Manager 2)は、Node.js アプリケーションのプロセス管理ツールです。アプリケーションの自動再起動、ログ管理、クラスターモード、モニタリングなどの機能を提供します。
# PM2 の主な機能
- 自動再起動: アプリケーションがクラッシュした際に自動的に再起動
- ログ管理: 標準出力とエラー出力を自動的にログファイルに保存
- クラスターモード: 複数のインスタンスを起動して負荷分散
- モニタリング: CPU、メモリ使用率などのリソース監視
- イベントシステム: プロセスの起動、停止、再起動などのイベントを監視
# Slack Webhook URL の取得
まず、Slack に通知を送信するための Webhook URL を取得します。
# 1. Slack App の作成
- Slack API (opens new window)にアクセス
- 「Your Apps」をクリック
- 「Create New App」をクリック
- 「From scratch」を選択
- App 名とワークスペースを選択して作成
# 2. Incoming Webhooks の有効化
- 作成した App の設定画面で「Incoming Webhooks」を選択
- 「Activate Incoming Webhooks」を ON にする
- 「Add New Webhook to Workspace」をクリック
- 通知を送信したいチャンネルを選択
- 「Allow」をクリックして Webhook URL をコピー
# 3. Webhook URL の形式
取得した Webhook URL は以下のような形式です:
https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX
この URL は機密情報なので、環境変数として管理することを推奨します。
# 実装方法
PM2 のエラーを Slack に通知する最も簡単な方法は、PM2 モジュールシステムを使用することです。PM2 には専用のpm2-slackモジュールがあり、pm2 setコマンドで簡単に設定できます。
# pm2-slack モジュールのインストールと設定
# 1. モジュールのインストール
PM2 モジュールとしてpm2-slackをインストールします:
pm2 install pm2-slack
インストールが成功すると、以下のようなメッセージが表示されます:
[PM2] Module pm2-slack installed
[PM2] Module pm2-slack configured
# 2. Slack Webhook URL の設定
pm2 setコマンドを使って、Slack Webhook URL を設定します:
pm2 set pm2-slack:slack_url https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX
これだけで設定は完了です。PM2 が自動的に設定を反映します。
# 3. オプション設定(任意)
必要に応じて、以下のオプションも設定できます:
# チャンネル名を設定(デフォルトはWebhookで設定したチャンネル)
pm2 set pm2-slack:channel "#alerts"
# ユーザー名を設定(デフォルトは"PM2")
pm2 set pm2-slack:username "PM2 Monitor"
# アイコン絵文字を設定(デフォルトは":rocket:")
pm2 set pm2-slack:icon_emoji ":warning:"
# 4. 設定の確認
設定が正しく反映されているか確認します:
# インストール済みモジュールの一覧
pm2 module:list
# 現在の設定を確認
pm2 conf pm2-slack
# 通知されるイベント
pm2-slackモジュールは以下の PM2 イベントを自動的に Slack に通知します:
- プロセス起動 (
online): アプリケーションが起動した時 - プロセス停止 (
stop): アプリケーションが停止した時 - プロセス再起動 (
restart): アプリケーションが再起動した時 - プロセス異常終了 (
exit): アプリケーションがクラッシュした時 - エラーログ (
log:err): エラーログが出力された時
# 動作確認
設定が完了したら、動作確認を行います:
# テスト用のアプリケーションを起動
pm2 start app.js --name test-app
# アプリケーションを停止(通知が送信される)
pm2 stop test-app
# アプリケーションを再起動(通知が送信される)
pm2 restart test-app
Slack の指定したチャンネルに通知が届いているか確認します。
# ログの確認
モジュールが正常に動作しているか確認する場合:
# pm2-slackモジュールのログを確認
pm2 logs pm2-slack
# 設定の変更
設定を変更したい場合は、再度pm2 setコマンドを実行します:
# Webhook URLを変更
pm2 set pm2-slack:slack_url https://hooks.slack.com/services/NEW_WEBHOOK_URL
# チャンネルを変更
pm2 set pm2-slack:channel "#new-channel"
設定は即座に反映されます。
# PM2 の起動時に自動起動
システム起動時に PM2 を自動起動するように設定します:
# PM2の起動スクリプトを生成
pm2 startup
# 現在のプロセスリストを保存(モジュールも含まれる)
pm2 save
これにより、システム再起動後もpm2-slackモジュールが自動的に起動し、設定も保持されます。
# トラブルシューティング
# 問題: Slack 通知が送信されない
原因: Webhook URL が正しく設定されていない、モジュールが起動していないなど
解決方法:
# 設定の確認
pm2 conf pm2-slack
# モジュールの状態確認
pm2 module:list
# pm2-slackモジュールのログを確認
pm2 logs pm2-slack
# モジュールの再起動
pm2 module:restart pm2-slack
# 設定を再設定
pm2 set pm2-slack:slack_url https://hooks.slack.com/services/YOUR_WEBHOOK_URL
# 問題: モジュールがインストールされない
原因: ネットワークエラー、権限不足など
解決方法:
# PM2のバージョン確認
pm2 -v
# モジュールの再インストール
pm2 module:uninstall pm2-slack
pm2 install pm2-slack
# ネットワーク接続の確認
ping registry.npmjs.org
# 問題: 設定が反映されない
原因: 設定コマンドの実行が失敗している、モジュールが再起動されていない
解決方法:
# 現在の設定を確認
pm2 conf pm2-slack
# 設定を再設定
pm2 set pm2-slack:slack_url https://hooks.slack.com/services/YOUR_WEBHOOK_URL
# モジュールの再起動
pm2 module:restart pm2-slack
# 問題: 通知が頻繁に送信される
原因: エラーが連続して発生している
解決方法: pm2-slackモジュールにはレート制限機能がないため、Slack 側でレート制限を設定するか、カスタムモジュールを作成する必要があります。
Slack App の設定でレート制限を設定するか、通知をフィルタリングするカスタムスクリプトを作成します。
# 問題: モジュールが自動起動しない
原因: pm2 saveが実行されていない
解決方法:
# 現在の状態を保存
pm2 save
# 保存された状態を確認
pm2 resurrect --dry-run
# システム起動時に自動起動する設定
pm2 startup
# 問題: 特定のイベントのみ通知したい
原因: pm2-slackは全てのイベントを通知する
解決方法: カスタムモジュールを作成するか、通知をフィルタリングするスクリプトを作成します。
# モジュールの管理
# モジュールのアンインストール
pm2-slackモジュールを削除する場合:
pm2 module:uninstall pm2-slack
# モジュールの更新
pm2-slackモジュールを最新版に更新する場合:
pm2 module:update pm2-slack
# モジュールの無効化
一時的にモジュールを無効化する場合:
pm2 module:stop pm2-slack
再度有効化する場合:
pm2 module:start pm2-slack
# セキュリティの考慮事項
# Webhook URL の保護
- Webhook URL は機密情報として扱う
- 環境変数やシークレット管理サービスで管理
- バージョン管理システムにコミットしない
.envファイルを.gitignoreに追加
# 通知の制限
- 本番環境と開発環境で異なるチャンネルを使用
- 重要なイベントのみ通知するようにフィルタリング(カスタム実装が必要)
- Slack 側でレート制限を設定
# まとめ
PM2 のエラーを Slack に通知することで、本番環境の異常を即座に検知し、迅速な対応が可能になります。
# 主なポイント
- ✅
pm2-slackモジュールを使用して簡単に実装 - ✅
pm2 setコマンドで設定可能で、コード不要 - ✅ エラー、再起動、異常終了などの重要なイベントを自動監視
- ✅ PM2 モジュールシステムで統合管理
- ✅ システム再起動後も自動的に動作
# 次のステップ
- メトリクス監視ツール(Prometheus、Grafana など)との統合
- カスタムアラート条件の設定(カスタムモジュール作成)
- 複数の通知チャンネルへの通知(環境ごとに設定)
- 通知履歴の記録と分析