背景
AWS内の監視について、EC2の監視についてはZABBIXサーバを使用している。
マネージドサービス(下記の例だとFSX)の監視についてはCloudWatchを使用している。
メール通知の内容を見やすくするためEventBridgeを挟んでいる。(入力トランスフォーマーを使用)
しかし、これだとマネージドサービスの状態やグラフ確認の際、CloudWatchの画面を参照する必要がある。
下記の様にZABBIXからCloudWatchのAPIをたたいて情報取得すれば、ZABBIXコンソールから一元管理可能となる。
環境
- Python 3.6.8
- zabbix_server (Zabbix) 5.0.18
ZABBIXの外部チェックを利用する。外部チェックでシェルスクリプトをキック。
(この際、実行するファイル名に加え、メトリクス名、インスタンスID等を引数として指定する。)
シェルスクリプトからPythonのスクリプトをキックする。
この中でget_metric_statics APIを使用してCloudWatchから値を取得する。
参考
Boto3公式ドキュメント(get_metric_statistics)
手順
事前準備
- Pythonのインストール
yum install python3
pip3 install boto3
- IAMロールの設定
手順は割愛します。CloudWatchにアクセス可能なポリシーを付与したIAMロールを作成してEC2に付与します。
ZABBIXがオンプレの場合はAWS Configureでアクセスキーを埋め込み。
スクリプト用意
- 外部ファイルを置く場所に移動
ZABBIXの設定ファイルの中にパスの記載があります。
cat /etc/zabbix/zabbix_server.conf | grep ExternalScripts
### Option: ExternalScripts
# ExternalScripts=${datadir}/zabbix/externalscripts
ExternalScripts=/usr/lib/zabbix/externalscripts
cd /usr/lib/zabbix/externalscripts
- Pythonスクリプト準備
今回はテストでEC2のCPU利用率を取得するスクリプトを作成しました。
他のマネージサービスについてもパラーメータを変更すれば取得可能です。
import boto3
import datetime
import sys
args = sys.argv
name_space = args[1]
metric_name = args[2]
dimensions = args[3]
dimensions_value = args[4]
def get_metrics(name_space,metric_name,dimensions,dimensions_value):
client = boto3.client('cloudwatch',
region_name='ap-northeast-1')
response = client.get_metric_statistics(
Namespace = name_space,
MetricName = metric_name,
Dimensions = [
{
'Name': dimensions,
'Value': dimensions_value
},
],
StartTime=datetime.datetime.utcnow() - datetime.timedelta(seconds=600),
EndTime=datetime.datetime.utcnow(),
Period = 300,
Statistics = ['Average']
)
response = float(response['Datapoints'][0]['Average'])
print('{:.3g}'.format(response))
get_metrics(name_space,metric_name,dimensions,dimensions_value)
シェルスクリプトから引数を受取りget_metrics関数を実行します。
関数の中で期間などを指定してCloudWatchから値を取得します。
CPU使用率の小数点以下の桁数が多いので丸めています。
※パラメータ等は公式資料を参照下さい。
- シェルスクリプト準備
このシェルをZABBIXの外部チェックで呼び出します。
python3 /usr/lib/zabbix/externalscripts/cloudwatch.py $1 $2 $3 $4
- 実行権限付与
chmod 755 cloudwatch.sh
ZABBIX側設定
- マクロ設定
アイテムのキーに直接インスタンスIDなどを指定しても良いですが、汎用的な作りにするためにマクロに値を設定します。
マクロ | 値 |
---|---|
{$NAME_SPACE1} | AWS/EC2 |
{$METRIC_NAME1} | CPUUtilization |
{$DIMENSIONS1} | InstanceId |
{$DIMENSIONS_VALUE1} | i-xxxxxxxxxxxxxxxxxxxxxx |