Zabbix5でCloudWatch監視設定(EC2インスタンス)

AWS CloudWatchに登録されているEC2インスタンスをZabbix監視

EC2インスタンスにZabbixエージェントのインストールが行えなかったり、SNMP設定が実施出来ないなどの設定変更に制限がある場合があり、それでも監視しなければいけない状況があります。その場合、Zabbixサイト「AWS監視テンプレート」に記載されている「CloudWatchのメトリック値を利用してZabbix監視する方法」が有効です。しかし、その記事では使用しているバージョンが古く、現時点で一番サポートが長い「Zabbix 5」では動作しないため、前記事「AWS AmazonLinuxへのZabbixインストール」で構築したZabbix5環境での構築方法を以下記載します。

設定項目

  • IAMロール設定
  • Zabbixサーバーのconfig設定
  • Python環境設定
  • Pythonファイル修正
  • zabbixテンプレート設定
  • zabbixホスト設定

IAMロール設定

EC2インスタンスがCloudWatchへアクセス出来るようにIAMロール設定します。

  1. 「Identity and Access Management(IAM)」を開き「ロール」をクリックします。
  2. 画面右上の「ロールを作成」をクリックします。
  3. 「EC2」を選択し「次のステップ:アクセス権限」をクリックします。IAM role 設定
  4. 「CloudWatchReadOnlyAccess」を選択(チェック)し「次のステップ:タグ」をクリックします。IAM role 設定 policy
  5. 任意のタグを入力し(未記入でも問題なし)、「次のステップ:確認」をクリックします。
  6. ロール名を入力し「ロールの作成」をクリックします。IAM role 設定 作成
  7. EC2インスタンス画面で対象インスタンスをクリックします。
  8. 「アクション」-「セキュリティ」-「IAMロールを変更」をクリックします。EC2ロール設定
  9. 先ほど作成したIAMロールを選択し「保存」をクリックします。IAM role 設定 policy
  10. 早くインスタンスへIAMロールを適用したい場合は、再起動してIAMロールを適用します。

Zabbixサーバーのconfig設定

ZabbixよりCloudWatchへの値取得に時間がかかるため、以下のコマンドでZabbixサーバーのconfigに記載されているTimeout値を変更します。

vi /etc/zabbix/zabbix_server.conf

デフォルトでは482行目の「Timeout」値を「30」秒に変更します。

### Option: Timeout
# Specifies how long we wait for agent, SNMP device or external check (in seconds).
#
# Mandatory: no
# Range: 1-30
# Default:
# Timeout=3

Timeout=30

Python環境設定

本記事作成時点のAmazonLinux上ではPython2.7とPython3.7がインストールされていますが、Python2はサポート終了ということで、Python3での環境設定を記載します。

  1. PythonファイルをPython2よりPython3へ変換するツールをインストールするため、以下のコマンドを実行します。
    yum install 2to3
  2. 以下のコマンドを実行し、Pythonファイルを実行出来るようにするためのモジュールをインストールします。
    pip3 install boto3
    pip3 install feedparser

Pythonファイル修正

上記Zabbixサイトの仕組みはCloudWatchから値を取得するため、PythonファイルをZabbixで実行し値を取得する仕組みとなり、githubサイトのPythonファイルを利用しますが、Python3用ではないため、実行出来るよう修正します。

  1. 以下のgithubサイトよりPythonファイルを入手し、以下の場所に保存します。
    githubサイト<https://github.com/tech-sketch/zabbix_aws_template/blob/master/scripts/cloudwatch_zabbix.py>

    保存場所
    /usr/lib/zabbix/externalscripts/
  2. Zabbixからのファイル実行はzabbixユーザーが実行するため、以下のコマンドを実行し、ファイルのオーナーや権限を変更します。
    chown zabbix:zabbix cloudwatch_zabbix.py
    chmod 755 cloudwatch_zabbix.py
  3. 入手したPythonファイルをPython3用に変換するため、以下のコマンドを実行します。
    2to3 -w cloudwatch_zabbix.py
  4. PythonファイルをPython3で実行出来るように、先頭行のShebangを修正します。また、変換だけではプログラム内で値を渡せずエラーとなるため、文字コード指定するよう、行頭の箇所 1行名、173行目より175行目、186行目を修正します。
    vi cloudwatch_zabbix.py

    <1行目修正前>

    #!/bin/env python

    <1行目修正後>

    #!/usr/bin/env python3

    <173~175行目修正前>※173行目空白行

    
    header = struct.pack('<4sBQ', 'ZBXD', 1, len(send_data_string))
    send_data_string = header + send_data_string
    

    <173~175行目修正後>

    b1, b2 = ('<4sBQ'.encode('utf-8'), 'ZBXD'.encode('utf-8'))
    header = struct.pack(b1, b2, 1, len(send_data_string))
    send_data_string = header + send_data_string.encode('utf-8')

    <186行目修正前>

    response += data

    <186行目修正後>

    response += data.decode(encoding='utf-8')
  5. 「cloudwatch_zabbix.py」実行時に以下のファイル「parser.py」も使用します。しかし、こちらも値を渡せずエラーとなるため、文字コード指定するよう110行目の行末に追記します。
    vi /usr/lib64/python3.7/html/parser.py

    <110行目修正前>

    self.rawdata = self.rawdata + data

    <110行目修正後>

    self.rawdata = self.rawdata + data.decode(encoding='utf-8')

