クラウド運用管理

ZabbixでAWSを監視する方法 ~外部チェック利用時のTips編~

オンプレミスのクラウド化に伴い、特に豊富な導入事例を持つAmazon Web Services(アマゾン ウェブ サービス、以降AWSと略す)への移行を目指す企業が増加しています。
AWS上に構築したシステムの監視に用いられるツールとして、AWSが提供する監視サービスである「Amazon CloudWatch(アマゾン クラウドウォッチ、以降CloudWatchと略す)」が有名ですが、既存の運用オペレーションを活用するために、オンプレミスで使っていた監視ツールをそのまま継続利用するケースも多いかと思います。しかしながら、既存の監視ツールでAWSを監視するには困難なことも多いです。
そこで、本記事では、オンプレミスの監視でメジャーな「Zabbix(ザビックス)」を既存の監視ツールとして取り上げ、Zabbixエージェントでは監視ができないSaaSやPaaSも監視可能にする方法として、

  • Zabbixの外部チェック機能を用いたAWSの監視方法

についてご紹介します。
なお、本タイトルは2本立てとなっており、今回は「外部チェック利用時のTips編」です。ZabbixでAWSを監視する方法の概要については「ZabbixでAWSを監視する方法 ~メリット・デメリット解説編~」で解説します。

本記事はこんな方にお勧めします

  • Zabbixの外部チェックを使ってみたい
  • スクラッチ開発のTipsを知りたい
  • ご注意
    本記事では、Zabbixの外部チェック機能を用いた解説に必要なShellおよびPythonを利用したスクリプトが登場します。ShellおよびPythonの文法に関する解説は専門の書籍やウェブページなどをご覧ください。

1. 外部チェックの基本的な使い方

Zabbixの外部チェック機能を利用して、AWSを監視する方法についてご紹介します。なお、本記事ではZabbixのv5.0.26を利用した解説を行っております。バージョンの差異によって操作に多少の違いが発生する可能性がありますが、あらかじめご了承ください。

外部チェックとは

外部チェックは、Zabbixの監視アイテムにおける1つのタイプで、Zabbixサーバーがシェルスクリプトやバイナリーといった任意のコマンドを実行し、コマンドが出力した結果を監視アイテムの値として使用することができる機能です。外部チェックでは、Zabbixサーバーが定期的にコマンドを実行することで監視を行うため、監視対象の機器やサービスにZabbixエージェントを導入する必要がありません。

Zabbixサーバーがシェルスクリプトやバイナリーといった任意のコマンドを実行して監視

簡単なスクリプトによる利用例

外部チェック用のスクリプトを作成する

外部チェックで実行させるスクリプトを作成します。今回は簡単な例として、hostnameコマンドの実行結果を返すShellスクリプトを、hostname.shという名前で作成します。

#!/bin/bash

echo `hostname`

外部チェック用のスクリプトを配置する

作成したスクリプトは、externalscriptsディレクトリーの下に配置する必要があります。作成したhostname.shを配置します。
なお、externalscriptsディレクトリーのパスは、デフォルトでは/usr/lib/zabbix/externalscripts/となりますが、/etc/zabbix/zabbix_server.conf内の設定で変更することができます。
本記事では、ディレクトリーパスは/usr/lib/zabbix/externalscripts/として説明します。

$ mv hostname.sh /usr/lib/zabbix/externalscripts/

また、Zabbixはデフォルトでzabbixユーザーでスクリプトを実行するため、zabbixユーザーに権限を与える必要があります。以下のコマンドを実行して、スクリプトの実行権限を与えます。

$ chown zabbix:zabbix /usr/lib/zabbix/externalscripts/hostname.sh
$ chmod 500 /usr/lib/zabbix/externalscripts/hostname.sh
$ ls -l /usr/lib/zabbix/externalscripts/
合計 4
-r-x------ 1 zabbix zabbix 29  8月  8 18:11 hostname.sh

スクリプトを実行する監視アイテムを作成する

スクリプトを実行するZabbixの監視アイテムを作成します。

  1. 「設定」メニューから「ホスト」を選択して開いた画面で、「ホストの作成」をクリックします。

    「ホストの作成」をクリック

  2. 「ホスト名」と「グループ」を設定して、「追加」をクリックします。

    • ホスト名:任意
    • グループ:任意

    「ホスト名」と「グループ」を設定して「追加」をクリック

  3. ホストが追加されたら、「アイテム」をクリックします。

    追加されたのを確認して「アイテム」をクリック

  4. 「アイテムの作成」をクリックします。

    「アイテムの作成」をクリック

  5. 「名前」、「タイプ」、「キー」、「データ型」を設定して、「追加」をクリックします。

    • 名前:任意
    • タイプ:外部チェック
    • キー:hostname.sh[]
    • データ型:文字列

    「名前 / タイプ / キー / データ型」を入力して「追加」をクリック

  6. これで監視アイテムが追加されました。

    監視アイテムが追加されたのを確認

