はじめに
こんにちは。BFT名古屋支店のマッチです。今回はAWS Lambdaを使って、ZabbixのコマンドラインツールであるZabbix Senderを動かしてみたので、手順をまとめてみました。
前提
- Zabbixサーバーの構築と初期設定が完了していること
- LambdaのランタイムはPython3.6を使用する
Zabbixマネージャーの設定
http://[ZabbixマネージャーのIP]/zabbix からZabbixマネージャーにアクセスし、ホスト、アイテム、トリガーを設定します。
ホストの設定
①[設定]→[ホスト]→[ホストの作成]をクリックする。
②以下の値を設定する。
ホスト名:Zabbix Senderで指定するものと同様
グループ:任意の名前
アイテムの設定
①[設定]→[ホスト]から先程設定したホストの[アイテム]を選択する。
②[アイテムの作成]を選択する。
③以下の値を設定する。
名前:任意の名前
タイプ:Zabbixトラッパー
キー:Zabbix Senderで指定するものと同様
データ型:文字列
トリガーの設定
①[設定]→[ホスト]から先程設定したホストの[トリガー]を選択する。
②[トリガーの作成]を選択する。
③以下の値を設定する。
名前:任意の名前
深刻度:監視要件に応じて選択
条件式:以下のような形式で条件式を記載
{<server>:<key>.<function>(<parameter>)}<operator><constant>
条件式の書き方について詳細は以下を参照
Lambdaの設定
Zabbix Senderを実行するLambda関数を設定します。
関数の作成
①AWS マネジメントコンソールから[AWS Lambda]-[関数の作成]を選択する。
②以下の値を設定する。
関数名:任意の名前
ランタイム:Python 3.6
実行ロール:ZabbixサーバとCloud Watchへのアクセス権を持ったロールを選ぶ
VPC:実行環境に合わせて設定する
③[コード]-[ランタイム設定]-[編集]で以下の値を設定する。
ハンドラ:handler.sender
④[設定]-[環境変数]-[編集]で「キー = 値」を以下のように設定する。
ZBX_SERVER = <ZabbixサーバのIPアドレス>
ZBX_HOST = <Zabbixマネージャーのホスト名と同様>
ZBX_ITEM = <Zabbixマネージャーの[アイテム]-[キー]と同様>
⑤[トリガーを追加」で以下のように設定する。
トリガー:CloudWatch Logs
ロググループ:監視対象のリソース
フィルターの名前:任意の名前
フィルターパターン:監視するログのキーワード
コードの実装
Python3.6用のZabbix Senderのソースコードは以下のものを使用しています。
[コード]-[コードソース]内に以下のようなフォルダ構成でコードを作成します。handler.py以外のファイルについては、上記のソースコードを使用します。
├── handler.py └── zappix ├──__init__.py ├──agent_active.py ├──dstream.py ├──get.py ├──protocol.py └──sender.py
handler.pyは以下のように記載します。 - handler.py
from zappix.sender import Sender ZBX_SERVER = os.environ['ZBX_SERVER'] ZBX_HOST = os.environ['ZBX_HOST'] ZBX_ITEM = os.environ['ZBX_ITEM'] def sender(event, context): sender = Sender(ZBX_SERVER) sender.send_value(ZBX_HOST, ZBX_ITEM, 1)
Zabbix Senderの動作確認
環境構築が完了したため、Zabbix Senderの動作確認を行います。
①監視対象のリソースでエラーを発生させる。
②Cloud WatchでZabbix SenderのLambda関数のログを確認し、関数が動いていることを確認する。
③Zabbixマネージャーにログインし、[監視データ]-[最新データ]を開く。
④「ホストグループ」、「ホスト」を選択して絞り込みを行い、[ヒストリ]をクリックして通知が届いていることを確認する。
まとめ
今回はAWS LambdaでのZabbix Senderの実施方法について解説しました。しかし、今回はZabbixへの通知やCloudWatchのログについては最小限の出力しか行っていません。次回以降の記事では通知やログの出力方法について解説していく予定です。