CloudWatchアラームのイベントをZabbixに連携させてみた

何が何でもZabbixと連携させたい時に
2023.08.08

どうしてもZabbixで監視をしたい

こんにちは、のんピ(@non____97)です。

皆さんはどうしてもZabbixで監視をしたいなと思ったことはありますか? 私はありません。

ZabbixではAWS by HTTPというZabbix公式が提供しているテンプレートがあります。

こちらを使用することでAWS側での追加設定なしでEC2、EBS、RDS、ECS、S3の監視が可能となります。

しかし、こちらのテンプレートを利用して監視できるリソースは上述のリソースと限られます。ELBやElastiCacheなど他サービスを監視する場合は、Zabbixからカスタムスクリプトで定期的にメトリクスをポーリングしてデータを取得してあげるなどの作り込みが必要になります。

個人的には全てを一つの基盤で監視するのは難しいと考えます。餅は餅屋です。

とは言っても、のっぴきならない理由で、どうしてもZabbixを使う必要がある場面もあります。

その際はPagerDutyなど複数の監視基盤を統合する製品を導入すると良いでしょう。

ただし、このような製品を導入しようにも監視体制の変更ができず、コスト的にも導入が難しいパターンもあると思います。

そのような場合は、CloudWatchアラームのイベントをLambda関数からZabbix SenderでZabbix Serverに送りつけることで対応が可能と考えます。

以降その方法について説明します。

対応方法

CloudWatchアラームでメトリクスを監視し、CloudWatchアラームのイベントをトリガーにLambda関数をキックして、Zabbix SenderでCloudWatchアラームのイベントをZabbix Serverに送ります。

対応方法を図示すると以下の通りです。

CloudWatchアラームのイベントをZabbixに連携させてみた対応策

CloudWatchアラームやLambda関数、Zabbix側の事前準備としては以下があります。

  • CloudWatch Alarmへの以下タグの付与
    • Zabbixのホスト名
    • Zabbixのアイテムのキー名
  • Lambda関数の環境変数に以下を設定
    • Zabbix ServerのIPアドレス
    • Zabbix Serverのポート番号
  • Zabbixのホストとアイテムの設定
  • Zabbixのトリガー設定

CloudWatchアラームの状態が遷移した場合は以下の処理が行われます。

  1. EventBridgeでCloudWatch Alarmのイベント拾う
    • イベントの条件には「CloudWatchアラーム名の末尾がto-zabbix」などZabbixに連携したいCloudWatchアラームで統一して設定できるプロパティを指定する
  2. Lambda関数を起動
  3. イベントのAlarm名と一致するCloudWatch Alarmのタグを取得
  4. Lambda関数に設定された環境変数を取得
  5. (3)と(4)で取得した情報をもとに、Zabbix SenderでCloudWatch AlarmのイベントをJSON stringifyして送信

使用するLambda関数のコードは以下の通りです。

./lib/lambda/send-alarm-event-to-zabbix/index.py

import boto3
import os
import json
import logging
from pyzabbix import ZabbixMetric, ZabbixSender

logger = logging.getLogger()
logger.setLevel(logging.INFO)

def lambda_handler(event, context):
    try:
        logger.info(event)

        # Get alarm ARN from event
        alarm_arn = event['resources'][0]

        # Create a Resource Groups Tagging API client
        resource_tagging_client = boto3.client('resourcegroupstaggingapi')

        # Get the resource tags
        response = resource_tagging_client.get_resources(ResourceARNList=[alarm_arn])

        zabbix_host = None
        zabbix_item_key = None
        
        # Assuming ResourceTagMappingList always contains exactly one item
        resource_tags = response['ResourceTagMappingList'][0]['Tags']

        for tag in resource_tags:
            if tag['Key'] == 'Zabbix Host':
                zabbix_host = tag['Value']
            elif tag['Key'] == 'Zabbix Item Key':
                zabbix_item_key = tag['Value']

        if zabbix_host is None or zabbix_item_key is None:
            logger.error("Zabbix tags are not properly set")
            return

        zabbix_server_ip = os.getenv('ZABBIX_SERVER_IP_ADDRESS')
        zabbix_server_port = int(os.getenv('ZABBIX_SERVER_PORT'))

        zabbix_event_data = [ZabbixMetric(zabbix_host, zabbix_item_key, json.dumps(event))]

        zabbix_sender = ZabbixSender(zabbix_server_ip, zabbix_server_port)
        zabbix_sender_response = zabbix_sender.send(zabbix_event_data)
        
        logger.info(zabbix_sender_response)

    except Exception as e:
        logger.error("Error occurred: {}".format(e))

py-zabbixによりLambda関数の環境変数で指定したZabbix Serverに対して、CloudWatchアラームのタグに指定しているホストとキーを使ってアイテムを送りつけます。

py-zabbixの詳細は以下をご覧ください。

今回のパターン以外にも、都度メトリクスをZabbix Senderで送りつけるパターンもあります。しかし、メトリクスの数だけLambda関数が必要になりますし、監視対象のメトリクスをJSONか何かで定義して、1つのLambda関数で対応しようにもメンテナンスが大変そうです。要するに監視がスケールしません。

また、CloudWatch Logsを使ったログ監視をする場合、サブスクリプションフィルターでLambda関数をキックしZabbix SenderでZabbixにログを送りつけるというのも、ログ量によってはZabbix Serverおよび、Zabbix Serverまでの経路に負荷がかかりそうです。

そういった意味でも都度メトリクスやログをZabbix Senderで送りつける手法はオススメしづらいと言えます。

一方、今回の手法は監視対象が増えた場合に以下リソースを増やすだけです。監視対象の数だけLambda関数やEventBridge Rule or EventBridge Schedulerを用意する必要はありません。

  • CloudWatch アラーム
  • Zabbix側のホストとアイテム設定

さらに、CloudWatchアラームのタグでZabbixのホストとキーを定義しているため、監視対象が追加された場合もLambda関数のコードを変更する必要はありません。

また、CloudWatchアラームの状態が遷移したタイミングでZabbix Serverにイベントを送りつけるので、Zabbix Serverへの負荷も低いと考えます。

こちらの方式の注意すべき点としては、以下3点が挙げられます。

  1. Zabbixのコンソールから監視対象のデータの遷移を確認することができない
    • CloudWatchアラームの状態が遷移したときのデータしか確認できない
  2. CloudWatchアラームに対して料金がかかる
  3. VPC Lambda用のNAT Gatewayの料金がかかる

(1)については、「データの遷移の様子をグラフで確認したい際はCloudWatchのコンソールを確認する」という運用が許容できるのであれば問題ないと思います。

(2)については「アラームメトリクスあたり 0.10USD」の料金が発生します。ただ、人が頑張って大量のLambda関数をメンテナンスするコストを考えるとお安いのではないでしょうか。

(3)については「NAT Gatewayあたり0.062USD/h」と「処理データ 1 GB あたり0.062USD」の料金が発生します。

Lambda関数がインターネットに出る要件が、CloudWatchアラームのタグ取得とログ出力用のCloudWatch Logsのみなのであれば、各サービス用のVPCエンドポイントを用意するのも良いでしょう。VPCエンドポイントであれば「VPCエンドポイントあたり0.014USD/h」、「処理データ 1 GB あたり0.01USD」とNAT Gatewayを使うよりもお安くなります。

複数環境があるのであれば、コスト削減のためVPCエンドポイントを集約させるのもの良いでしょう。

検証環境

検証環境の構成図は以下の通りです。

CloudWatchアラームのイベントをZabbixに連携させてみた検証環境構成図

今回はStep Functionsのステートマシンが実行されたら、アラーム状態になるようなCloudWatchアラームを準備しました。

こちらの検証環境は基本的にAWS CDKで用意しました。使用したコードは以下リポジトリに保存しています。

