VEBAによるvSphereの自動化:システム障害時にvCenterを「沈黙」させてはいけない

VMware tutorial - IT technology blog
VMware tutorial - IT technology blog

月曜朝の恐怖「ログ確認」

VMware管理の仕事を始めたばかりの頃、ある「典型的な」トラブルに見舞われました。月曜の朝、PCを開くやいなや上司が待ち構えており、「なぜ日曜の午前2時にデータベースVMがダウンしたのに、誰も気づかなかったんだ?」と問い詰められたのです。

私は慌ててvCenterを開き、散らかった「Tasks & Events」の中から原因を探しました。結局、忘れ去られていた古いスナップショットが200GB以上に膨れ上がり、Datastoreを溢れさせていたことが判明しました。問題は、vCenterはこの事象を正確に把握してログに記録していたにもかかわらず、「沈黙」していたことです。こちらから探しに行かない限り、教えてはくれなかったのです。

もしあなたが vSphere インフラを管理しており、すべてを手動で行うことに疲れているなら、この記事が解決策になります。エンドユーザーから苦情の電話がかかってくるまで待つのは、もうやめましょう。

なぜvCenterの標準アラート機能だけでは不十分なのか?

実際、vCenter Serverは巨大なイベントデータの宝庫です。VMの起動/停止、vMotionからハードウェア障害まで、あらゆるアクションが詳細に記録されます。しかし、VMwareのデフォルトのAlarms機能は、やや時代遅れです。

メールの送信は可能ですが、24時間365日受信トレイを監視している人は稀でしょう。SNMP Trapの設定は、ネットワークの専門家でない限り「悪夢」です。根本的な問題は、vCenterが現代的なEvent-Driven(イベント駆動型)アーキテクチャに基づいて設計されていないことです。

それは受動的な日記のようなものです。何かを知りたければ自分で開いて読む必要があり、異変が起きたときに他のアプリケーションへ自動的に通知する仕組みが乏しいのです。

従来の解決策の弱点

最適なソリューションを見つける前に、いくつかの方法を試しましたが、どれも欠点がありました:

  • vCenter Alarms (Email): 通知が遅く、迷惑メールに入りやすく、内容のカスタマイズが極めて困難です。
  • PowerCLI Scripting: 5分おきにログをスキャンするcronジョブを作成したことがありますが、システムに遅延が生じる上、クエリの連続処理によりvCenter의 CPU負荷が常に高くなってしまいました。
  • vRealize Operations (vROps): 非常に強力ですが、ライセンス費用が数千ドルかかります。また、使いこなすには専用のトレーニングが必要なほど設定が複雑です。

VEBA:VMwareのためのインテリジェントな「通訳者」

ラボ環境を最適化しようと調べているうちに、VMware Event Broker Appliance (VEBA)に出会いました。これは、VMwareのトップエンジニアたちによって開発されたオープンソースプロジェクトです。

VEBAは、vCenterと外部アプリケーションの橋渡し役を担います。vCenterでイベントが発生すると、VEBAが即座にそれをキャッチし、Function(関数)をトリガーします。「もしVMが予期せず停止したら、すぐにTelegramでメッセージを送れ」といった命令が可能になります。

動作の仕組み

VEBAはKnativeやOpenFaaSの力を借りて、Serverless Functionsを実行します。複雑なサーバー管理は不要です。コード(Python, PowerShell, Goなど)をデプロイするだけで、対応するイベントが発生した際、自動的に実行されます。

Telegram自動通知を構築する手順

以下に、誰かが仮想マシンを削除(VM Removed)した際に、Telegramが管理グループへ即座に警告を送るシステムの設定方法を説明します。

ステップ1:Telegram Botの作成

  1. Telegramで @BotFather とチャットし、/newbot コマンドを入力してボットを作成します。
  2. 発行された API Token を保存します。
  3. ボットに任意のメッセージを送信した後、以下のURLにアクセスして chat_id を取得します:
    https://api.telegram.org/bot<YOUR_TOKEN>/getUpdates

ステップ2:VEBA Appliance deプロイ

公式サイト vmware.github.io/event-broker-appliance からOVAファイルをダウンロードします。vCenterにインポートする際、以下の重要なパラメータに注意してください:

  • vCenter Server: vCenterのIPアドレスまたはFQDN。
  • vCenter User: イベントに対して最低限「Read-only」権限を持つアカウント。
  • Provider: 最も安定性の高い knative を選択してください。

ステップ3:Pythonによる処理関数の作成

以下のコードは、VEBAからデータを受け取り、分かりやすいTelegramメッセージに変換して転送します:

import requests
import os

def handler(context, event):
    # vCenterイベントから詳細情報を取得
    data = event.data
    vm_name = data.get('Vm', {}).get('Name', 'N/A')
    user = data.get('UserName', 'N/A')
    
    msg = f"⚠️ 警告: 仮想マシン {vm_name} がユーザー {user} によって削除されました!"
    
    token = os.getenv('TELEGRAM_TOKEN')
    chat_id = os.getenv('TELEGRAM_CHAT_ID')
    url = f"https://api.telegram.org/bot{token}/sendMessage"
    
    requests.post(url, data={"chat_id": chat_id, "text": msg})
    return "OK", 200

ステップ4:イベントマップの設定 (stack.yaml)

コードをいつ実行するかを定義する設定ファイルが必要です。ここでは VmRemovedEvent イベントを対象にします。

functions:
  telegram-notifier:
    runtime: python3
    handler: handler
    image: your-docker-hub/telegram-notifier:v1
    environment:
      TELEGRAM_TOKEN: "secret_token_here"
      TELEGRAM_CHAT_ID: "your_id"
    annotations:
      topic: "com.vmware.vsphere.VmRemovedEvent"

kn service apply コマンドを使用して有効化します。これで、VMが削除されるたびに、あなたのスマートフォンに即座に通知が届くようになります。

通知スパムを避けるための運用のコツ

100台以上のHostを抱えるシステムでVEBAを運用した経験から、いくつかの教訓を得ました:

  1. イベントのスマートなフィルタリング: すべてのイベントをキャッチしてはいけません!大規模なシステムでは1時間に10,000件以上のイベントが発生することがあります。ログインログまでキャッチすると、Telegramボットがスパムでフリーズしてしまいます。VmPoweredOffEvent やDatastoreエラーなどのCriticalなエラーに集中しましょう。
  2. 情報のセキュリティ: TelegramのTokenをコード内に直接記述しないでください。VEBAに組み込まれている Kubernetes Secrets を使用して安全に保存しましょう。
  3. Tagによる分類: vSphere Tagsとの組み合わせは非常に有効なテクニックです。「Production」タグが付いたVMのみ通知を送り、「Test」VMの場合は静かにログを記録するだけ、といったプログラムが可能です。

最後に

ITエンジニアの仕事は、ログ画面を監視し続けることではありません。自律的に動作するシステムを構築することに集中すべきです。VEBAは、VMwareインフラをより能動的かつインテリジェントにするための欠かせないピースです。

VEBAを導入してから、月曜の朝に不安を感じることはなくなりました。現在では、ハードウェア障害を検知した際にJiraでチケットを自動作成するまでシステムを拡張しています。vSphereを管理しているなら、ぜひ今日からVEBAを試して、自分自身の労力を解放してください!

Share: