CloudWatchの情報は2週間しか保持できないので長期的に保持したい場合、他の仕組みが必要です。
fluentdでCloudWatchのELBのメトリクスをZABBIXに渡す
どうやらZabbix、Fluentdと連携させると簡単にZabbix側で長期的にデータ保存できそうだったのでやってみました。
Zabbixの構築は初めてだったので、ZabbixサーバーのインストールやエージェントのインストールによるEC2の監視(本題からは外れますが)と併せて最後にCloudWatch連携をやってみました。
参考
- 改訂版 Zabbix統合監視実践入門 ~障害通知、傾向分析、可視化による省力運用
- Amazon LinuxにZabbix2.0.9をインストールしてみた
- fluentdでCloudWatchのELBのメトリクスをZABBIXに渡す
環境
- Amazon Linux AMI 2015.03 (HVM)
- Zabbix Agent 2.2
- Zabbix Server 2.2
- MySQL 5.6.23(RDS)
- td-agent-2.2.1-0.el2015.x86_64
Zabbixサーバーのインストール
Zabbixサーバー用DBの作成
ZabbixサーバーのバックエンドのDBはRDSでMySQLを構築します。
なお、パラメーターグループの文字エンコードはUTF8にしください。
Amazon RDS の MySQL で UTF-8 のデータベースを作る
設定は以下となったとして以降記載します。
- DB Instance Identifier->zabbix
- DB名->zabbix
- ユーザー名->zabbix
- パスワード->zabbixpassword
- エンドポイント->zabbix.cfunxik4b0cn.ap-northeast-1.rds.amazonaws.com
EC2の時刻設定
AmazonLinuxではデフォルトの時間がUTCとなっているのでJSTに変更します。
$cp /etc/localtime /etc/localtime.old
$cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
Zabbixサーバーのインストール、設定
最新は2.4のようでしたが、2.2がLTSのようなので今回はこちらを利用します。
まずはZabbixのリポジトリを追加します。
$sudo rpm -ivh http://repo.zabbix.com/zabbix/2.2/rhel/6/x86_64/zabbix-release-2.2-1.el6.noarch.rpm
次にZabbixサーバー本体及び必要なパッケージ群をインストールします。
$sudo yum install zabbix zabbix-server zabbix-server-mysql -y
次にZabbixデータベースに初期データのインポートをします。
EC2からmysqlへ接続できるようにするためのパッケージをインストールします。
$sudo yum install mysql -y
パッケージインストール時に併せてインストールされたSQLを実行します。
$cd /usr/share/doc/zabbix-server-mysql-2.2.9/create
$cat schema.sql images.sql data.sql |mysql -h zabbix.cfunxik4b0cn.ap-northeast-1.rds.amazonaws.com -uzabbix -p zabbix
# enter your db password
次にZabbixサーバーとDBの接続設定を行います。
- # DBHost=localhost
+ DBHost=zabbix.cfunxik4b0cn.ap-northeast-1.rds.amazonaws.com
- # DBPassword=
+ DBPassword=zabbixpassword
DBユーザー名をzabbix以外に設定した場合、DBUserについても上記ファイルで変更する必要が有ります。
次にZabbixサーバーを起動します。その後、自動起動の設定を有効にします。
$sudo service zabbix-server start
$sudo chkconfig zabbix-server on
Webインターフェースのインストール、設定
Zabbixサーバーの操作をGUIから行うために必要なインストール、設定を行います。
$sudo yum install zabbix-web zabbix-web-mysql zabbix-web-japanese
zabbixの設定ファイルを変更します。
- タイムゾーンをtokyoに変更
- アクセス権の変更
#
# Zabbix monitoring system php web frontend
#
Alias /zabbix /usr/share/zabbix
<Directory "/usr/share/zabbix">
Options FollowSymLinks
AllowOverride None
#Order allow,deny
#Allow from all
Require all granted
php_value max_execution_time 300
php_value memory_limit 128M
php_value post_max_size 16M
php_value upload_max_filesize 2M
php_value max_input_time 300
# php_value date.timezone Europe/Riga
php_value date.timezone Asia/Tokyo
</Directory>
<Directory "/usr/share/zabbix/conf">
#Order deny,allow
#Deny from all
Require all denied
<files *.php>
#Order deny,allow
#Deny from all
Require all denied
</files>
</Directory>
<Directory "/usr/share/zabbix/api">
#Order deny,allow
#Deny from all
Require all denied
<files *.php>
#Order deny,allow
#Deny from all
Require all denied
</files>
</Directory>
<Directory "/usr/share/zabbix/include">
#Order deny,allow
#Deny from all
Require all denied
<files *.php>
#Order deny,allow
#Deny from all
Require all denied
</files>
</Directory>
<Directory "/usr/share/zabbix/include/classes">
#Order deny,allow
#Deny from all
Require all denied
<files *.php>
#Order deny,allow
#Deny from all
Require all denied
</files>
</Directory>
設定反映のためにhttpdを再起動します。また、自動起動の設定をしておきます。
$sudo service httpd restart
$sudo chkconfig httpd on
http://{publlic DNS}/zabbix でアクセスできます。
アクセスすると設定状況の確認や接続先DBの情報の記載(テスト接続も可能)など色々聞かれるのでOKなど押します。完了するとサインアップ画面が表示されます。初期ログインユーザー名はadmin、パスワードはzabbixとなっています。
ログイン後、右上のprofileからAdminのパスワードを変更してください。(SecurityGroupで制限しつつ、パスワードも変更しておく)また、本画面で言語を日本語にも変更できますので変更しておいてください。
監視対象EC2にエージェントインストールしてCPUアイドル情報を取得する
Zabbixサーバーができたので、次にエージェントを監視対象のEC2に設定します。
以降の説明は以下という状態で記載します。
- ZabbixサーバーのプライベートIP->172.31.18.89
- 監視対象EC2のプライベートIP->172.31.22.37
なお、事前に以下のセキュリティグループ設定をしてください。
- 監視対象のEC2のinboundのSecurityGroup->Zabbixサーバーからの10050ポートの許可
- ZabbixサーバーのinboundのSecurityGroup->監視対象EC2からの10051ポートの許可
上記が正しく設定されているかの確認はtelnet
コマンドで可能です。1点目の確認の場合、Zabbixサーバーで以下のコマンドを実行すれば対応が確認です。
$telnet 172.31.22.37 10050
確認ができたら監視対象のEC2にSSHログインし、以下でZabbixエージェントをインストールします。
$sudo rpm -ivh http://repo.zabbix.com/zabbix/2.2/rhel/6/x86_64/zabbix-release-2.2-1.el6.noarch.rpm
$sudo yum install zabbix zabbix-agent
次にZabbixエージェントの設定ファイルを変更します Server にはZabbixサーバーのプライベートIPを設定しています。 Hostname には監視対象のEC2のホスト名を設定しています。
- Server=127.0.0.1
+ Server=172.31.18.89
- Hostname=Zabbix server
+ Hostname=ip-172-31-22-37
以下によってサービスの起動、OS再起動時の自動起動設定を行います。
$sudo service zabbix-agent start
$sudo chkconfig zabbix-agent on
上記実施後、Zabbixサーバーをブラウザで表示し、先ほどの監視対象のホストを登録します。
- Admin権限でログイン
- 設定->ホスト->ホストの作成
以下のように設定します。
- ホスト名->ip-172-31-22-37(監視対象EC2のzabbix_agentd.confのHostnameに記載した名称と同じでないとNG)
- 表示名->ip-172-31-22-37
- グループ->Linux Servers
- エージェントのインターフェース->172.31.22.37
次にアイテムを追加します。
今回はCPUのアイドル状態を取得するようにします。
- 設定->ホスト->ip-172-31-22-37->アイテム
- アイテムの作成
アイテムは以下にします。
- 名前->CPU(idle)
- キー->system.cpu.util[,idle]
- データ型->数値(浮動小数)
- 単位->%
問題なければ作成したアイテムのエラーの部分が緑のままとなります。
何かしら問題があるとエラーの部分が赤くなります。
以下トラブルシューティングの方法となります。
- Agent側の/var/log/zabbix/zabbix_agentd.logを確認してエラーが表示されていないか
- Server側の/var/log/zabbix/zabbix_server.logを確認をエラーが表示されていないか
また、zabbix_get
コマンドを使うことで監視対象EC2からアイテムのキーに指定した情報が取れるか確認できます。以下の2つ目のコマンドのようにZabbixエージェントで対応していない情報取得の記述をした場合、サポートされていない旨の表示がされます。
$sudo yum install zabbix-get
$zabbix_get -s 172.31.22.37 -k agent.version
2.2.9
$zabbix_get -s 172.31.22.37 -k system.cpu.util[all,user,argv1]
ZBX_NOTSUPPORTED
$zabbix_get -s 172.31.22.37 -k system.cpu.util[,idle]
99.583055
取得した内容は以下で確認ができます。
- 監視データ->最新データ
- ホスト(ip-172-31-22-37)->「+」を選択->グラフ
テンプレートを使って一度に複数の監視設定をする
いちいちアイテムを設定するのは面倒です。また、監視したい内容はサーバーの役割ごとに違いますが、LinuxサーバーであればとりあえずCPU、メモリはみたいなど定型化していると思います。
監視したい内容をまとめたものとして テンプレート というものが存在し、それをホストと関連付けることで一括で監視したい内容を設定できます。
- 設定->ホスト->ip-172-31-22-37
- テンプレート->「新規テンプレートをリンク」行の選択->Template OS Linux
- 追加
上記によってテンプレートで指定されている内容はまとめて監視設定することができます。
実際に何が監視されているかは以下で確認ができます。
- 監視データ->最新データ
CloudWatchだとカスタムメトリクスを設定しないと取得できないメモリの取得や他にも詳細な情報が取得できているのが確認できます。
テンプレートでは他にTemplate App HTTP ServiceやTemplate App MySQLなどがあるのでサーバーの役割に応じて設定すると管理も楽になるかと思います。
CloudWatchの情報をZabbixに保存させる
基本が分かったので一番やりたかったことをやります。
fluentdでCloudWatchのELBのメトリクスをZABBIXに渡す
上記を参考に今回はRDSのメトリックスを取得、登録してみました。
また、設定を行うEC2は監視対象のサーバーとしましたが、リソースに余裕があればZabbixサーバー自身に設定しても良いと思います。
IAMの作成
まず、EC2からCloudWatchの情報を取得するためのユーザーを作成します。
IAMのユーザーを作成し、Access Key IDとSecret Access Keyを控えます。ユーザーには CloudWatchReadOnlyAccess のロールを付与してCloudWatchへのアクセス権限を付与します。
Zabbixサーバーの設定
次にZabbixサーバー側の設定をします。
ホストを新規に作成します。名前は zabbix-cloudwatch としましたが、後の設定は監視対象のEC2と同じ設定です。(同じサーバーなので)
次にCloudWatchで取得できる値のアイテムを登録します。Zabbixにはエージェントからでなく、任意の値を送信することできるようでそれを利用しているようです。
今回は以下の値を取得しますのでそれぞれアイテムを登録します。
- CPUUtilization
- FreeStorageSpace
- DiskQueueDepth
- FreeableMemory
- SwapUsage,ReadIOPS
- ReadLatency
- ReadThroughput
- WriteIOPS
- WriteLatency
- WriteThroughput
例えばCPUUtilizationの場合、取得できる値は浮動小数点なので以下のように設定します。
- 名前->ZabbixRDSCPUUtilization(なんでもよい)
- タイプ->Zabbixトラッパー(固定)
- キー->cloudwatch.CPUUtilization
- データ型->数値(浮動小数)
- 単位->%
キー、データ型、単位は取得できる値によって違っているので事前に確認が必要です。
fluentdのインストール、設定
次にAmazonLinuxにfluentdをインストールとサービスの自動起動を設定します。
$curl -L http://toolbelt.treasuredata.com/sh/install-redhat-td-agent2.sh | sudo sh
$sudo chkconfig --add td-agent
今回利用するfluentdの2つのプラグインのインストールを行います。
$sudo /opt/td-agent/embedded/bin/fluent-gem install fluent-plugin-zabbix
$sudo /opt/td-agent/embedded/bin/fluent-gem install fluent-plugin-cloudwatch
はじめにCloudWatchの情報が取得できるか確認します。
以下のようにfluentdの設定を行います。確認のため、取得した内容は標準出力に表示するようにしています。
- aws_key_id->CloudWatchのread権限を付与したユーザーのAccess Key ID
- aws_sec_key->CloudWatchのread権限を付与したユーザーのSecret Access Key
- dimensions_value->取得したいRDSのDBInstanceIdentifier
<source>
type cloudwatch
tag cloudwatch
aws_key_id YOUR_AWS_KEY_ID
aws_sec_key YOUR_AWS_SECRET_KEY
cw_endpoint monitoring.ap-northeast-1.amazonaws.com
namespace AWS/RDS
metric_name CPUUtilization,FreeStorageSpace,DiskQueueDepth,FreeableMemory,SwapUsage,ReadIOPS,ReadLatency,ReadThroughput,WriteIOPS,WriteLatency,WriteThroughput
dimensions_name DBInstanceIdentifier
dimensions_value zabbix
</source>
<match cloudwatch>
type stdout
</match>
確認のためトレースモードで起動します。
sudo td-agent -vv &
・・・
2015-08-02 13:34:00 +0900 cloudwatch: {"CPUUtilization":0.8866666666666667}
2015-08-02 13:34:00 +0900 cloudwatch: {"FreeStorageSpace":4724633600.0}
2015-08-02 13:34:00 +0900 cloudwatch: {"DiskQueueDepth":0.008186666666666667}
2015-08-02 13:34:00 +0900 cloudwatch: {"FreeableMemory":453009408.0}
2015-08-02 13:34:00 +0900 cloudwatch: {"SwapUsage":0.0}
2015-08-02 13:34:00 +0900 cloudwatch: {"ReadIOPS":0.2866666666740741}
2015-08-02 13:34:00 +0900 cloudwatch: {"ReadLatency":0.0006742857142857143}
2015-08-02 13:34:00 +0900 cloudwatch: {"ReadThroughput":409.6002275821038}
2015-08-02 13:34:00 +0900 cloudwatch: {"WriteIOPS":8.069999278613889}
2015-08-02 13:34:00 +0900 cloudwatch: {"WriteLatency":0.0009094822149241531}
2015-08-02 13:34:00 +0900 cloudwatch: {"WriteThroughput":108011.49998660266}
上記のように情報が取得できればOKです。
問題なければ先ほど起動したプロセスは終了させます。
$ps aux|grep ruby|awk '{print $2;}'|sudo xargs kill -KILL
CloudWatchとの連携は大丈夫そうなので次に取得した情報をZabbixに流すようにします。
<source>
type cloudwatch
tag cloudwatch
aws_key_id YOUR_AWS_KEY_ID
aws_sec_key YOUR_AWS_SECRET_KEY
cw_endpoint monitoring.ap-northeast-1.amazonaws.com
namespace AWS/RDS
metric_name CPUUtilization,FreeStorageSpace,DiskQueueDepth,FreeableMemory,SwapUsage,ReadIOPS,ReadLatency,ReadThroughput,WriteIOPS,WriteLatency,WriteThroughput
dimensions_name DBInstanceIdentifier
dimensions_value zabbix
</source>
<match cloudwatch>
type copy
<store>
type zabbix
zabbix_server 172.31.18.89
port 10051
host zabbix-cloudwatch
name_keys CPUUtilization,FreeStorageSpace,DiskQueueDepth,FreeableMemory,SwapUsage,ReadIOPS,ReadLatency,ReadThroughput,WriteIOPS,WriteLatency,WriteThroughput
add_key_prefix cloudwatch
</store>
</match>
設定ができたのでtd-agentを再起動します。
$sudo td-agent restart
設定ファイルやその他問題がある場合には/var/log/td-agent/td-agent.log
などを確認して下さい。
問題なさそうであればZabbixで情報を確認してみます。
こんな感じで取得できていればバッチリです!