デプロイ後はLambda関数のENIにElastic IPアドレスを手動で割り当てます。

本来VPC Lambdaを使用する場合はNAT Gatewayを使用するのがセオリーです。AWS CDKでVPC LambdaをNAT GatewayがないPublic Subnetに配置しようとすると以下のようなメッセージが出てエラーになります。

Error: Lambda Functions in a public subnet can NOT access the internet. If you are aware of this limitation and would still like to place the function in a public subnet, set `allowPublicSubnet` to true

今回はNAT Gatewayの料金節約のため、allowPublicSubnettrueにした上で、Elastic IPアドレスの割り当てを行いました。

NAT Gatewayを使用せずにVPC Lambdaの設定をする方法は以下記事でも紹介されています。

Zabbix Serverのセットアップ

パッケージのインストール

まず、Zabbix Serverのセットアップを行います。

Zabbix ServerとするEC2インスタンスはRHEL 9.2です。使用したAMIは以下の通りです。

  • RHEL-9.2.0_HVM-20230615-x86_64-3-Hourly2-GP2
  • ami-01cc36e92a4e9a428
$ cat /etc/os-release
NAME="Red Hat Enterprise Linux"
VERSION="9.2 (Plow)"
ID="rhel"
ID_LIKE="fedora"
VERSION_ID="9.2"
PLATFORM_ID="platform:el9"
PRETTY_NAME="Red Hat Enterprise Linux 9.2 (Plow)"
ANSI_COLOR="0;31"
LOGO="fedora-logo-icon"
CPE_NAME="cpe:/o:redhat:enterprise_linux:9::baseos"
HOME_URL="https://www.redhat.com/"
DOCUMENTATION_URL="https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/9"
BUG_REPORT_URL="https://bugzilla.redhat.com/"

REDHAT_BUGZILLA_PRODUCT="Red Hat Enterprise Linux 9"
REDHAT_BUGZILLA_PRODUCT_VERSION=9.2
REDHAT_SUPPORT_PRODUCT="Red Hat Enterprise Linux"
REDHAT_SUPPORT_PRODUCT_VERSION="9.2"

セットアップ手順は以下Zabbix公式の手順に従って行います。

構成は以下の通りです。

  • Zabbix version : 6.0 LTS
  • Zabbix component : Server, Frontend, Agent
  • Database : PostgreSQL
  • Web Server : Nginx

Zabbixリポジトリのインストールを行います。

$ sudo rpm -Uvh https://repo.zabbix.com/zabbix/6.0/rhel/9/x86_64/zabbix-release-6.0-4.el9.noarch.rpm
Retrieving https://repo.zabbix.com/zabbix/6.0/rhel/9/x86_64/zabbix-release-6.0-4.el9.noarch.rpm
warning: /var/tmp/rpm-tmp.w7MYKh: Header V4 RSA/SHA512 Signature, key ID 08efa7dd: NOKEY
Verifying...                          ################################# [100%]
Preparing...                          ################################# [100%]
Updating / installing...
   1:zabbix-release-6.0-4.el9         ################################# [100%]

$ sudo dnf clean all
Updating Subscription Management repositories.
Unable to read consumer identity

This system is not registered with an entitlement server. You can use subscription-manager to register.

27 files removed

Zabbix Server, Frontend, Zabbix Agentをインストールします。

$ sudo dnf install zabbix-server-pgsql zabbix-web-pgsql zabbix-nginx-conf zabbix-sql-scripts zabbix-selinux-policy zabbix-agent
Updating Subscription Management repositories.
Unable to read consumer identity

This system is not registered with an entitlement server. You can use subscription-manager to register.

Red Hat Enterprise Linux 9 for x86_64 - AppStream from RHUI (RPMs)                            50 MB/s |  24 MB     00:00
Red Hat Enterprise Linux 9 for x86_64 - BaseOS from RHUI (RPMs)                               43 MB/s |  13 MB     00:00
Red Hat Enterprise Linux 9 Client Configuration                                               36 kB/s | 3.2 kB     00:00
Zabbix Official Repository - x86_64                                                          194 kB/s | 210 kB     00:01
Zabbix Official Repository (non-supported) - x86_64                                          1.6 kB/s | 1.1 kB     00:00
Zabbix Official Repository (Agent2 Plugins) - x86_64                                         2.4 kB/s | 1.6 kB     00:00
Dependencies resolved.
=============================================================================================================================
 Package                         Architecture     Version                         Repository                            Size
=============================================================================================================================
Installing:
 zabbix-agent                    x86_64           6.0.20-release1.el9             zabbix                               532 k
 zabbix-nginx-conf               noarch           6.0.20-release1.el9             zabbix                                13 k
 zabbix-selinux-policy           x86_64           6.0.20-release1.el9             zabbix                               258 k
 zabbix-server-pgsql             x86_64           6.0.20-release1.el9             zabbix                               1.8 M
 zabbix-sql-scripts              noarch           6.0.20-release1.el9             zabbix                               7.4 M
 zabbix-web-pgsql                noarch           6.0.20-release1.el9             zabbix                                12 k
Installing dependencies:
 OpenIPMI-libs                   x86_64           2.0.32-3.el9                    rhel-9-appstream-rhui-rpms           518 k
 fontconfig                      x86_64           2.14.0-2.el9_1                  rhel-9-appstream-rhui-rpms           301 k
 fping                           x86_64           5.1-1.el9                       zabbix-non-supported                  35 k
 freetype                        x86_64           2.10.4-9.el9                    rhel-9-baseos-rhui-rpms              391 k
 gd                              x86_64           2.3.2-3.el9                     rhel-9-appstream-rhui-rpms           134 k
 graphite2                       x86_64           1.3.14-9.el9                    rhel-9-baseos-rhui-rpms               98 k
 harfbuzz                        x86_64           2.7.4-8.el9                     rhel-9-baseos-rhui-rpms              629 k
 httpd-filesystem                noarch           2.4.53-11.el9_2.5               rhel-9-appstream-rhui-rpms            17 k
 jbigkit-libs                    x86_64           2.1-23.el9                      rhel-9-appstream-rhui-rpms            56 k
 libX11                          x86_64           1.7.0-7.el9                     rhel-9-appstream-rhui-rpms           648 k
 libX11-common                   noarch           1.7.0-7.el9                     rhel-9-appstream-rhui-rpms           210 k
 libXau                          x86_64           1.0.9-8.el9                     rhel-9-appstream-rhui-rpms            34 k
 libXpm                          x86_64           3.5.13-8.el9_1                  rhel-9-appstream-rhui-rpms            60 k
 libjpeg-turbo                   x86_64           2.0.90-6.el9_1                  rhel-9-appstream-rhui-rpms           178 k
 libpng                          x86_64           2:1.6.37-12.el9                 rhel-9-baseos-rhui-rpms              119 k
 libpq                           x86_64           13.5-1.el9                      rhel-9-appstream-rhui-rpms           208 k
 libtiff                         x86_64           4.4.0-8.el9_2                   rhel-9-appstream-rhui-rpms           200 k
 libtool-ltdl                    x86_64           2.4.6-45.el9                    rhel-9-appstream-rhui-rpms            39 k
 libwebp                         x86_64           1.2.0-6.el9_1                   rhel-9-appstream-rhui-rpms           281 k
 libxcb                          x86_64           1.13.1-9.el9                    rhel-9-appstream-rhui-rpms           247 k
 libxslt                         x86_64           1.1.34-9.el9                    rhel-9-appstream-rhui-rpms           247 k
 net-snmp-libs                   x86_64           1:5.9.1-9.el9                   rhel-9-appstream-rhui-rpms           760 k
 nginx                           x86_64           1:1.20.1-14.el9                 rhel-9-appstream-rhui-rpms            43 k
 nginx-core                      x86_64           1:1.20.1-14.el9                 rhel-9-appstream-rhui-rpms           576 k
 nginx-filesystem                noarch           1:1.20.1-14.el9                 rhel-9-appstream-rhui-rpms            13 k
 oniguruma                       x86_64           6.9.6-1.el9.5                   rhel-9-appstream-rhui-rpms           221 k
 php-bcmath                      x86_64           8.0.27-1.el9_1                  rhel-9-appstream-rhui-rpms            38 k
 php-common                      x86_64           8.0.27-1.el9_1                  rhel-9-appstream-rhui-rpms           686 k
 php-fpm                         x86_64           8.0.27-1.el9_1                  rhel-9-appstream-rhui-rpms           1.6 M
 php-gd                          x86_64           8.0.27-1.el9_1                  rhel-9-appstream-rhui-rpms            43 k
 php-ldap                        x86_64           8.0.27-1.el9_1                  rhel-9-appstream-rhui-rpms            43 k
 php-mbstring                    x86_64           8.0.27-1.el9_1                  rhel-9-appstream-rhui-rpms           473 k
 php-pdo                         x86_64           8.0.27-1.el9_1                  rhel-9-appstream-rhui-rpms            87 k
 php-pgsql                       x86_64           8.0.27-1.el9_1                  rhel-9-appstream-rhui-rpms            76 k
 php-xml                         x86_64           8.0.27-1.el9_1                  rhel-9-appstream-rhui-rpms           138 k
 redhat-logos-httpd              noarch           90.4-1.el9                      rhel-9-appstream-rhui-rpms            18 k
 unixODBC                        x86_64           2.3.9-4.el9                     rhel-9-appstream-rhui-rpms           495 k
 xml-common                      noarch           0.6.3-58.el9                    rhel-9-appstream-rhui-rpms            36 k
 zabbix-web                      noarch           6.0.20-release1.el9             zabbix                               7.4 M
 zabbix-web-deps                 noarch           6.0.20-release1.el9             zabbix                                13 k

