はじめに
こんにちは。BFT名古屋支店のマッチです。今回はAWS EC2のリソース監視をZabbix Senderを用いて実施する手順について解説します。Zabbixマネージャの構築やAWS上での使用については以前投稿した記事にもまとめているので、こちらも併せてご参照ください。
前提
使用するAWSサービス
今回使用するAWSサービスは以下の通りです。
- EC2:Zabbixマネージャーと監視対象サーバの構築に使用します。
- CloudWatch Agent:監視対象サーバに導入し、リソース情報をCloudWatchへと送付します。
- CloudWatch Alarm:CloudWatchが収集した監視情報を基に特定の条件でアラームを飛ばします。
- Amazon SNS:CloudWatch Alarmの通知を受け取り、Lambdaへと送信します。
- Lambda:Zabbix Senderのコードを導入し、Zabbixマネージャへ通知メッセージを送付します。
システム構成図
今回構築する環境の構成図は以下のようなものです。監視対象インスタンスから送られるリソース情報がアラームの条件を満たすとCloudWatch AlarmからSNS経由でLambdaが起動し、Zabbix用インスタンスにメッセージが出力されます。
CloudWatch Agentの導入
監視対象となるEC2インスタンスにCloudWatch Agentを導入します。導入手順については、以下の記事をご参照ください。
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マネージャーの[アイテム]-[キー]と同様>
※トリガーは現時点ではまだ設定しません。
コードの実装
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 __future__ import print_function import os import json from zappix.sender import Sender import logging ZBX_SERVER = os.environ['ZBX_SERVER'] ZBX_HOST = os.environ['ZBX_HOST'] ZBX_ITEM = os.environ['ZBX_ITEM'] logger = logging.getLogger() logger.setLevel(logging.INFO) def sender(event, context): message_tmp = event['Records'] message_new = (json.dumps(message_tmp)) sns_list = (message_new.split(',')) s1 = (sns_list[8]) s2 = (sns_list[11]) s3 = (sns_list[12]) s4 = (sns_list[13]) message = s1 + ' ' + s2 + ' ' + s3 + ' ' + s4 try: sender = Sender(ZBX_SERVER) sender.send_value(ZBX_HOST, ZBX_ITEM, message) logger.info("Execution Succeeded.") except Exception as e: logger.error(e) raise(e)
SNSの作成
CloudWatch Alermからの通知をLambdaに送るためのSNSを作成します。
トピックの作成
①AWSマネジメントコンソールから[Simple Notification Service]-[トピック]を選び、[トピックの作成]をクリックする。
②以下の値を設定し、[トピックの作成]をクリックする。
タイプ:スタンダード
名前:任意の名前
サブスクリプションの作成
①作成したトピックから[サブスクリプションの作成]をクリックする。
②以下の値を設定し、[サブスクリプションの作成]をクリックする。
トピックARN:先程作成したトピックのARN
プロトコル:AWS Lambda
エンドポイント:先程作成したLambda関数のARN
CloudWatch Alermの作成
CloudWatch Alermを作成し、監視対象のメトリクスとアラームの条件を設定する。
①AWSマネジメントコンソールから[CloudWatch]-[すべてのアラーム]を選び、[アラームの作成]をクリックする。
②[メトリクスの選択]-[EC2]-[インスタンス別メトリクス]を選択し、監視対象インスタンスの必要なメトリクスを選択し、[メトリクスの選択]をクリックする。
③以下の値を設定し、[次へ]をクリックする。
統計:メトリクスの統計方法を指定する
期間:監視間隔を設定する
しきい値の種類:静的
次の時...、...よりも:しきい値の条件を指定する
④以下の値を設定し、[次へ]をクリックする。
アラーム状態トリガー:アラーム状態
SNSトピックの追加:既存のSNSトピックを選択
通知の送信先:先程作成したSNSトピックを選択する
⑤以下の値を設定し、[次へ]をクリックする。
アラーム名:任意の名前
アラームの説明:任意の説明
⑥設定値を確認し、[アラームの作成]をクリックする。
動作確認
構築作業が完了したため、動作確認を行います。以下の手順はCPU使用率が一定値を超えた場合にアラームが飛ぶようにCloudWatch Alarmを設定した場合のものです。
①以下のコマンドを実行し、CPUに負荷をかける。
$ yes > /dev/null
②CloudWatch AlarmでCPU使用率が設定した閾値を超えていることと、SNSにメッセージが送信されていることを確認する。
③CloudWatch LogsにてLambda関数が実行され、リソース情報をZabbixマネージャに送信していることを確認する。
④Zabbixマネージャーにログインし、[監視データ]-[最新データ]を開く。
⑤「ホストグループ」、「ホスト」を選択して絞り込みを行い、[ヒストリ]をクリックして通知が届いていることを確認する。
まとめ
以上がZabbix Senderを用いてEC2のリソース監視を行うまでの手順となります。エラーログ監視の手順など、他のZabbix関連の記事も冒頭で紹介していますので、そちらも見ていただくとより理解が深まるかと思います。