Zabbixテンプレート設定

上記Zabbixサイトのリンクにもある以下のgithubサイトにZabbixテンプレートがあり、IAMユーザーのアクセスキーとシークレットアクセスキーを使用して値を取得するキーとなってます。本記事では、上記でIAMロールでインスタンスよりCloudWatchへのアクセス許可設定しているのでIAMユーザー設定は不要になり、ディスカバリルールとアイテムのキー値の『”-a”,{$KEY},”-s”,{$SECRET},』も不要になるため、削除します。

  1. 以下のgithubサイトよりZabbixテンプレートを入手します。
    githubサイト<https://github.com/tech-sketch/zabbix_aws_template/blob/master/templates/3.0/cloudwatch_template.xml>
  2. Zabbix Web UIへログインし、左ペイン「レポート」-「テンプレート」をクリックしテンプレート一覧を表示します。
  3. 画面右上「インポート」をクリックします。Zabbixテンプレート一覧
  4. 「参照」ボタンより入手したZabbixテンプレートを選択し「インポート」をクリックします。Zabbixテンプレート インポートインポートに成功すると以下のメッセージが表示されます。Zabbixテンプレート インポート成功メッセージ
  5. テンプレート画面に戻り、インポートされたことを確認します。
  6. テンプレート一覧画面にて、各テンプレートの「ディスカバリ」をクリックします。(画像はEC2インスタンステンプレート修正例)Zabbix cloudwatchテンプレート一覧
  7. ディスカバリルールの名前をクリックします。(画像はEC2インスタンステンプレート修正例)zabbix テンプレート ディスカバリ 名前
  8. キー値より『”-a”,{$KEY},”-s”,{$SECRET},』を削除し「更新」をクリックします。
    設定前(画像はEC2インスタンステンプレート ディスカバリルールの修正例)Zabbixテンプレート ディスカバリルール編集設定後(画像はEC2インスタンステンプレート ディスカバリルールの修正例)Zabbixテンプレート ディスカバリルール編集
  9. 次に、テンプレート一覧画面にて各テンプレートの「アイテム」をクリックします。(画像はEC2インスタンステンプレート修正例)Zabbix cloudwatchテンプレート一覧
  10. アイテムの名前をクリックします。(画像はEC2インスタンステンプレート修正例)Zabbixテンプレート アイテム一覧
  11. キー値より『”-a”,{$KEY},”-s”,{$SECRET},』を削除し「更新」をクリックします。
    設定前(画像はEC2インスタンステンプレート アイテムの修正例)Zabbixテンプレート アイテム編集設定後(画像はEC2インスタンステンプレート アイテムの修正例)Zabbixテンプレート アイテム編集
  12. 他のテンプレート(EBS、ELB、RDS)も同様にキーを設定変更します。

EC2インスタンス監視設定

以下の手順でEC2インスタンスの監視設定します。注意点はテンプレート設定上、ホスト名にインスタンスIDを記載します。インターフェースは設定不要になります。

  1. 左ペインの「設定」-「ホスト」をクリックしホスト一覧を表示します。
  2. 画面右上「ホストの作成」をクリックします。Zabbixホスト一覧
  3. 「ホスト」タブでは、以下を入力します。
    ホスト名:インスタンスID
    表示名:わかりやすい表示名など(入力しない場合は「ホスト名」で記載されたインスタンスIDが表示されます)
    グループ:任意のグループを指定Zabbix ホスト追加
  4. 「テンプレート」タブでは、上記のテンプレートを「選択」をクリックし選択します。Zabbixホスト追加 テンプレート指定
  5. 「マクロ」タブでは、マクロ欄に「{$REGION}」と入力し、値にはインスタンスのリージョンを記載します。Zabbixホスト追加マクロ
  6. 各タブの記載内容に問題なければ「追加」をクリックし、監視ホストを追加します。
  7. ホスト一覧より、追加されたことを確認します。
    ※しばらくするとディスカバリルールが実行されアイテム数が増加します。

 

以上、CloudWatchに登録されているEC2インスタンスのZabbix監視設定の完了となります。

 

投稿者プロフィール

たむ
たむ
<インフラエンジニア>
■ こんにちは!こんばんわ!「たむ」と申します。製造業からITへ転職し、インフラ、主にサーバ関連をやってきました。IT関連の学校を卒業していませんが、なんとか、サーバ技術者やってます。あっはぃ・・・

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です