概要
IBM CloudではCloudのメンテナンス通知をメールで受信することができます。一方でオンプレ等の監視にZabbixを利用している方の中には、Cloud通知も一括でZabbixで管理したい方がいるかもしれません。
本記事では、Event Notification・IBM Cloud Functionsを利用し、Cloud通知をZabbixへ転送する方法を記載します。
検証構成
今回は以下の構成で検証しています。
Event Notificationは2022年12月現在、以下のリージョンのみで提供されています。
- ダラス(us-south)
- ロンドン(eu-gb)
- シドニー(au-syd)
- フランクフルト(eu-de)
Zabbix Serverの設定
Zabbix Serverのインストール
こちらに従い「Ubuntu Linux 22.04 LTS」にインストールしました。
Zabbix Server 6.0 を、Ubuntu 20.04にインストール
zabbix trapperの設定
「設定」->「ホスト」を選択し、対象サーバーの「アイテム」をクリックします。
PythonによるZabbixへの転送コード作成
今回はzabbixが提供している「zabbix sender」機能を使用します。zabbix senderは、zabbix server内で作成したzabbix trapperを指定して、希望のデータをpushすることができます。
またコマンドとしても提供されており、yum install zabbix-sender
でインストール可能です。
本記事ではコマンドではなくプログラム内にsenderを組み込み自動化したいので、pythonのpy-zabbixライブラリを用いて、Event Notificationsからzabbixへ転送するコードを書きます。
pythonのバージョンは以下の通りです。
$ python3 --version
Python 3.10.8
以下、転送プログラムです。
functionsでは受信したデータをparam
に格納してmain()
を実行します。
param
はデバッグも考慮して分岐させています。
from pyzabbix import ZabbixMetric, ZabbixSender
HOST = "[zabbix host名]"
KEY = "[zabbixの設定Key名]"
PORT = [zabbixの待ち受けポート] # デフォルトは "10051"
ADDRESS = "[宛先IPアドレス]"
def sendto_zabbix(param):
metrics = []
mtrc = ZabbixMetric(HOST, KEY, param)
metrics.append(mtrc)
zbx = ZabbixSender(ADDRESS)
zbx.send(metrics)
def main(param): # "param"にEvent Notificationsからの転送イベント内容が格納
if param:
sendto_zabbix(param)
return { 'massage': param }
else:
return { 'message': 'No massage' } # Cloud Functionsでのデバグ用
IBM Cloud Functionsの作業
IBM Cloud Functionsの作成
上部タブにて「Event Notifications」で検索、または以下よりオーダーします。
https://cloud.ibm.com/catalog/services/event-notifications
Namespaceを新規作成する場合は、
左タブ「Namespace setting」をクリック -> 上部の" ^ "をクリック -> 「Create Namespace」をクリックします。
コードをIBM Cloud Functionsへアップロード
IBM Cloud Functionsでは、実行コードと一緒に外部パッケージをzip化・アップロードすることで使用することが出来ます。
本記事では、virtualenv を使用してパッケージ化します。 virtualenvを使用すると、 pipを使用してインストールできる追加のパッケージをリンクできます。
※参考
アップロード用コンテナイメージの作成・zip化
dockerイメージをダウンロードします。
$ docker pull ibmfunctions/action-python-v3.9
zip にパッケージ化するための作業ディレクトリを準備し、import したい外部パッケージを requirements.txt にリストで書いておきます。(py-zabbixはpipでインストール可能です。)
$ ls workspace
__main__.py
requirements.txt
$ cat requirements.txt
py-zabbix
virtualenvを作成します。
$ docker run --rm -v "$PWD:/tmp" --entrypoint "/bin/bash" ibmfunctions/action-python-v3.9:latest -c "cd /tmp && virtualenv virtualenv && source virtualenv/bin/activate && pip install -r requirements.txt"
created virtual environment CPython3.9.13.final.0-64 in 40219ms
creator CPython3Posix(dest=/tmp/virtualenv, clear=False, no_vcs_ignore=False, global=False)
seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy, app_data_dir=/root/.local/share/virtualenv)
added seed packages: ZabbixSender==0.2.7, pip==21.3.1, py_zabbix==1.1.7, setuptools==60.2.0, wheel==0.37.1
activators BashActivator,CShellActivator,FishActivator,NushellActivator,PowerShellActivator,PythonActivator
Requirement already satisfied: py-zabbix in ./virtualenv/lib/python3.9/site-packages (from -r requirements.txt (line 1)) (1.1.7)
WARNING: You are using pip version 21.3.1; however, version 22.3.1 is available.
You should consider upgrading via the '/tmp/virtualenv/bin/python -m pip install --upgrade pip' command.
virtualenvとたくさんのpemファイルが作成されます。
$ ls -l
jp419713$ ls -l
total 22456
-rw-r--r-- 1 jp419713 staff 557 Nov 20 13:10 __main__.py
-rw-r--r-- 1 jp419713 staff 10 Nov 20 13:03 requirements.txt
-rw------- 1 jp419713 staff 259465 Nov 18 23:08 tmp1cxl01kgcacert.pem
-rw------- 1 jp419713 staff 259465 Nov 18 23:08 tmp43ze4fdocacert.pem
.
.
.
-rw------- 1 jp419713 staff 259465 Nov 18 23:08 tmpvyopq50bcacert.pem
-rw------- 1 jp419713 staff 259465 Nov 18 23:08 tmpxzg8gn1tcacert.pem
drwxr-xr-x 6 jp419713 staff 192 Nov 18 22:51 virtualenv
virtualenvとコードをzip化します。
zip -r zabbix.zip virtualenv __main__.py
IBM Cloudへアップロード
$ ibmcloud login -apikey xxxxxx -r jp-tok
$ ibmcloud plugin install cloud-functions
$ ibmcloud fn namespace target Namespace-test
$ ibmcloud fn action create sendto-zabbix [ファイルパス]/zabbix.zip --kind python:3.9
作成されたことをIBM Cloudポータルで確認します。
「Functions」->「Action」をクリックします。
アップロードしたパッケージを選択すると以下のような画面になるので、左メニューの「Endpoints」をクリックします。
「Endpoints」記載のREST APIをコピーしておきます。(Event Notificationsで使用します)
Event NotificationsからIBM Cloud Functionsへのアクセス許可
IBM Cloud Functionsへのアクセスが許可されたAPI Keyを発行します。後の手順でEvent Notificationsへ登録することでイベントの転送を許可します。
初めに、IBM Cloudポータルホーム画面から「管理」->「アクセス (IAM)」に移動します。
「Service IDs」を選択して「Create」をクリックします。
名前空間を作成します。
(どのサービスに対してのアクセスを管理するのか分かれば大丈夫です)
作成が完了するとService ID詳細画面に移ります。
続いてアクセス権限を設定するため、「Assign Access」をクリックします。
以下のように権限設定しました。設定後、「Add」->「Assign」をクリックします。
- Service:Functions
- Resource:All
- (「Specific Resource」->「Service Instance」で特定のNamespaceのみ指定可能です)
- Role and actions:全て
続いて「API Keys」タブを選択し、「Create」をクリックします。
API keyが表示されますが、表示は一度きりなのでダウンロードしておきます。
(後でEvent Notificationsの設定で使用します)
Event Notificationsの設定
Event Notificationsの作成
上部タブにて「Event Notifications」で検索、または以下よりオーダーします。
https://cloud.ibm.com/catalog/services/event-notifications
private経由で管理する必要がある場合はService Endpoints
にて「Both public & private network」を選択します。そのほかの注意事項は以下を参照ください。
https://cloud.ibm.com/docs/event-notifications?topic=event-notifications-en-regions-endpoints#en-service-endpoints
Event Notificationsでのイベント転送設定
source の設定
イベントのソースを指定します。
作成したEvent Notificaitons画面に移動し、「source」タブを選択します。
「Add」->「IBM Cloud Source」をクリックします。
「Platform Notifications for IBM Cloud」の「View configuration」をクリックします。!
「Notification distribution list」ページに飛ぶので、「Add」->「Event Notificaitons」を選択します。
作成したEvent Notificaitonsリソースを選択し、「Add」をクリックします。
Destinationの設定
イベントの送信先を指定します。
作成したEvent Notificaitons画面にて、「Destinations」タブを選択します。デフォルトでSMSとEMailのチャネルが作成されます。編集することで特定のSMS/Emailへの転送が可能です。
「Add」をクリックします。
「Name」と先ほどコピーしたFunctionsの「REST API」と「APIキー」を入力します。
Topicsの設定
Topicsでは、発生したイベントの中で特定のイベントのみを転送したい場合のフィルタを定義します。
Event Notificaitons画面の「Topics」タブを選択し、「Create」をクリックします。
「name」を入力して「Create」をクリックします。
optionでは、特定の"イベント・タイプ"や"重大度"に制限することが出来ます。
Subscriotionsの設定
「Subscriptions」タブを選択して「Create」をクリックします。
これまで作成した"Topic"と"Destination"を選択、「Create」をクリックします。