AWS AutoSaling環境のEC2インスタンス監視をzabbixで自動化する
Auto Scalingで増減するEC2インスタンスの監視を自動化したい

実現したいこと
Amazon EC2 Auto Scaling環境において、増減するEC2インスタンスの登録・登録解除・監視設定を自動化する
インスタンスの自動登録についてはすでにZabbixで「自動登録アクション」機能が用意されているが、スケールイン時にインスタンスが終了した場合にホスト登録が残るためアラートが発生してしまうのが管理上の課題となっていました。
本件ではEC2インスタンスの起動時に登録解除スクリプトをEC2インスタンスに配置し、インスタンスが終了した際に配置したinitスクリプトが実行されることにより、自動でZabbixから登録解除がされるように構成しています。
これにより、Amazon EC2 Auto Scaling環境配下のEC2インスタンスの効率的な監視を実現しました。
前提条件
- インスタンスOSはAmazon Linux 2 で作成
- 監視ツールはZabbix 5.0 LTSを利用
- Amazon EC2 Auto Scalingグループ配下のEC2インスタンスを監視対象とする
- EC2インスタンスからインターネットへ接続可能
- EC2インスタンスからS3へ接続可能
- EC2インスタンスとZabbix環境はAWSプライベートネットワーク内で相互接続可能
構成手順
- Zabbixにて「自動登録アクション」を設定
- S3にZabbix登録解除用のスクリプトを配置
- Auto Scaling配下のEC2インスタンス用にロールを作成
- Auto Scalingグループの起動設定を作成
Zabbix にて「自動登録アクション」を設定
zabbix>設定>アクションから「自動登録アクション」を作成する
| 設定項目 | 設定内容 |
| 実行条件 | ホストメタデータ 含む:autoscaling ※zabbix-agent側と同一の文字列を指定 |
| 実行内容 | ホストを追加 ホストグループに追加:Linux server テンプレートとリンク:Template App HTTP Service |


S3にZabbix登録解除用のスクリプトを配置
S3にZabbix登録解除用のスクリプトを配置し、Auto Scaling配下のEC2インスタンスからGETできるようにする

スクリプト① DelHost.sh
#!/usr/bin/env bash
### Required envs
export ZABBIX_WEB_URL="http://[ZabbixサーバのPrivate IP]/zabbix/"
export ZABBIX_USERNAME="[管理用ユーザ]"
export ZABBIX_PASSWORD="[管理用ユーザのパスワード]"
### Go
CURL="curl -fsSL -m 15"
ZABBIX_API_URL="${ZABBIX_WEB_URL%/}/api_jsonrpc.php"
### ログイン認証トークン取得
res_user_login=$(
${CURL} \
-X POST "${ZABBIX_API_URL}" \
-H "Content-Type: application/json-rpc" \
-d @- <<___EOL___
{
"jsonrpc": "2.0",
"method": "user.login",
"params": {
"user": "${ZABBIX_USERNAME}",
"password": "${ZABBIX_PASSWORD}"
},
"id": ${RANDOM}
}
___EOL___
)
ret=${?}
if [ ${ret} -ne 0 ]; then
exit ${ret}
fi
auth=$(echo "${res_user_login}" | jq -r '.result // empty')
if [ -z "${auth}" ]; then
echo "${res_user_login}" >&2
exit 1
fi
## 監視削除ホスト情報取得
del_hostname=$(hostname)
res_host_get=$(
${CURL} \
-X POST "${ZABBIX_API_URL}" \
-H "Content-Type: application/json-rpc" \
-d @- <<___EOL___
{
"jsonrpc": "2.0",
"method": "host.get",
"params": {
"filter": {
"host": ["${del_hostname}"]}
},
"id": ${RANDOM},
"auth": "${auth}"
}
___EOL___
)
ret=${?}
if [ ${ret} -ne 0 ]; then
exit ${ret}
fi
hostid=$(echo "${res_host_get}" | jq -r '.result[0].hostid // empty' )
if [ -z "${hostid}" ]; then
exit 0
fi
## 監視ホスト削除
${CURL} \
-X POST "${ZABBIX_API_URL}" \
-H "Content-Type: application/json-rpc" \
-d @- <<___EOL___ > /dev/null
{
"jsonrpc": "2.0",
"method": "host.delete",
"params": ["${hostid}"],
"id": ${RANDOM},
"auth": "${auth}"
}
___EOL___
ret=${?}
if [ ${ret} -ne 0 ]; then
exit ${ret}
fi
## ログアウト
${CURL} \
-X POST "${ZABBIX_API_URL}" \
-H "Content-Type: application/json-rpc" \
-d @- <<___EOL___ > /dev/null
{
"jsonrpc": "2.0",
"method": "user.logout",
"params": [],
"id": ${RANDOM},
"auth": "${auth}"
}
___EOL___
ret=${?}
if [ ${ret} -ne 0 ]; then
exit ${ret}
fi
スクリプト② hostdel
#!/bin/bash
#
# Version: 0.1
#
# chkconfig: 345 99 01
# description: zabbix delhost
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
# Source function library.
. /etc/init.d/functions
servicename='hostdel'
lock_file="/var/lock/subsys/${servicename}"
start() {
touch ${lock_file}
}
stop() {
rm -f ${lock_file}
/usr/local/bin/DelHost.sh
}
restart() {
stop
start
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
*)
echo "Usage: $0 {start|stop|restart}"
exit 1
esac
exit 0
Auto Scaling配下のEC2インスタンス用にロールを作成
許可ポリシーに「AmazonS3ReadOnlyAccess」を追加したIAMロールを作成

