0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【続編】Code EngineでIPアドレスの変更を検知しChatworkに自動通知する

Posted at

この記事は、Code EngineジョブによるIPアドレス自動監視システムの構築に関する連載の第2弾です。

前回の記事(【Code Engine活用】PowerShellからの脱却!奉行サービスの接続先IPアドレスをクラウドで自動監視する基盤構築)で、IPアドレスの自動取得基盤を構築しました。

今回は、この基盤を拡張し、「IPアドレスの変更検知」と「Chatworkへの自動通知」機能を追加し、完全な監視システムを完成させます。


💡 導入:なぜ変更検知と通知が必要か

前回の基盤は IP アドレスを取得しログに記録するまででした。実運用では以下の課題がありました。

  • 手動監視からの脱却: ログは記録されるものの、変更の確認は手動で行う必要があり、手間がかかる。
  • 即時性の確保: IPアドレス変更時はファイアウォール設定など、即座の対応が必要なため、リアルタイム通知が必須。

解決策と目標

この課題を Code Engine ジョブ内で解決するため、以下の機能を実装します。

  1. 状態管理: 前回実行時の IP を保持する履歴ファイルip_history.json)を導入。
  2. 正確な比較: 複数の IP アドレスを持つ URL の順序変動を無視できる比較ロジックを導入。
  3. 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_TOKENCHATWORK_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 で安全に管理できるようになりました。
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?