Transaction Summary
=============================================================================================================================
Install  46 Packages

Total download size: 27 M
Installed size: 93 M
Is this ok [y/N]: y
Downloading Packages:
(1/46): redhat-logos-httpd-90.4-1.el9.noarch.rpm                                             346 kB/s |  18 kB     00:00
(2/46): libtool-ltdl-2.4.6-45.el9.x86_64.rpm                                                 664 kB/s |  39 kB     00:00
(3/46): libX11-common-1.7.0-7.el9.noarch.rpm                                                 3.1 MB/s | 210 kB     00:00
.
.
(中略)
.
.
(43/46): zabbix-web-pgsql-6.0.20-release1.el9.noarch.rpm                                                                 80 kB/s |  12 kB     00:00
(44/46): zabbix-sql-scripts-6.0.20-release1.el9.noarch.rpm                                                               11 MB/s | 7.4 MB     00:00
(45/46): fping-5.1-1.el9.x86_64.rpm                                                                                     178 kB/s |  35 kB     00:00
(46/46): zabbix-web-6.0.20-release1.el9.noarch.rpm                                                                      8.3 MB/s | 7.4 MB     00:00
--------------------------------------------------------------------------------------------------------------------------------------------------------
Total                                                                                                                    11 MB/s |  27 MB     00:02
Zabbix Official Repository - x86_64                                                                                     3.0 MB/s | 3.1 kB     00:00
Importing GPG key 0x08EFA7DD:
 Userid     : "Zabbix LLC (Jul 2022) <packager@zabbix.com>"
 Fingerprint: D9AA 84C2 B617 479C 6E4F CF4D 19F2 4753 08EF A7DD
 From       : /etc/pki/rpm-gpg/RPM-GPG-KEY-ZABBIX-08EFA7DD
Is this ok [y/N]: y
Key imported successfully
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
.
.
(中略)
.
.
Installed:
  OpenIPMI-libs-2.0.32-3.el9.x86_64                              fontconfig-2.14.0-2.el9_1.x86_64
  fping-5.1-1.el9.x86_64                                         freetype-2.10.4-9.el9.x86_64
  gd-2.3.2-3.el9.x86_64                                          graphite2-1.3.14-9.el9.x86_64
  harfbuzz-2.7.4-8.el9.x86_64                                    httpd-filesystem-2.4.53-11.el9_2.5.noarch
  jbigkit-libs-2.1-23.el9.x86_64                                 libX11-1.7.0-7.el9.x86_64
  libX11-common-1.7.0-7.el9.noarch                               libXau-1.0.9-8.el9.x86_64
  libXpm-3.5.13-8.el9_1.x86_64                                   libjpeg-turbo-2.0.90-6.el9_1.x86_64
  libpng-2:1.6.37-12.el9.x86_64                                  libpq-13.5-1.el9.x86_64
  libtiff-4.4.0-8.el9_2.x86_64                                   libtool-ltdl-2.4.6-45.el9.x86_64
  libwebp-1.2.0-6.el9_1.x86_64                                   libxcb-1.13.1-9.el9.x86_64
  libxslt-1.1.34-9.el9.x86_64                                    net-snmp-libs-1:5.9.1-9.el9.x86_64
  nginx-1:1.20.1-14.el9.x86_64                                   nginx-core-1:1.20.1-14.el9.x86_64
  nginx-filesystem-1:1.20.1-14.el9.noarch                        oniguruma-6.9.6-1.el9.5.x86_64
  php-bcmath-8.0.27-1.el9_1.x86_64                               php-common-8.0.27-1.el9_1.x86_64
  php-fpm-8.0.27-1.el9_1.x86_64                                  php-gd-8.0.27-1.el9_1.x86_64
  php-ldap-8.0.27-1.el9_1.x86_64                                 php-mbstring-8.0.27-1.el9_1.x86_64
  php-pdo-8.0.27-1.el9_1.x86_64                                  php-pgsql-8.0.27-1.el9_1.x86_64
  php-xml-8.0.27-1.el9_1.x86_64                                  redhat-logos-httpd-90.4-1.el9.noarch
  unixODBC-2.3.9-4.el9.x86_64                                    xml-common-0.6.3-58.el9.noarch
  zabbix-agent-6.0.20-release1.el9.x86_64                        zabbix-nginx-conf-6.0.20-release1.el9.noarch
  zabbix-selinux-policy-6.0.20-release1.el9.x86_64               zabbix-server-pgsql-6.0.20-release1.el9.x86_64
  zabbix-sql-scripts-6.0.20-release1.el9.noarch                  zabbix-web-6.0.20-release1.el9.noarch
  zabbix-web-deps-6.0.20-release1.el9.noarch                     zabbix-web-pgsql-6.0.20-release1.el9.noarch

Complete!

依存関係でNginxやPHP-FPMはインストールしてくれましたが、PostgreSQLはインストールされないようですね。

ソフトウェア要件を確認したところ、PostgreSQL 13.0-15.X をサポートしているようです。

PostgreSQL 15のインストールします。

# モジュール一覧の確認
$ sudo dnf module list
Updating Subscription Management repositories.
Unable to read consumer identity

This system is not registered with an entitlement server. You can use subscription-manager to register.

Last metadata expiration check: 0:03:15 ago on Mon 07 Aug 2023 06:34:30 AM UTC.
Red Hat Enterprise Linux 9 for x86_64 - AppStream from RHUI (RPMs)
Name           Stream     Profiles                                  Summary
maven          3.8        common [d]                                Java project management and project comprehension tool
nginx          1.22       common [d]                                nginx webserver
nodejs         18         common [d], development, minimal, s2i     Javascript runtime
php            8.1        common [d], devel, minimal                PHP scripting language
postgresql     15         client, server                            PostgreSQL server and client module
ruby           3.1        common [d]                                An interpreter of object-oriented scripting language

