post-cover

本記事で紹介するプログラムは以下の GitHub リポジトリで公開しています

GitHub - isec-promotion/lamp-monitor

記事一覧

本連載は全3回構成です。各ステップでシステムの構築から実機運用までを解説しています。

はじめに

ある顧客から「制御盤に 12 個のランプがあり、正常時は緑、異常時は赤に点灯する。この異常を検知したら通知してほしい」という要望をいただきました。そこで、制御盤ランプを監視し、異常を検知した際に通知するシステムを構築しました。

最終的な仕組みは次の通りです。

Raspberry Pi 5 にウェブカメラを接続し、制御盤ランプを撮影。各ランプに検知領域を設定し、緑から赤に変わったら Discord に通知します。

lamp-monitor-01-description

例えば、1 つのランプが赤になれば

ランプが RED 状態になりました: ランプ 6 (1個)

複数同時なら

複数のランプが RED 状態になりました: ランプ 1, 2, 3, ... 12 (12個)

といったメッセージが届きます。

この記事は全 3 回構成です。本稿では Cloudflare Workers を用いた通知基盤の構築 を中心に、Discord へ通知を送る部分を検証した内容を紹介します。

続く記事では以下を扱います。

  • 第 2 回: Web カメラを接続し、12 個の検知領域を設定して実際に通知が届くかを確認
  • 第 3 回: 作成したプログラムを Raspberry Pi 5 に移植し、実機での動作を検証

記事構成

  1. Cloudflare Workers による通知基盤構築と通知テスト ← 本記事
  2. Web カメラで実験
  3. Raspberry Pi 5 への移植

Cloudflare Workers の設定手順

Cloudflare Workers を選んだ理由

本システムにおいて、Raspberry Pi からの通知リクエストを受け取り、Discord へ転送する中継役が必要です。この役割に Cloudflare Workers を採用しました。

選んだ理由は主に以下の通りです。

  • サーバーレス: サーバーの管理やメンテナンスが不要で、コードをデプロイするだけで済みます。
  • 高い信頼性とスケーラビリティ: Cloudflare のグローバルネットワーク上で動作するため、非常に高速かつ安定しています。
  • 無料枠: 小規模な利用であれば、無料枠の範囲内で十分に運用可能です。
  • セキュリティ: HMAC 署名検証のようなセキュリティ機能を簡単に実装できます。

Raspberry Pi から直接 Discord Webhook を叩くことも可能ですが、Webhook URL がプログラム内にハードコーディングされることになり、セキュリティ上のリスクとなります。Cloudflare Workers を中継させることで、Webhook URL を隠蔽し、かつ正規のリクエストのみを受け付ける堅牢な仕組みを構築できます。


Cloudflare Workers の設定

  1. Cloudflare ダッシュボードで「コンピューティングと AI」>「Workers&Pages」から新規作成をクリック。
    lamp-monitor-01-001

  2. 「Hello World から始める」を選択。
    lamp-monitor-01-002

  3. ワーカー名を入力し、デプロイ。
    lamp-monitor-01-003

  4. 「コードを編集」をクリック。
    lamp-monitor-01-004

  5. cloudflare-worker.jsを貼り付け、デプロイ。 cloudflare-worker.js (GitHub リンク) からコードをコピーし、Workers のエディタにペーストしてください。

    lamp-monitor-01-005


Discord で Webhook URL を発行

  1. 通知先チャンネルの設定画面を開き、歯車アイコンをクリック。

    lamp-monitor-01-discord-001

  2. 「ウェブフックを作成」を選択。

    lamp-monitor-01-discord-002

  3. 発行された Webhook URL をコピーして保存。

    lamp-monitor-01-discord-003


環境変数の設定

  1. ダッシュボードの「設定」タブから「変数とシークレット」を追加。

    lamp-monitor-01-007

  2. SECRET_KEY を登録。

    lamp-monitor-01-008

  3. DISCORD_WEBHOOK_URL を登録。

    • タイプ:シークレット
    • 変数名:DISCORD_WEBHOOK_URL
    • 値:Discord 側で発行した Webhook URL

    lamp-monitor-01-009


