AWS AutoSaling環境のEC2インスタンス監視をzabbixで自動化する

AWS

2022.9.9

Topics

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

 

AutoScaling環境とzabbixの相互連携イメージ図

実現したいこと

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プライベートネットワーク内で相互接続可能

構成手順

  1. Zabbixにて「自動登録アクション」を設定
  2. S3にZabbix登録解除用のスクリプトを配置
  3. Auto Scaling配下のEC2インスタンス用にロールを作成
  4. Auto Scalingグループの起動設定を作成

Zabbix にて「自動登録アクション」を設定

zabbix>設定>アクションから「自動登録アクション」を作成する

設定項目 設定内容
実行条件 ホストメタデータ 含む:autoscaling ※zabbix-agent側と同一の文字列を指定
実行内容 ホストを追加
ホストグループに追加:Linux server
テンプレートとリンク:Template App HTTP Service

 

zabbixにて自動登録アクションの設定(アクション)をした図

zabbixにて自動登録アクションの設定(実行内容)をした図

S3にZabbix登録解除用のスクリプトを配置

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

S3に自動登録解除用スクリプトをアップロードした図

スクリプト① 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ロールを作成

EC2インスタンス用のロールを作成した図

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

AutoScaling グループの起動設定を作成した図

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

IAMインスタンスプロファイルに作成したロールを設定した図

ユーザデータ
インスタンス起動時に以下設定を行うようにユーザデータに記述します。

  1. zabbix-agentインストール
  2. zabbix-agentの設定
  3. zabbix-agentの起動
  4. jqインストール
  5. Amazon S3からスクリプトをGETし配置
  6. スクリプトをサービスとして登録し起動

起動設定のユーザデータに設定を記入した図
ユーザデータ全文

#!/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グループの設定にて前項で作成した「起動設定」を設定する
グループ詳細より、グループサイズの容量を上げるなど、インスタンスが新規に立ち上がるよう変更

Auto Scalingグループのグループ詳細より、グループサイズの容量変更をした図
Zabbix管理画面のホスト項を確認し、インスタンスが自動登録されていることを確認

zabbix管理画面にて監視インスタンスの自動登録がされていることを確認した図
設定画面から「自動登録アクション」で設定した通り、テンプレートにリンクされていることも確認

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

zabbix管理画面にてインスタンスの登録が解除されていることを確認した図

まとめ

今回はすでに構築済みのAutoScaling環境への導入であったため、起動設定のユーザデータに設定を記述していますがAMIをカスタマイズできるようであれば事前にAMIを導入するといった方法も可能かと思います。
Blog初心者なのでBlogを書くのに苦労しました…。運用のお役に立てれば幸いです。

参考資料

https://www.zabbix.com/documentation/

saitama

2015年3月入社。新卒で某ホスティング会社に入社し、物理サーバをひたすらラッキングしたり構築したりしていましたが転職してからはクラウド中心になりました。ずっとインフラエンジニア。猫が好きです。

Recommends

こちらもおすすめ

Special Topics

注目記事はこちら