監視アイテムの値を確認する

外部チェックにより取得されるデータを確認します。

  1. 「監視データ」メニューから「最新データ」を選択して開いた画面で、上記で作成したホストを選び、「適用」をクリックします。

    作成したホストを選んで「適用」をクリック

  2. hostnameコマンドの実行結果が取得できています。今回の例では、Zabbixサーバー上でhostnameコマンドを実行した結果として、「zabbix-server」という文字列が取得できました。

    hostnameコマンドの実行結果を確認

ここまでが、外部チェックの基本的な使い方です。

2. 外部チェックでAWSを監視する方法

それでは、外部チェックを使ったAWSの監視を試してみましょう。考え方は、「スクリプト内でAWSのAPIを実行し、監視したいデータを取得する」です。

AWSを監視する場合はスクリプト内でAWSのAPIを実行して監視したいデータを取得

事前準備

本記事では、Pythonを使用したスクリプトを作成します。PythonでAWSのAPIを実行するために必要なライブラリー(boto3)をインストールします。

$ python3 -V
Python 3.8.12
$ pip3 install boto3

$ pip3 list --format=columns | grep boto3
boto3           1.24.47

スクリプトの作成から配置・確認までの一連の流れ

スクリプトを作成する

AWSを監視するスクリプトの例として、指定したAmazon EC2(以降、EC2と略す)インスタンスの起動状態(pending、running、 terminatedなど)を取得するスクリプトを作成します。下記のスクリプトを、aws_ec2.pyという名前で作成します。

  • 備考
    HTTP_PROXY、HTTPS_PROXYは、プロキシー下で動作させる場合など、必要に応じて設定します。
#!/bin/env python3

import sys
from argparse import ArgumentParser
import boto3
from botocore.client import Config


class AWS(object):

    # 必要に応じて設定 例:http://user:password@proxy.example.com:port
    HTTP_PROXY=""
    HTTPS_PROXY=""

    def __init__(self, service, access_key, secret_key, region):
        try:
            self.access_key = access_key
            self.secret_key = secret_key
            self.region = region

            # プロキシー経由でAWSのAPIにアクセスする場合
            proxy_definitions = {
                'http': AWS.HTTP_PROXY,
                'https': AWS.HTTPS_PROXY
            }
            self.config = Config(
                proxies=proxy_definitions,
            )

            # AWS APIのクライアントを作成
            self.client = boto3.client(service, aws_access_key_id=self.access_key,
                                       aws_secret_access_key=self.secret_key, region_name=self.region, config=self.config)

        except Exception:
            raise
        
    def GetClient(self):
        if hasattr(self, "client") and self.client:
            return self.client
        else:
            return None


if __name__ == '__main__':
    try:
        # 引数の取得
        parser = ArgumentParser()

        parser.add_argument('access_key')
        parser.add_argument('secret_key')
        parser.add_argument('region')
        parser.add_argument('instance_id')

        args = parser.parse_args()
        
        client = AWS("ec2", args.access_key, args.secret_key, args.region).GetClient()

        if client is not None:
            # 指定したインスタンスIDのEC2インスタンスの状態を取得
            resp = client.describe_instance_status(InstanceIds=[args.instance_id], IncludeAllInstances=True)
            
            print(resp['InstanceStatuses'][0]['InstanceState']['Name'])

        sys.exit(0)

    except Exception as e:
        print(e)
        sys.exit(1)

このスクリプトは、引数に、AWSのAPIを実行するためのキー情報(アクセスキー・シークレットキー)とリージョン、EC2インスタンスのIDを渡して実行することで、該当するEC2インスタンスの起動状態を出力します。

  • 備考
    本記事では、説明の都合上、AWSへの接続方法としてアクセスキー・シークレットキーを用いていますが、セキュリティの観点からAWS Identity and Access Management(IAM)ロールの利用など別の接続方法を推奨します。

スクリプトを配置する

外部チェック用のスクリプトを配置する」と同様に、作成したスクリプトを指定ディレクトリーに配置します。

$ mv aws_ec2.py /usr/lib/zabbix/externalscripts/

スクリプトの実行権限も同様にzabbixユーザーに与えます。

$ chown zabbix:zabbix /usr/lib/zabbix/externalscripts/aws_ec2.py
$ chmod 500 /usr/lib/zabbix/externalscripts/aws_ec2.py

監視アイテムを作成する