Auto Scalingグループの起動設定を作成

IAMインスタンスプロファイル
「IAMインスタンスプロファイル」に前項で作成したロールを設定します。

ユーザデータ
インスタンス起動時に以下設定を行うようにユーザデータに記述します。
- zabbix-agentインストール
- zabbix-agentの設定
- zabbix-agentの起動
- jqインストール
- Amazon S3からスクリプトをGETし配置
- スクリプトをサービスとして登録し起動

ユーザデータ全文
#!/bin/bash ## zabbix-agentインストール rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/7/x86_64/zabbix-release-5.0-1.el7.noarch.rpm yum install -y zabbix-agent cp -p /etc/zabbix/zabbix_agentd.conf /etc/zabbix/zabbix_agentd.conf.org sed -i -e "s/^LogFileSize=0/LogFileSize=512/" \ -e "s/^Server=127.0.0.1$/Server=[ZabbixサーバのPrivate IP]/" \ -e "s/^ServerActive=127.0.0.1$/ServerActive=[ZabbixサーバのPrivate IP]/" \ -e "s/^Hostname=Zabbix server/# Hostname=Zabbix server/" \ -e "s/^# HostnameItem=system.hostname/HostnameItem=system.hostname/" \ -e "s/^# HostMetadata=/HostMetadata=[Zabbix自動登録アクションで設定したホストメタデータ文字列]/" \ -e "s/^# AllowRoot=0/AllowRoot=1/" \ /etc/zabbix/zabbix_agentd.conf systemctl start zabbix-agent ## jqインストール yum install -y jq ## Amazon S3からスクリプトをGETし配置 aws s3 cp s3://[S3バケット名]/DelHost.sh /usr/local/bin/DelHost.sh chmod 755 /usr/local/bin/DelHost.sh aws s3 cp s3://[S3バケット名]/hostdel /etc/init.d/hostdel chmod 755 /etc/init.d/hostdel ## スクリプトをサービスとして登録し起動 chkconfig --add hostdel chkconfig hostdel on service hostdel start #
動作確認
Auto Scalingグループの設定にて前項で作成した「起動設定」を設定する
グループ詳細より、グループサイズの容量を上げるなど、インスタンスが新規に立ち上がるよう変更

Zabbix管理画面のホスト項を確認し、インスタンスが自動登録されていることを確認

設定画面から「自動登録アクション」で設定した通り、テンプレートにリンクされていることも確認

グループサイズの容量を下げ、インスタンスが停止するよう変更(または手動でEC2をシャットダウン)
Zabbix管理画面のホスト項を確認し、インスタンスの登録が解除されていることを確認

まとめ
今回はすでに構築済みのAutoScaling環境への導入であったため、起動設定のユーザデータに設定を記述していますがAMIをカスタマイズできるようであれば事前にAMIを導入するといった方法も可能かと思います。
Blog初心者なのでBlogを書くのに苦労しました…。運用のお役に立てれば幸いです。
参考資料
https://www.zabbix.com/documentation/
テックブログ新着情報のほか、AWSやGoogle Cloudに関するお役立ち情報を配信中!
Follow @twitter2015年3月入社。新卒で某ホスティング会社に入社し、物理サーバをひたすらラッキングしたり構築したりしていましたが転職してからはクラウド中心になりました。ずっとインフラエンジニア。猫が好きです。
Recommends
こちらもおすすめ
-
Zabbixで名前解決ができているのか監視する
2023.12.15
-
第5回JAWS-UG初心者支部勉強会に参加してきました
2016.4.20
-
Zabbix6.0のネイティブHA機能を試してみた
2022.3.1
Special Topics
注目記事はこちら
データ分析入門
これから始めるBigQuery基礎知識
2024.02.28

AWSの料金が 10 %割引になる!
『AWSの請求代行リセールサービス』
2024.07.16