Hint: [d]efault, [e]nabled, [x]disabled, [i]nstalled

# PostgreSQL 15のサーバーをインストール
$ sudo dnf module install postgresql:15/server
Updating Subscription Management repositories.
Unable to read consumer identity

This system is not registered with an entitlement server. You can use subscription-manager to register.

Last metadata expiration check: 0:06:28 ago on Mon 07 Aug 2023 06:34:30 AM UTC.
Dependencies resolved.
=============================================================================================================================
 Package                      Arch        Version                                      Repository                       Size
=============================================================================================================================
Installing group/module packages:
 postgresql-server            x86_64      15.3-1.module+el9.2.0.z+19113+6f5d9d63       rhel-9-appstream-rhui-rpms      6.1 M
Installing dependencies:
 libicu                       x86_64      67.1-9.el9                                   rhel-9-baseos-rhui-rpms         9.6 M
 postgresql                   x86_64      15.3-1.module+el9.2.0.z+19113+6f5d9d63       rhel-9-appstream-rhui-rpms      1.7 M
 postgresql-private-libs      x86_64      15.3-1.module+el9.2.0.z+19113+6f5d9d63       rhel-9-appstream-rhui-rpms      139 k
Installing module profiles:
 postgresql/server
Enabling module streams:
 postgresql                               15

Transaction Summary
=============================================================================================================================
Install  4 Packages

Total download size: 18 M
Installed size: 64 M
Is this ok [y/N]: y
Downloading Packages:
(1/4): postgresql-private-libs-15.3-1.module+el9.2.0.z+19113+6f5d9d63.x86_64.rpm             1.0 MB/s | 139 kB     00:00
.
.
(中略)
.
.
Installed:
  libicu-67.1-9.el9.x86_64
  postgresql-15.3-1.module+el9.2.0.z+19113+6f5d9d63.x86_64
  postgresql-private-libs-15.3-1.module+el9.2.0.z+19113+6f5d9d63.x86_64
  postgresql-server-15.3-1.module+el9.2.0.z+19113+6f5d9d63.x86_64

Complete!

# インストールが完了したことを確認
$ psql --version
psql (PostgreSQL) 15.3

インストールしたパッケージの設定

PostgreSQLの初期設定を行います。

$ sudo postgresql-setup --initdb
 * Initializing database in '/var/lib/pgsql/data'
 * Initialized, logs are in /var/lib/pgsql/initdb_postgresql.log

PostgreSQLを起動させます。

# PostgreSQLの起動
$ sudo systemctl start postgresql

# 起動しているか確認
$ systemctl status postgresql
● postgresql.service - PostgreSQL database server
     Loaded: loaded (/usr/lib/systemd/system/postgresql.service; disabled; preset: disabled)
     Active: active (running) since Mon 2023-08-07 06:44:30 UTC; 6s ago
    Process: 15570 ExecStartPre=/usr/libexec/postgresql-check-db-dir postgresql (code=exited, status=0/SUCCESS)
   Main PID: 15572 (postmaster)
      Tasks: 7 (limit: 4184)
     Memory: 17.3M
        CPU: 42ms
     CGroup: /system.slice/postgresql.service
             ├─15572 /usr/bin/postmaster -D /var/lib/pgsql/data
             ├─15573 "postgres: logger "
             ├─15574 "postgres: checkpointer "
             ├─15575 "postgres: background writer "
             ├─15577 "postgres: walwriter "
             ├─15578 "postgres: autovacuum launcher "
             └─15579 "postgres: logical replication launcher "

Aug 07 06:44:30 ip-10-1-1-7.ec2.internal systemd[1]: Starting PostgreSQL database server...
Aug 07 06:44:30 ip-10-1-1-7.ec2.internal postmaster[15572]: 2023-08-07 06:44:30.174 UTC [15572] LOG:  redirecting log output>
Aug 07 06:44:30 ip-10-1-1-7.ec2.internal postmaster[15572]: 2023-08-07 06:44:30.174 UTC [15572] HINT:  Future log output wil>
Aug 07 06:44:30 ip-10-1-1-7.ec2.internal systemd[1]: Started PostgreSQL database server.

# 自動起動の有効化
$ sudo systemctl enable postgresql
Created symlink /etc/systemd/system/multi-user.target.wants/postgresql.service → /usr/lib/systemd/system/postgresql.service.

PostgreSQL上にZabbix Serverが使用するDBユーザーとDBを作成します。

# sudo した際にカレントディレクトリに対して権限不足でエラーにならないように cd
$ cd /tmp/

# DBユーザーの作成
$ sudo -u postgres createuser --pwprompt zabbix
Enter password for new role:
Enter it again:

# DBの作成
$ sudo -u postgres createdb -O zabbix zabbix

psqlで確かにDBユーザーとDBが作成されているか確認しておきます。

$ sudo -u postgres -i

$ psql
psql (15.3)
Type "help" for help.

postgres=# \du
                                   List of roles
 Role name |                         Attributes                         | Member of
-----------+------------------------------------------------------------+-----------
 postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
 zabbix    |                                                            | {}

postgres=# \l
                                                 List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    | ICU Locale | Locale Provider |   Access privileges
-----------+----------+----------+-------------+-------------+------------+-----------------+-----------------------
 postgres  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |            | libc            |
 template0 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |            | libc            | =c/postgres          +
           |          |          |             |             |            |                 | postgres=CTc/postgres
 template1 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |            | libc            | =c/postgres          +
           |          |          |             |             |            |                 | postgres=CTc/postgres
 zabbix    | zabbix   | UTF8     | en_US.UTF-8 | en_US.UTF-8 |            | libc            |
(4 rows)

postgres=# \q

$ exit

スキーマとデータをインポートします。

$ zcat /usr/share/zabbix-sql-scripts/postgresql/server.sql.gz | sudo -u zabbix psql zabbix
could not change directory to "/home/ec2-user": Permission denied
CREATE TABLE
CREATE INDEX
CREATE TABLE
CREATE INDEX
CREATE TABLE
CREATE INDEX
CREATE INDEX
.
.
(中略)
.
.
INSERT 0 1
INSERT 0 1
INSERT 0 1
INSERT 0 1
INSERT 0 1
INSERT 0 1
COMMIT

DBユーザー作成時に指定したパスワードをZabbix Serverの設定ファイルに埋め込みます。

$ sudo grep DBPassword= /etc/zabbix/zabbix_server.conf
# DBPassword=

$ sudo vi /etc/zabbix/zabbix_server.conf

$ sudo grep DBPassword= /etc/zabbix/zabbix_server.conf
DBPassword=<DBユーザーのパスワード>

認証方法をidentからmd5に変更します。

$ sudo vi /var/lib/pgsql/data/pg_hba.conf

$ sudo tail -n20 /var/lib/pgsql/data/pg_hba.conf
# If you want to allow non-local connections, you need to add more
# "host" records.  In that case you will also need to make PostgreSQL
# listen on a non-local interface via the listen_addresses
# configuration parameter, or via the -i or -h command line switches.



# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     peer
# IPv4 local connections:
host    all             all             127.0.0.1/32            md5
# IPv6 local connections:
host    all             all             ::1/128                 md5
# Allow replication connections from localhost, by a user with the
# replication privilege.
local   replication     all                                     peer
host    replication     all             127.0.0.1/32            ident
host    replication     all             ::1/128                 ident

# 設定のリロード
$ sudo -u postgres pg_ctl -D /var/lib/pgsql/data reload
server signaled

こちらを設定しない場合、ブラウザからZabbixのセットアップをする際に以下のようなエラーを出力してしまいます。

Details Cannot connect to the database.
Error connecting to database.

次にNginxの設定を行います。

