どうしても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アラームやLambda関数、Zabbix側の事前準備としては以下があります。
- CloudWatch Alarmへの以下タグの付与
- Zabbixのホスト名
- Zabbixのアイテムのキー名
- Lambda関数の環境変数に以下を設定
- Zabbix ServerのIPアドレス
- Zabbix Serverのポート番号
- Zabbixのホストとアイテムの設定
- Zabbixのトリガー設定
CloudWatchアラームの状態が遷移した場合は以下の処理が行われます。
- EventBridgeでCloudWatch Alarmのイベント拾う
- イベントの条件には「CloudWatchアラーム名の末尾が
to-zabbix
」などZabbixに連携したいCloudWatchアラームで統一して設定できるプロパティを指定する
- イベントの条件には「CloudWatchアラーム名の末尾が
- Lambda関数を起動
- イベントのAlarm名と一致するCloudWatch Alarmのタグを取得
- Lambda関数に設定された環境変数を取得
- (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点が挙げられます。
- Zabbixのコンソールから監視対象のデータの遷移を確認することができない
- CloudWatchアラームの状態が遷移したときのデータしか確認できない
- CloudWatchアラームに対して料金がかかる
- 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エンドポイントを集約させるのもの良いでしょう。
検証環境
検証環境の構成図は以下の通りです。
今回は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の料金節約のため、allowPublicSubnet
をtrue
にした上で、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コンソールが表示されました。
Next step
をクリックします。
要件を満たしているかチェックされます。全てOKだったのでNext step
をクリックします。
DBとの接続設定を行います。パスワードを入力して、Next step
をクリックします。
Zabbix Serverの名前とタイムゾーン、テーマを設定します。Zabbix Server名のみ入力してNext step
をクリックします。
最終チェックです。内容を確認してNext step
をクリックします。
無事セットアップが完了しました。
Zabbixのアイテムの追加
Zabbixのアイテムの追加を行います。専用のホストは作成せずにZabbix Sereverに追加します。
ZabbixのWebコンソールにサインインします。デフォルトのUsernameはAdmin
でPasswordはzabbix
です。
Global viewが表示されました。System Informationの様子から各種データが取得できていそうですね。
アイテムを追加したいので、Configuration
-Hosts
からZabbix ServerのItems
をクリックします。
Create Item
をクリックします。
アイテムを定義します。
Zabbix Senderでデータを送りつけるので、TypeはZabbix trapper
とします。KeyはCloudWatch Alarmのイベントというのが分かりやすいようにcloudwatch.alarm.test-item
としました。また、Allowed hostsは自ホストとVPCのCIDRを設定しました。
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
を確認します。
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
に遷移したため、イベントがされに追加されました。
これであとはZabbixでトリガーやアクションを設定してあげれば、Zabbixによる監視ができそうです。
何が何でもZabbixと連携させたい時に
CloudWatchアラームのイベントをZabbixに連携させてみました。
何が何でもZabbixと連携させたい時にこちらの手法を使ってみてください。
ただ、繰り返しになりますが提供されていない機能を頑張って作り込んでまで実装するのは個人的にはオススメしません。今後の運用を考えると、できるだけシンプルにしたいところです。
Zabbixをはじめ、一つの製品にこだわり過ぎず、柔軟に対応することが望ましいと考えます。
この記事が誰かの助けになれば幸いです。
以上、AWS事業本部 コンサルティング部の のんピ(@non____97)でした!