zuntan02のはてなブログ

備忘録的なものです。時々職場の技術者ブログにも転記してますが、メインはこちらで。

ZabbixでCloudWatchの値を取得する

【概要】

aws-sdkを利用して、ELBやRDSをzabbixで監視する
zabbixの外部チェック機能を利用する

【参考】

aws-sdk-coreを利用して、ELBやRDSをzabbixで監視する | システム運用日記
↑ほぼここの内容のコピペですが、実行インスタンスにロールに権限がついてない場合、または別AWSアカウントで稼働しているzabbixから別のAWSアカウントの持つCloudWatchを監視するために、zabbixアカウントが利用するcredentialsに複数profileを書いて利用できるよう、一部追加しました

https://qiita.com/ryo0301/items/39308a5dc457b5df59ee
https://qiita.com/kenjiskywalker/items/2c29f8f532880cb81aef
https://gist.github.com/yokota-shinsuke/7350559
https://qiita.com/bakira/items/3a4876cbb39f9a7ec3b8

【作業ログ】

#Zabbixサーバにて以下のモジュールを導入
gem install aws-sdk-core

# aws-sdkのバージョン3ではうまく動かない模様。aws-sdk(v2)を追加でインストール
gem install aws-sdk -v "~>2"

gem list
(抜粋)
# aws-sdk (2.11.33)
# aws-sdk-core (3.19.0, 3.6.0, 2.11.33)
# aws-sdk-resources (2.11.33)

実行アカウントの設定

# ※複数のAWS認証情報を利用する場合は、profile機能を利用する
# aws hogehoge --profile ${profile}

AWS Management Console

# CloudWatch用IAMユーザ作成
ユーザ名:zabbix
AWSアクセスの種類:プログラムによるアクセス
グループ:CloudWatch(CloudWatchFullAccess)←とりあえずテストなのでこれくらいの権限で

zabbixサーバで認証情報登録

# zabbixユーザにbashを設定する

mkdir /var/lib/zabbix
cp -p /etc/skel/.bash_profile /var/lib/zabbix/

# zabbixアカウント用のアクセスキー等を配置

sudo -u zabbix aws configure
# AWS Access Key ID [None]: hogehoge
# AWS Secret Access Key [None]: fugafuga
# Default region name [None]: ap-northeast-1
# Default output format [None]:json
複数アカウントを利用できるようにプロファイルを用意しておく

vi /var/lib/zabbix/.aws/config

[profile awshoge]
output = json
region = ap-northeast-1

[default]
region = ap-northeast-1

vi /var/lib/zabbix/.aws/credentials

[awshoge]
aws_access_key_id = hogehoge
aws_secret_access_key = fugafuga

[default]
aws_access_key_id = XXXXXXXXXX
aws_secret_access_key = XXXXXXXXXXXX

zabbixから実行する cloud_watch を作成

vi /usr/lib/zabbix/externalscripts/cloud_watch

#!/usr/bin/ruby

require 'rubygems'
require 'aws-sdk'
require 'optparse'

params = ARGV.getopts(
  "",
  "region:",
  "profile:",
  "namespace:",
  "metric:",
  "dimension_name:",
  "dimension_value:",
  "statistics:",
  "unit:"
)


creds = Aws::SharedCredentials.new path: '/var/lib/zabbix/.aws/credentials', profile_name: params['profile']
Aws.config[:credentials] = creds

cw = Aws::CloudWatch::Client.new(
    :region => params['region'],
)

resp = cw.get_metric_statistics(
    namespace: params['namespace'],
    metric_name: params['metric'],
    dimensions: [
        {
            name: params['dimension_name'],
            value: params['dimension_value'],
        },
    ],
    start_time: Time.now - 300,
    end_time: Time.now,
    period: 300,
    statistics: [params['statistics']],
    unit: params['unit'],
)

    data = resp[:datapoints]
    last_stats = data.sort_by{ | stat | stat[:timestamp]}.last

        if last_stats.nil? then
                exit
        else
        p last_stats[params['statistics'].downcase.to_sym].to_i
    end

chmod 755 /usr/lib/zabbix/externalscripts/cloud_watch

# テスト実行

sudo -u zabbix /usr/lib/zabbix/externalscripts/cloud_watch --region ap-northeast-1 --namespace AWS/RDS --metric CPUUtilization --dimension_name DBInstanceIdentifier --dimension_value ホスト名 --statistics Average --profile awshoge

zabbixWebUIから設定

例:CPUUtilization

1.設定→テンプレート→テンプレートの作成ボタンを押下
ホスト名:RDS-awshoge
(そのほかはデフォルトのまま)にして作成

3.設定→テンプレート→「RDS-awshoge」の「アイテム 」リンクを押下
[アイテムの作成]にて

名前:RDS CPU Usage
タイプ:外部チェック
キー:cloud_watch["--metric","CPUUtilization","--dimension_name","DBInstanceIdentifier","--dimension_value","{HOST.NAME}","--statistics","Average","--namespace","AWS/RDS","--region","ap-northeast-1","--profile","awshoge"]
データ型:数値(浮動小数)
単位:%
更新間隔(秒):60
として作成

これで値が取れるようになりました。