デフォルトでは以下のような設定がされています。

$ cat /etc/nginx/conf.d/zabbix.conf
server {
#        listen          8080;
#        server_name     example.com;

        root    /usr/share/zabbix;

        index   index.php;

        location = /favicon.ico {
                log_not_found   off;
        }

        location / {
                try_files       $uri $uri/ =404;
        }

        location /assets {
                access_log      off;
                expires         10d;
        }

        location ~ /\.ht {
                deny            all;
        }

        location ~ /(api\/|conf[^\.]|include|locale) {
                deny            all;
                return          404;
        }

        location /vendor {
                deny            all;
                return          404;
        }

        location ~ [^/]\.php(/|$) {
                fastcgi_pass    unix:/run/php-fpm/zabbix.sock;
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                fastcgi_index   index.php;

                fastcgi_param   DOCUMENT_ROOT   /usr/share/zabbix;
                fastcgi_param   SCRIPT_FILENAME /usr/share/zabbix$fastcgi_script_name;
                fastcgi_param   PATH_TRANSLATED /usr/share/zabbix$fastcgi_script_name;

                include fastcgi_params;
                fastcgi_param   QUERY_STRING    $query_string;
                fastcgi_param   REQUEST_METHOD  $request_method;
                fastcgi_param   CONTENT_TYPE    $content_type;
                fastcgi_param   CONTENT_LENGTH  $content_length;

                fastcgi_intercept_errors        on;
                fastcgi_ignore_client_abort     off;
                fastcgi_connect_timeout         60;
                fastcgi_send_timeout            180;
                fastcgi_read_timeout            180;
                fastcgi_buffer_size             128k;
                fastcgi_buffers                 4 256k;
                fastcgi_busy_buffers_size       256k;
                fastcgi_temp_file_write_size    256k;
        }
}

リスナーポートとサーバー名をコメントアウトして設定してあげましょう。

$ sudo vi /etc/nginx/conf.d/zabbix.conf