スクリプトを実行する監視アイテムを作成する」と同様に、監視アイテムを作成します。

  1. ホストを作成します。

    • ホスト名:任意
    • グループ:任意

    ホスト名の入力とグループを選択して「追加」をクリック

  2. アイテムを作成します。

    • 名前:任意
    • タイプ:外部チェック
    • キー:aws_ec2.py["アクセスキー","シークレットキー","リージョン","インスタンスID"]
      • ご注意
        引数は正しいものに置き換えてください
    • データ型:文字列

    名前とキーを入力しタイプとデータ型を選択して「追加」をクリック

監視アイテムの値を確認する

  1. 「監視データ」メニューから「最新データ」を選択して開いた画面で、上記で作成したホストを選び、「適用」をクリックします。EC2インスタンスの起動状態(今回の例では「runnning」)が取得できています。

    ホストを選び「適用」をクリックして監視アイテムの値を確認

起動状態の変化を通知する

EC2インスタンスの起動状態が「stopped」になった場合に通知するようにします。

  1. 作成したホストの「トリガー」をクリックします。

    作成したホストの「トリガー」をクリック

  2. 「トリガーの作成」をクリックします。

    「トリガーの作成」をクリック

  3. 「名前」、「深刻度」を設定します。「条件式」の「追加」ボタンをクリックします。

    • 名前:任意
    • 深刻度:任意

    「名前 / 深刻度」を設定して「条件式」の「追加」ボタンをクリック

  4. トリガー条件式の「アイテム」、「関数」、「V」、「結果」を設定し、「挿入」をクリックします。

    • アイテム:上記で作成したアイテム
    • 関数:regexp()
    • V:stopped
    • 結果:= 1

    「アイテム / 関数 / V / 結果」を設定して「挿入」をクリック

  5. 「追加」をクリックします。

    「追加」をクリック

通知を確認する

該当するEC2インスタンスを停止した後、以下の手順で確認します。

  1. 「監視データ」メニューから「障害」を選択して開いた画面で、起動状態の変化が通知されていることを確認します。

    起動状態の変化が通知されていることを確認

  2. 「監視データ」メニューから「最新データ」を選択して画面で、EC2インスタンスの起動状態が「stopped」になっていることを確認します。

    EC2インスタンスの起動状態が「stopped」になっていることを確認

以上で、外部チェックを使ったAWSの監視ができました。
今回は、EC2インスタンスの起動状態の監視という簡単な例でご説明しましたが、AWSのAPIとZabbixを連携して監視を行うための基本的な手法をご理解いただけたかと思います。この手法を応用すれば、CloudWatchの監視メトリクスをAPIで取得し、Zabbixで監視することも可能です。

3. 外部チェックによるAWS監視の注意点

ここまでで、外部チェックを使ったAWS監視の手法を簡単に説明しましたが、実用に際しては、下記の事柄に注意する必要があります。

  • AWS側の仕様変更への追随が必要
  • AWSの新たなサービスを利用・監視したい場合に、スクリプトの改修が必要
  • プログラミング知識や実装工数が必要

詳細は「ZabbixでAWSを監視する方法 ~メリット・デメリット解説編~」の「外部チェックによるAWS監視の注意点」をご覧ください。

4. まとめ

本記事では、

  • Zabbixの外部チェック機能を用いたAWSの監視方法

について紹介しました。AWSの監視ツール・監視方式の検討、Zabbix監視の実践等に役立てていただければ幸いです。また、富士通では「Systemwalker Centric Manager Open監視強化テンプレート」を提供しています。
本製品は、

  • Zabbixを内包しており、Zabbixを使い慣れた方であれば簡単に利用できます。
  • AWS監視のためのスクリプトを提供しているためスクラッチ開発は不要です。
  • 当社がサポートすることでAWSの仕様変更やサービス追加にも対応します。さきほど過去の実例とした挙げたAmazon リソースネーム(ARN)形式の変更があった際も当社で対応しました。

こちらもぜひ、ご検討ください。

こちらもおすすめ

日々のビジネスに欠かせないICTインフラを、いかに安心かつ安全、効率的に運用するかは、今後のビジネスの成長を左右します。DXやクラウド導入により、ICTインフラが変化する今、運用を見直すチャンスです。

「Systemwalker Centric Manager」を導入すれば、クラウド監視サービスと連携できるので、IaaS / PaaS / オンプレミスの一元監視が可能です。拡張・変化するシステム環境に柔軟かつ統合的に対応できる運用監視の実現により、運用担当者は苦労することなく、システムの安定稼働に注力できます。

本コンテンツに関するお問い合わせ

お電話でのお問い合わせ

富士通コンタクトライン(総合窓口)

0120-933-200

受付時間:9時~12時および13時~17時30分
(土曜日・日曜日・祝日・当社指定の休業日を除く)

Webでのお問い合わせ

当社はセキュリティ保護の観点からSSL技術を使用しております。

ページの先頭へ