コードの特徴

  • POST リクエストの受付: Raspberry Pi からのリクエストを受け付ける際、POST メソッド以外は拒否して不要なアクセスを防ぐ。
  • HMAC 署名の検証: 送信側と受信側で同じ秘密鍵を使いハッシュを比較することで、なりすましや改ざんを防止。
  • 環境変数での機密管理: Discord Webhook URL や秘密鍵をコードに直書きせず、Cloudflare の環境変数として安全に管理。

疑似ランプ監視プログラムで通知フローをテスト

通知基盤を構築したので、次に実際のカメラを使わずに コンピューター内部で制御盤ランプの点灯をシミュレーション し、通知フローが正しく動作するかを検証します。

この段階で確認したいのは、次の 2 点です。

  • ロジックの検証: ランプが緑 → 赤に変化した時に通知が発火するか
  • 通知基盤との接続確認: Cloudflare Workers 側で署名検証が通り、Discord にメッセージが届くか

疑似ランプ監視プログラムの構成

今回作成したのが monitor_test.py です。このプログラムは、カメラ映像を扱わずに ランプが「緑 → 赤」に変化したイベントが発生した と仮定して通知処理をテストするためのものです。

monitor_test.py (GitHub リンク) からコードをダウンロードしてください。

主な特徴

  • イベントシミュレーション: 映像解析は行わず、特定のタイミングで「ランプが赤に変わった」というイベントを擬似的に発生させる。
  • 通知処理の検証: HMAC 署名付きの JSON を Cloudflare Workers に送信し、署名検証が通れば Discord に転送される。
  • 通知フロー全体の確認: 実カメラなしで、通知基盤が正しく動作するかをエンドツーエンドでテスト可能。

Python クライアント側の環境変数設定

プロジェクトでは機密情報(Cloudflare Workers URL、共通鍵など)を環境変数で管理します。

1) 環境変数ファイルの作成

# .env.example を .env にコピー
copy .env.example .env

.env.example の内容は以下の通りです。

# Lamp Monitor Environment Variables
# このファイルを .env にコピーして実際の値を設定してください

# Cloudflare Workers URL
LAMP_MONITOR_WORKER_URL=https://your-worker.workers.dev

# 通知用の共通鍵(Cloudflare WorkersのYOUR_SECRET_KEYと一致させる)
LAMP_MONITOR_SECRET=your_secret_key

2) .env ファイルの編集

.env ファイルを開いて実際の値を設定します。LAMP_MONITOR_SECRET は、Cloudflare Workers に設定した SECRET_KEY と同じ値にしてください。

3) 環境変数展開のテスト

設定が正しく動作するか test_env_config.py でテストできます。

python .\utils\test_env_config.py

プログラムの実行と検証結果

設定が完了したら、テストプログラムを実行します。

python monitor_test.py

コンソールに以下のようなログが表示され、通知処理が実行されます。

ランプ 1: GREEN → RED (信頼度: 0.85)
通知送信先URL: https://lamp-monitor.your-account.workers.dev
通知データ: {"lamp_id": 1, "state": "RED", "message": "ランプ 1 が RED 状態になりました", ...}
ランプ 1: 通知送信成功

正しく設定されていれば、指定した Discord チャンネルにメッセージが届きます。

得られた検証結果

この疑似テストにより、以下を確認できました。

  1. ロジックが正しく動作: 緑 → 赤に変わったときだけ通知が飛ぶ。
  2. 通知基盤が接続できている: Cloudflare Workers 側で HMAC 署名が検証され、Discord への転送が成功。
  3. 誤通知防止機能の確認: 最小通知間隔を設定したことで、連続検知による通知スパムを防止。

まとめと次回予告

今回は、通知基盤の要となる Cloudflare Workers スクリプト を構築し、HMAC 署名検証によってセキュアな通知経路を確保しました。さらに、実カメラを使わずに 通知フロー全体の動作確認 を行い、基盤部分が正しく機能していることを保証しました。

次回は Web カメラを使い、Windows 上で 12 個のランプ領域を設定して実映像で動作検証 を行います。

SNSでシェアしよう

この記事が役に立ったら、ぜひシェアしてください