$ sudo head /etc/nginx/conf.d/zabbix.conf
server {
        listen          8080;
        server_name     non-97.net;

        root    /usr/share/zabbix;

        index   index.php;

        location = /favicon.ico {
                log_not_found   off;

Zabbix ServerやZabbix Agent、Nginx、PHP-FPMを起動させます。

$ sudo systemctl start zabbix-server zabbix-agent nginx php-fpm

$ sudo systemctl enable zabbix-server zabbix-agent nginx php-fpm
Created symlink /etc/systemd/system/multi-user.target.wants/zabbix-server.service → /usr/lib/systemd/system/zabbix-server.service.
Created symlink /etc/systemd/system/multi-user.target.wants/zabbix-agent.service → /usr/lib/systemd/system/zabbix-agent.service.
Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /usr/lib/systemd/system/nginx.service.
Created symlink /etc/systemd/system/multi-user.target.wants/php-fpm.service → /usr/lib/systemd/system/php-fpm.service.

$ sudo systemctl status zabbix-server zabbix-agent nginx php-fpm
● zabbix-server.service - Zabbix Server
     Loaded: loaded (/usr/lib/systemd/system/zabbix-server.service; enabled; preset: disabled)
     Active: active (running) since Tue 2023-08-08 01:32:13 UTC; 18s ago
   Main PID: 13084 (zabbix_server)
      Tasks: 48 (limit: 10562)
     Memory: 44.4M
        CPU: 453ms
     CGroup: /system.slice/zabbix-server.service
             ├─13084 /usr/sbin/zabbix_server -c /etc/zabbix/zabbix_server.conf
             ├─13113 "/usr/sbin/zabbix_server: ha manager"
             ├─13115 "/usr/sbin/zabbix_server: service manager #1 [processed 0 events, updated 0 event tags, deleted 0 problems, synced 0 service updat>
             ├─13116 "/usr/sbin/zabbix_server: configuration syncer [synced configuration in 0.130928 sec, idle 60 sec]"
             ├─13120 "/usr/sbin/zabbix_server: alert manager #1 [sent 0, failed 0 alerts, idle 5.004874 sec during 5.005005 sec]"
             ├─13121 "/usr/sbin/zabbix_server: alerter #1 started"
             ├─13122 "/usr/sbin/zabbix_server: alerter #2 started"
             ├─13123 "/usr/sbin/zabbix_server: alerter #3 started"
             ├─13124 "/usr/sbin/zabbix_server: preprocessing manager #1 [queued 0, processed 11 values, idle 5.331564 sec during 5.331815 sec]"
             ├─13125 "/usr/sbin/zabbix_server: preprocessing worker #1 started"
             ├─13126 "/usr/sbin/zabbix_server: preprocessing worker #2 started"
             ├─13127 "/usr/sbin/zabbix_server: preprocessing worker #3 started"
             ├─13128 "/usr/sbin/zabbix_server: lld manager #1 [processed 1 LLD rules, idle 5.424885sec during 5.425002 sec]"
             ├─13130 "/usr/sbin/zabbix_server: lld worker #1 started"
             ├─13131 "/usr/sbin/zabbix_server: lld worker #2 [processed 1 LLD rules, idle 11.312291 sec during 11.431958 sec]"
             ├─13132 "/usr/sbin/zabbix_server: housekeeper [startup idle for 30 minutes]"
             ├─13133 "/usr/sbin/zabbix_server: timer #1 [updated 0 hosts, suppressed 0 events in 0.002956 sec, idle 45 sec]"
             ├─13134 "/usr/sbin/zabbix_server: http poller #1 [got 0 values in 0.000561 sec, idle 5 sec]"
             ├─13135 "/usr/sbin/zabbix_server: discoverer #1 [processed 0 rules in 0.003052 sec, idle 60 sec]"
             ├─13136 "/usr/sbin/zabbix_server: history syncer #1 [processed 0 values, 0 triggers in 0.000017 sec, idle 1 sec]"
             ├─13141 "/usr/sbin/zabbix_server: history syncer #2 [processed 0 values, 0 triggers in 0.000018 sec, idle 1 sec]"
             ├─13142 "/usr/sbin/zabbix_server: history syncer #3 [processed 0 values, 0 triggers in 0.000019 sec, idle 1 sec]"
             ├─13143 "/usr/sbin/zabbix_server: history syncer #4 [processed 0 values, 0 triggers in 0.000022 sec, idle 1 sec]"
             ├─13144 "/usr/sbin/zabbix_server: escalator #1 [processed 0 escalations in 0.001906 sec, idle 3 sec]"
             ├─13145 "/usr/sbin/zabbix_server: proxy poller #1 [exchanged data with 0 proxies in 0.000029 sec, idle 5 sec]"
             ├─13147 "/usr/sbin/zabbix_server: self-monitoring [processed data in 0.000038 sec, idle 1 sec]"
             ├─13150 "/usr/sbin/zabbix_server: task manager [processed 0 task(s) in 0.000435 sec, idle 5 sec]"
             ├─13151 "/usr/sbin/zabbix_server: poller #1 [got 1 values in 0.000338 sec, idle 5 sec]"
             ├─13152 "/usr/sbin/zabbix_server: poller #2 [got 0 values in 0.000030 sec, idle 5 sec]"
             ├─13156 "/usr/sbin/zabbix_server: poller #3 [got 0 values in 0.000012 sec, idle 5 sec]"
             ├─13157 "/usr/sbin/zabbix_server: poller #4 [got 0 values in 0.000058 sec, idle 5 sec]"
             ├─13161 "/usr/sbin/zabbix_server: poller #5 [got 0 values in 0.000041 sec, idle 5 sec]"
             ├─13162 "/usr/sbin/zabbix_server: unreachable poller #1 [got 0 values in 0.000033 sec, idle 5 sec]"
             ├─13163 "/usr/sbin/zabbix_server: trapper #1 [processed data in 0.000000 sec, waiting for connection]"
             ├─13165 "/usr/sbin/zabbix_server: trapper #2 [processed data in 0.000000 sec, waiting for connection]"
             ├─13166 "/usr/sbin/zabbix_server: trapper #3 [processed data in 0.000000 sec, waiting for connection]"
             ├─13167 "/usr/sbin/zabbix_server: trapper #4 [processed data in 0.000000 sec, waiting for connection]"
             ├─13169 "/usr/sbin/zabbix_server: trapper #5 [processed data in 0.000000 sec, waiting for connection]"
             ├─13170 "/usr/sbin/zabbix_server: icmp pinger #1 [got 0 values in 0.000029 sec, idle 5 sec]"
             ├─13172 "/usr/sbin/zabbix_server: alert syncer [queued 0 alerts(s), flushed 0 result(s) in 0.000757 sec, idle 1 sec]"
             ├─13174 "/usr/sbin/zabbix_server: history poller #1 [got 0 values in 0.000019 sec, idle 1 sec]"
             ├─13175 "/usr/sbin/zabbix_server: history poller #2 [got 0 values in 0.000021 sec, idle 1 sec]"
             ├─13177 "/usr/sbin/zabbix_server: history poller #3 [got 0 values in 0.000025 sec, idle 1 sec]"
             ├─13180 "/usr/sbin/zabbix_server: history poller #4 [got 1 values in 0.000091 sec, idle 1 sec]"
             ├─13181 "/usr/sbin/zabbix_server: history poller #5 [got 0 values in 0.000024 sec, idle 1 sec]"
             ├─13182 "/usr/sbin/zabbix_server: availability manager #1 [queued 0, processed 0 values, idle 5.005339 sec during 5.005466 sec]"
             ├─13186 "/usr/sbin/zabbix_server: trigger housekeeper [startup idle for 60 second(s)]"
             └─13187 "/usr/sbin/zabbix_server: odbc poller #1 [got 0 values in 0.000042 sec, idle 5 sec]"

Aug 08 01:32:13 ip-10-1-1-26.ec2.internal systemd[1]: Starting Zabbix Server...
Aug 08 01:32:13 ip-10-1-1-26.ec2.internal systemd[1]: Started Zabbix Server.

● zabbix-agent.service - Zabbix Agent
     Loaded: loaded (/usr/lib/systemd/system/zabbix-agent.service; enabled; preset: disabled)
     Active: active (running) since Tue 2023-08-08 01:32:13 UTC; 19s ago
   Main PID: 13075 (zabbix_agentd)
      Tasks: 6 (limit: 10562)
     Memory: 3.6M
        CPU: 32ms
     CGroup: /system.slice/zabbix-agent.service
             ├─13075 /usr/sbin/zabbix_agentd -c /etc/zabbix/zabbix_agentd.conf
             ├─13076 "/usr/sbin/zabbix_agentd: collector [idle 1 sec]"
             ├─13077 "/usr/sbin/zabbix_agentd: listener #1 [waiting for connection]"
             ├─13078 "/usr/sbin/zabbix_agentd: listener #2 [waiting for connection]"
             ├─13079 "/usr/sbin/zabbix_agentd: listener #3 [waiting for connection]"
             └─13080 "/usr/sbin/zabbix_agentd: active checks #1 [idle 1 sec]"

Aug 08 01:32:13 ip-10-1-1-26.ec2.internal systemd[1]: Starting Zabbix Agent...
Aug 08 01:32:13 ip-10-1-1-26.ec2.internal systemd[1]: Started Zabbix Agent.

● nginx.service - The nginx HTTP and reverse proxy server
     Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; preset: disabled)
    Drop-In: /usr/lib/systemd/system/nginx.service.d
             └─php-fpm.conf
     Active: active (running) since Tue 2023-08-08 01:32:13 UTC; 19s ago
   Main PID: 13092 (nginx)
      Tasks: 3 (limit: 10562)
     Memory: 3.0M
        CPU: 39ms
     CGroup: /system.slice/nginx.service
             ├─13092 "nginx: master process /usr/sbin/nginx"
             ├─13093 "nginx: worker process"
             └─13094 "nginx: worker process"

Aug 08 01:32:13 ip-10-1-1-26.ec2.internal systemd[1]: Starting The nginx HTTP and reverse proxy server...
Aug 08 01:32:13 ip-10-1-1-26.ec2.internal nginx[13089]: nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
Aug 08 01:32:13 ip-10-1-1-26.ec2.internal nginx[13089]: nginx: configuration file /etc/nginx/nginx.conf test is successful
Aug 08 01:32:13 ip-10-1-1-26.ec2.internal systemd[1]: Started The nginx HTTP and reverse proxy server.

● php-fpm.service - The PHP FastCGI Process Manager
     Loaded: loaded (/usr/lib/systemd/system/php-fpm.service; enabled; preset: disabled)
     Active: active (running) since Tue 2023-08-08 01:32:13 UTC; 18s ago
   Main PID: 13088 (php-fpm)
     Status: "Processes active: 0, idle: 10, Requests: 0, slow: 0, Traffic: 0req/sec"
      Tasks: 11 (limit: 10562)
     Memory: 13.5M
        CPU: 88ms
     CGroup: /system.slice/php-fpm.service
             ├─13088 "php-fpm: master process (/etc/php-fpm.conf)"
             ├─13095 "php-fpm: pool www"
             ├─13097 "php-fpm: pool www"
             ├─13098 "php-fpm: pool www"
             ├─13099 "php-fpm: pool www"
             ├─13100 "php-fpm: pool www"
             ├─13101 "php-fpm: pool zabbix"
             ├─13102 "php-fpm: pool zabbix"
             ├─13103 "php-fpm: pool zabbix"
             ├─13104 "php-fpm: pool zabbix"
             └─13105 "php-fpm: pool zabbix"

Aug 08 01:32:13 ip-10-1-1-26.ec2.internal systemd[1]: Starting The PHP FastCGI Process Manager...
Aug 08 01:32:13 ip-10-1-1-26.ec2.internal systemd[1]: Started The PHP FastCGI Process Manager.

TCP/8080でNginxがLISTENしているのかもチェックしましょう。

$ sudo ss -lntp
State        Recv-Q        Send-Q               Local Address:Port                Peer Address:PortProcess
LISTEN       0             128                        0.0.0.0:22                       0.0.0.0:* users:(("sshd",pid=934,fd=3))
LISTEN       0             511                        0.0.0.0:80                       0.0.0.0:* users:(("nginx",pid=13094,fd=7),("nginx",pid=13093,fd=7),("nginx",pid=13092,fd=7))
LISTEN       0             511                        0.0.0.0:8080                     0.0.0.0:* users:(("nginx",pid=13094,fd=6),("nginx",pid=13093,fd=6),("nginx",pid=13092,fd=6))
LISTEN       0             244                      127.0.0.1:5432                     0.0.0.0:* users:(("postmaster",pid=12570,fd=7))
LISTEN       0             4096                       0.0.0.0:10051                    0.0.0.0:* users:(("zabbix_server",pid=13187,fd=9),("zabbix_server",pid=13186,fd=9),("zabbix_server",pid=13182,fd=9),("zabbix_server",pid=13181,fd=9),("zabbix_server",pid=13180,fd=9),("zabbix_server",pid=13177,fd=9),("zabbix_server",pid=13175,fd=9),("zabbix_server",pid=13174,fd=9),("zabbix_server",pid=13172,fd=9),("zabbix_server",pid=13170,fd=9),("zabbix_server",pid=13169,fd=9),("zabbix_server",pid=13167,fd=9),("zabbix_server",pid=13166,fd=9),("zabbix_server",pid=13165,fd=9),("zabbix_server",pid=13163,fd=9),("zabbix_server",pid=13162,fd=9),("zabbix_server",pid=13161,fd=9),("zabbix_server",pid=13157,fd=9),("zabbix_server",pid=13156,fd=9),("zabbix_server",pid=13152,fd=9),("zabbix_server",pid=13151,fd=9),("zabbix_server",pid=13150,fd=9),("zabbix_server",pid=13147,fd=9),("zabbix_server",pid=13145,fd=9),("zabbix_server",pid=13144,fd=9),("zabbix_server",pid=13143,fd=9),("zabbix_server",pid=13142,fd=9),("zabbix_server",pid=13141,fd=9),("zabbix_server",pid=13136,fd=9),("zabbix_server",pid=13135,fd=9),("zabbix_server",pid=13134,fd=9),("zabbix_server",pid=13133,fd=9),("zabbix_server",pid=13132,fd=9),("zabbix_server",pid=13131,fd=9),("zabbix_server",pid=13130,fd=9),("zabbix_server",pid=13128,fd=9),("zabbix_server",pid=13127,fd=9),("zabbix_server",pid=13126,fd=9),("zabbix_server",pid=13125,fd=9),("zabbix_server",pid=13124,fd=9),("zabbix_server",pid=13123,fd=9),("zabbix_server",pid=13122,fd=9),("zabbix_server",pid=13121,fd=9),("zabbix_server",pid=13120,fd=9),("zabbix_server",pid=13116,fd=9),("zabbix_server",pid=13115,fd=9),("zabbix_server",pid=13084,fd=9))
LISTEN       0             4096                       0.0.0.0:10050                    0.0.0.0:* users:(("zabbix_agentd",pid=13080,fd=4),("zabbix_agentd",pid=13079,fd=4),("zabbix_agentd",pid=13078,fd=4),("zabbix_agentd",pid=13077,fd=4),("zabbix_agentd",pid=13076,fd=4),("zabbix_agentd",pid=13075,fd=4))
LISTEN       0             128                           [::]:22                          [::]:* users:(("sshd",pid=934,fd=4))
LISTEN       0             244                          [::1]:5432                        [::]:* users:(("postmaster",pid=12570,fd=6))
LISTEN       0             511                           [::]:80                          [::]:* users:(("nginx",pid=13094,fd=8),("nginx",pid=13093,fd=8),("nginx",pid=13092,fd=8))
LISTEN       0             4096                          [::]:10051                       [::]:* users:(("zabbix_server",pid=13187,fd=10),("zabbix_server",pid=13186,fd=10),("zabbix_server",pid=13182,fd=10),("zabbix_server",pid=13181,fd=10),("zabbix_server",pid=13180,fd=10),("zabbix_server",pid=13177,fd=10),("zabbix_server",pid=13175,fd=10),("zabbix_server",pid=13174,fd=10),("zabbix_server",pid=13172,fd=10),("zabbix_server",pid=13170,fd=10),("zabbix_server",pid=13169,fd=10),("zabbix_server",pid=13167,fd=10),("zabbix_server",pid=13166,fd=10),("zabbix_server",pid=13165,fd=10),("zabbix_server",pid=13163,fd=10),("zabbix_server",pid=13162,fd=10),("zabbix_server",pid=13161,fd=10),("zabbix_server",pid=13157,fd=10),("zabbix_server",pid=13156,fd=10),("zabbix_server",pid=13152,fd=10),("zabbix_server",pid=13151,fd=10),("zabbix_server",pid=13150,fd=10),("zabbix_server",pid=13147,fd=10),("zabbix_server",pid=13145,fd=10),("zabbix_server",pid=13144,fd=10),("zabbix_server",pid=13143,fd=10),("zabbix_server",pid=13142,fd=10),("zabbix_server",pid=13141,fd=10),("zabbix_server",pid=13136,fd=10),("zabbix_server",pid=13135,fd=10),("zabbix_server",pid=13134,fd=10),("zabbix_server",pid=13133,fd=10),("zabbix_server",pid=13132,fd=10),("zabbix_server",pid=13131,fd=10),("zabbix_server",pid=13130,fd=10),("zabbix_server",pid=13128,fd=10),("zabbix_server",pid=13127,fd=10),("zabbix_server",pid=13126,fd=10),("zabbix_server",pid=13125,fd=10),("zabbix_server",pid=13124,fd=10),("zabbix_server",pid=13123,fd=10),("zabbix_server",pid=13122,fd=10),("zabbix_server",pid=13121,fd=10),("zabbix_server",pid=13120,fd=10),("zabbix_server",pid=13116,fd=10),("zabbix_server",pid=13115,fd=10),("zabbix_server",pid=13084,fd=10))
LISTEN       0             4096                          [::]:10050                       [::]:* users:(("zabbix_agentd",pid=13080,fd=5),("zabbix_agentd",pid=13079,fd=5),("zabbix_agentd",pid=13078,fd=5),("zabbix_agentd",pid=13077,fd=5),("zabbix_agentd",pid=13076,fd=5),("zabbix_agentd",pid=13075,fd=5))

LISTENしていますね。TCP/80はNginxのデフォルトのリスナーポートです。不要であれば/etc/nginx/nginx.confを変更しましょう。

WebブラウザからのZabbixのセットアップ

それでは、WebブラウザからもZabbixのセットアップを行います。

SSMセッションマネージャーのポートフォワーディングでZabbixのWebコンソールにアクセスできるようにしてあげます。

$ aws ssm start-session --target i-08691afe0dc219e88 \
                     --document-name AWS-StartPortForwardingSession \
                     --parameters '{"portNumber":["8080"],"localPortNumber":["18080"]}'

Starting session with SessionId: botocore-session-1691458491-030419d0a04cec671
Port 18080 opened for sessionId botocore-session-1691458491-030419d0a04cec671.
Waiting for connections...

`http://localhost:18080/`にアクセスします。

すると、以下のようにZabbixのWebコンソールが表示されました。

Weblcome to Zabbix 6.0

Next stepをクリックします。

要件を満たしているかチェックされます。全てOKだったのでNext stepをクリックします。

Check of pre-requisites

DBとの接続設定を行います。パスワードを入力して、Next stepをクリックします。

Configure DB connection

Zabbix Serverの名前とタイムゾーン、テーマを設定します。Zabbix Server名のみ入力してNext stepをクリックします。

Settings

最終チェックです。内容を確認してNext stepをクリックします。

Pre-installation summary

無事セットアップが完了しました。

Congratulations! You have successfully installed Zabbix frontend.

Zabbixのアイテムの追加

Zabbixのアイテムの追加を行います。専用のホストは作成せずにZabbix Sereverに追加します。

ZabbixのWebコンソールにサインインします。デフォルトのUsernameはAdminでPasswordはzabbixです。

Sign in

Global viewが表示されました。System Informationの様子から各種データが取得できていそうですね。

Global view

アイテムを追加したいので、Configuration-HostsからZabbix ServerのItemsをクリックします。

Hosts

Create Itemをクリックします。

Create Item

アイテムを定義します。

Zabbix Senderでデータを送りつけるので、TypeはZabbix trapperとします。KeyはCloudWatch Alarmのイベントというのが分かりやすいようにcloudwatch.alarm.test-itemとしました。また、Allowed hostsは自ホストとVPCのCIDRを設定しました。

Add Item

ZabbixのTrapper itemの詳細は以下Zabbixの公式ドキュメントをご覧ください。

設定が完了したらAddをクリックします。

Zabbix Senderの動作確認

Zabbix Senderで作成したアイテムにデータを追加できるのか動作確認をしてみます。

Zabbix ServerにZabbix Senderをインストールします。

$ sudo dnf install zabbix-sender
Updating Subscription Management repositories.
Unable to read consumer identity

This system is not registered with an entitlement server. You can use subscription-manager to register.

Last metadata expiration check: 0:17:04 ago on Mon 07 Aug 2023 08:21:43 AM UTC.
Dependencies resolved.
=============================================================================================================================
 Package                        Architecture            Version                                Repository               Size
=============================================================================================================================
Installing:
 zabbix-sender                  x86_64                  6.0.20-release1.el9                    zabbix                  402 k

Transaction Summary
=============================================================================================================================
Install  1 Package

Total download size: 402 k
Installed size: 1.8 M
Is this ok [y/N]: y
Downloading Packages:
zabbix-sender-6.0.20-release1.el9.x86_64.rpm                                                 491 kB/s | 402 kB     00:00
-----------------------------------------------------------------------------------------------------------------------------
Total                                                                                        489 kB/s | 402 kB     00:00
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Preparing        :                                                                                                     1/1
  Installing       : zabbix-sender-6.0.20-release1.el9.x86_64                                                            1/1
  Running scriptlet: zabbix-sender-6.0.20-release1.el9.x86_64                                                            1/1
  Verifying        : zabbix-sender-6.0.20-release1.el9.x86_64                                                            1/1
Installed products updated.

Installed:
  zabbix-sender-6.0.20-release1.el9.x86_64

Complete!

zabbix_senderコマンドの詳細は以下Zabbix公式ドキュメントをご覧ください。

zabbix_senderで先ほど作成したアイテムに対して適当なテキストを送りつけます。

$ zabbix_sender -z 127.0.0.1 -s "Zabbix server" -k cloudwatch.alarm.test-item -o "test message"
Response from "127.0.0.1:10051": "processed: 1; failed: 0; total: 1; seconds spent: 0.000079"
sent: 1; skipped: 0; total: 1

作成したアイテムcloudwatch.alarm.test-itemを確認します。

test messageの確認

Zabbix Senderで送信したデータが登録されていますね。

CloudWatchアラームのタグ付け

AWS CDKでデプロイしてから気づいたのですが、CloudWatchアラームはAWS CDKでタグ付けができないようでした。

しょうがないので手動でCloudWatchアラームにZabbixのホストとキーを表すタグの付与を行います。

$ aws cloudwatch tag-resource \
  --resource-arn "arn:aws:cloudwatch:us-east-1:<AWSアカウントID>:alarm:alarm-test-to-zabbix" \
  --tags Key="Zabbix Host,Value"="Zabbix server"

$ aws cloudwatch tag-resource \
  --resource-arn "arn:aws:cloudwatch:us-east-1:<AWSアカウントID>:alarm:alarm-test-to-zabbix" \
  --tags Key="Zabbix Item Key,Value"="cloudwatch.alarm.test-item"

$ aws resourcegroupstaggingapi get-resources --resource-type-filters cloudwatch:alarm
{
    "ResourceTagMappingList": [
        {
            "ResourceARN": "arn:aws:cloudwatch:us-east-1:<AWSアカウントID>:alarm:alarm-test-to-zabbix",
            "Tags": [
                {
                    "Key": "Zabbix Host",
                    "Value": "Zabbix server"
                },
                {
                    "Key": "Zabbix Item Key",
                    "Value": "cloudwatch.alarm.test-item"
                }
            ]
        }
    ]
}

動作確認

それでは動作確認をします。

適当なStep Functionsのステートマシンを実行します。

しばらくすると、CloudWatchアラームがアラーム状態となり、Lambda関数が起動しました。

Lambda関数のログは以下の通りです。

INIT_START Runtime Version: python:3.11.v8	Runtime Version ARN: arn:aws:lambda:us-east-1::runtime:a96d37d47210bbc80cb11c50028140d002b18ce0f3a93200d92ac5cac3132669
START RequestId: 9943ef85-0b93-4368-b94d-16abc88e5f1e Version: $LATEST
[INFO]	2023-08-07T21:50:27.800Z	9943ef85-0b93-4368-b94d-16abc88e5f1e	{'version': '0', 'id': '5144d242-9da0-562f-4eac-6ab3c9494e7d', 'detail-type': 'CloudWatch Alarm State Change', 'source': 'aws.cloudwatch', 'account': '<AWSアカウントID>', 'time': '2023-08-07T21:50:27Z', 'region': 'us-east-1', 'resources': ['arn:aws:cloudwatch:us-east-1:<AWSアカウントID>:alarm:alarm-test-to-zabbix'], 'detail': {'alarmName': 'alarm-test-to-zabbix', 'state': {'value': 'ALARM', 'reason': 'Threshold Crossed: 1 datapoint [5000.0 (07/08/23 21:49:00)] was greater than the threshold (1.0).', 'reasonData': '{"version":"1.0","queryDate":"2023-08-07T21:50:27.439+0000","startDate":"2023-08-07T21:49:00.000+0000","statistic":"Average","period":60,"recentDatapoints":[5000.0],"threshold":1.0,"evaluatedDatapoints":[{"timestamp":"2023-08-07T21:49:00.000+0000","sampleCount":1.0,"value":5000.0}]}', 'timestamp': '2023-08-07T21:50:27.441+0000'}, 'previousState': {'value': 'INSUFFICIENT_DATA', 'reason': 'Insufficient Data: 1 datapoint was unknown.', 'reasonData': '{"version":"1.0","queryDate":"2023-08-07T21:42:27.441+0000","statistic":"Average","period":60,"recentDatapoints":[],"threshold":1.0,"evaluatedDatapoints":[{"timestamp":"2023-08-07T21:41:00.000+0000"}]}', 'timestamp': '2023-08-07T21:42:27.442+0000'}, 'configuration': {'metrics': [{'id': '72c4e800-7f7f-a89f-c1b1-6dc1c864eac3', 'metricStat': {'metric': {'namespace': 'AWS/States', 'name': 'ProvisionedRefillRate', 'dimensions': {'ServiceMetric': 'StateTransition'}}, 'period': 60, 'stat': 'Average'}, 'returnData': True}], 'description': 'test description'}}}
[INFO]	2023-08-07T21:50:27.954Z	9943ef85-0b93-4368-b94d-16abc88e5f1e	Found credentials in environment variables.
[INFO]	2023-08-07T21:50:28.714Z	9943ef85-0b93-4368-b94d-16abc88e5f1e	
{
    "processed": 1,
    "failed": 0,
    "total": 1,
    "time": "0.000255",
    "chunk": 1
}

END RequestId: 9943ef85-0b93-4368-b94d-16abc88e5f1e
REPORT RequestId: 9943ef85-0b93-4368-b94d-16abc88e5f1e	Duration: 933.61 ms	Billed Duration: 934 ms	Memory Size: 128 MB	Max Memory Used: 28 MB

問題なく送信できていそうですね。

Zabbixのアイテムも確認してみましょう。

アイテムの確認

CloudWatchアラームのイベントが追加されていました。

このまま放置していると、アラーム状態からデータ不足INSUFFICIENT_DATAに遷移したため、イベントがされに追加されました。

INSUFFICIENT_DATA

これであとはZabbixでトリガーやアクションを設定してあげれば、Zabbixによる監視ができそうです。

何が何でもZabbixと連携させたい時に

CloudWatchアラームのイベントをZabbixに連携させてみました。

何が何でもZabbixと連携させたい時にこちらの手法を使ってみてください。

ただ、繰り返しになりますが提供されていない機能を頑張って作り込んでまで実装するのは個人的にはオススメしません。今後の運用を考えると、できるだけシンプルにしたいところです。

Zabbixをはじめ、一つの製品にこだわり過ぎず、柔軟に対応することが望ましいと考えます。

この記事が誰かの助けになれば幸いです。

以上、AWS事業本部 コンサルティング部の のんピ(@non____97)でした!