BFT名古屋 TECH BLOG

日々の業務で得た知識を所属するエンジニアたちがアウトプットしていきます。

【Zabbix】Zabbix SenderでAWS EC2のリソースを監視する。

はじめに

こんにちは。BFT名古屋支店のマッチです。今回はAWS EC2のリソース監視をZabbix Senderを用いて実施する手順について解説します。Zabbixマネージャの構築やAWS上での使用については以前投稿した記事にもまとめているので、こちらも併せてご参照ください。

bftnagoya.hateblo.jp

bftnagoya.hateblo.jp

bftnagoya.hateblo.jp


前提

  • Zabbixマネージャーの構築と初期設定が完了していること
  • Zabbixマネージャーと監視対象サーバを構築するEC2のOSはAmazon Linux 2とする

使用するAWSサービス

今回使用するAWSサービスは以下の通りです。

  • EC2:Zabbixマネージャーと監視対象サーバの構築に使用します。
  • CloudWatch Agent:監視対象サーバに導入し、リソース情報をCloudWatchへと送付します。
  • CloudWatch Alarm:CloudWatchが収集した監視情報を基に特定の条件でアラームを飛ばします。
  • Amazon SNS:CloudWatch Alarmの通知を受け取り、Lambdaへと送信します。
  • Lambda:Zabbix Senderのコードを導入し、Zabbixマネージャへ通知メッセージを送付します。

システム構成図

今回構築する環境の構成図は以下のようなものです。監視対象インスタンスから送られるリソース情報がアラームの条件を満たすとCloudWatch AlarmからSNS経由でLambdaが起動し、Zabbix用インスタンスにメッセージが出力されます。

f:id:bftnagoya:20210819112717j:plain


CloudWatch Agentの導入

監視対象となるEC2インスタンスにCloudWatch Agentを導入します。導入手順については、以下の記事をご参照ください。


Zabbixマネージャーの設定


http://[ZabbixマネージャーのIP]/zabbix からZabbixマネージャーにアクセスし、ホスト、アイテム、トリガーを設定します。

ホストの設定

①[設定]→[ホスト]→[ホストの作成]をクリックする。

②以下の値を設定する。
ホスト名:Zabbix Senderで指定するものと同様
グループ:任意の名前

アイテムの設定

①[設定]→[ホスト]から先程設定したホストの[アイテム]を選択する。

②[アイテムの作成]を選択する。

③以下の値を設定する。
名前:任意の名前
タイプ:Zabbixトラッパー
キー:Zabbix Senderで指定するものと同様
データ型:文字列

トリガーの設定

①[設定]→[ホスト]から先程設定したホストの[トリガー]を選択する。

②[トリガーの作成]を選択する。

③以下の値を設定する。
名前:任意の名前
深刻度:監視要件に応じて選択
条件式:以下のような形式で条件式を記載

{<server>:<key>.<function>(<parameter>)}<operator><constant>

条件式の書き方について詳細は以下を参照

www.zabbix.com


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のソースコードは以下のものを使用しています。

github.com

[コード]-[コードソース]内に以下のようなフォルダ構成でコードを作成します。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関連の記事も冒頭で紹介していますので、そちらも見ていただくとより理解が深まるかと思います。