この記事は、Code EngineジョブによるIPアドレス自動監視システムの構築に関する連載の第2弾です。
前回の記事(【Code Engine活用】PowerShellからの脱却!奉行サービスの接続先IPアドレスをクラウドで自動監視する基盤構築)で、IPアドレスの自動取得基盤を構築しました。
今回は、この基盤を拡張し、「IPアドレスの変更検知」と「Chatworkへの自動通知」機能を追加し、完全な監視システムを完成させます。
💡 導入:なぜ変更検知と通知が必要か
前回の基盤は IP アドレスを取得しログに記録するまででした。実運用では以下の課題がありました。
- 手動監視からの脱却: ログは記録されるものの、変更の確認は手動で行う必要があり、手間がかかる。
- 即時性の確保: IPアドレス変更時はファイアウォール設定など、即座の対応が必要なため、リアルタイム通知が必須。
解決策と目標
この課題を Code Engine ジョブ内で解決するため、以下の機能を実装します。
-
状態管理: 前回実行時の IP を保持する履歴ファイル(
ip_history.json)を導入。 - 正確な比較: 複数の IP アドレスを持つ URL の順序変動を無視できる比較ロジックを導入。
- Chatwork通知: 変更検出時に、Chatwork API 経由で自動通知を行う。
🛠️ 実装ステップ:検知と通知のロジック追加
前回の job.script.py をベースに、以下の主要な変更を加えます。
1. 履歴ファイル(ip_history.json)の導入と状態管理
ジョブ実行環境内に履歴ファイルを保持し、IP の前回値を管理します。
-
処理フロー:
- ジョブ起動時に前回実行時の IP を履歴ファイルから読み込む。
- 今回の IP 取得後、変更がなければそのまま、変更があれば通知後に、今回の IP を履歴ファイルに上書き保存(状態更新)する。
-
利用技術: Python の標準ライブラリ
jsonと、ファイルの読み書き処理を使用。
2. IPアドレスの正確な比較ロジックの実装
誤検知を防ぐため、IPアドレスリストの順序が変わっても「変更なし」と判定されるロジックを実装します。
-
改善点: 取得した IP アドレスのリストを、比較する前に Python の
sorted()関数でアルファベット順に並び替えてから結合します。 - 効果: これにより、IP の順序変動を完全に無視し、真の IP アドレスの増減・変更のみを正確に検出できます。
3. Chatwork API連携と通知の実装
IPアドレスに変更が検出された場合に、Chatwork へ通知する関数を実装します。
-
利用技術: Python の
requestsライブラリを使用して、Chatwork のメッセージ送信 API へ HTTP POST リクエストを送信します。 - 認証と安全性: APIトークンは Code Engine の環境変数として設定し、コード内に直接書き込まないように分離しました。(詳細は次項)
-
通知内容: 変更があった URL、旧 IP アドレス、新 IP アドレスを
[info][title]タグを使って明確に通知します。
4. Code Engine ジョブへの機密情報の埋め込み
Chatwork の APIトークンとルームIDを安全に扱うため、Code Engine の環境変数機能を利用します。
-
コンソール設定: ジョブ設定の「環境変数」タブで、
CHATWORK_API_TOKENとCHATWORK_ROOM_IDを定義します。 -
コード側: Python スクリプト内で
os.environ.get('VAR_NAME')を使って、これらの値を安全に読み込みます。
💻 変更を組み込んだ次期ジョブスクリプト(job.script.py)
これらの変更を組み込んだ新しい Python スクリプトの処理概要(疑似コード)は以下のようになります。
# IPアドレスのソート・結合関数(順序変動対策)
def format_ip_string(ip_list):
# IPリストをソートし、カンマとスペース区切りで結合
return ", ".join(sorted(ip_list))
# 履歴の読み込みとIPの取得
previous_ips = load_history('ip_history.json')
current_ips = get_current_ips(URL_LIST)
# 変更のチェック
changes = {}
for url in current_ips.keys():
current_ip_str = format_ip_string(current_ips[url]) # ★ソート適用
previous_ip_str = format_ip_string(previous_ips.get(url, [])) # ★ソート適用
if current_ip_str != previous_ip_str:
# 変更を検出
changes[url] = { 'old': previous_ip_str, 'new': current_ip_str }
# Chatworkへの通知
if changes:
send_chatwork_notification(changes, os.environ.get('CHATWORK_TOKEN'))
# 履歴ファイルの更新
save_history('ip_history.json', current_ips)
✅ まとめ
結論 🎉
この拡張により、IPアドレスの自動取得から変更検知、自動通知までを Code Engine ジョブ内で完結させる、完全な監視システムが構築されました。
- 運用負荷の激減: IP変更があった場合にのみ通知が来るため、手動でのログ確認が不要になりました。
- 信頼性の向上: 順序変動に影響されないロジックにより、誤検知のリスクを排除しました。
- セキュリティの向上: 機密情報である API トークンを環境変数として Code Engine で安全に管理できるようになりました。