ZabbixとFluentdを使ってCloudWatchの情報を長期保存する

CloudWatchの情報は2週間しか保持できないので長期的に保持したい場合、他の仕組みが必要です。

[fluentdでCloudWatchのELBのメトリクスをZABBIXに渡す](http://blog.kenjiskywalker.org/blog/2013/03/21/cloudwatch-fluentd-zabbix/)

どうやらZabbix、Fluentdと連携させると簡単にZabbix側で長期的にデータ保存できそうだったのでやってみました。
Zabbixの構築は初めてだったので、ZabbixサーバーのインストールやエージェントのインストールによるEC2の監視(本題からは外れますが)と併せて最後にCloudWatch連携をやってみました。

# 参考

+ [改訂版 Zabbix統合監視実践入門 ~障害通知、傾向分析、可視化による省力運用](http://www.amazon.co.jp/Zabbix%E7%B5%B1%E5%90%88%E7%9B%A3%E8%A6%96%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80-~%E9%9A%9C%E5%AE%B3%E9%80%9A%E7%9F%A5%E3%80%81%E5%82%BE%E5%90%91%E5%88%86%E6%9E%90%E3%80%81%E5%8F%AF%E8%A6%96%E5%8C%96%E3%81%AB%E3%82%88%E3%82%8B%E7%9C%81%E5%8A%9B%E9%81%8B%E7%94%A8-Software-Design-plus/dp/4774165433/ref=sr_1_1?ie=UTF8&qid=1438493597&sr=8-1&keywords=zabbix)
+ [Amazon LinuxにZabbix2.0.9をインストールしてみた](http://dev.classmethod.jp/cloud/aws/zabbix2_0_9-on-amazon-linux/)
+ [fluentdでCloudWatchのELBのメトリクスをZABBIXに渡す](http://blog.kenjiskywalker.org/blog/2013/03/21/cloudwatch-fluentd-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 のデータベースを作る](http://dotnsf.blog.jp/archives/2211314.html)


設定は以下となったとして以降記載します。

+ 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サーバーのインストール、設定

[Zabbix Packages](http://www.zabbix.com/download.php)

最新は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の接続設定を行います。

```lang:/etc/zabbix/zabbix_server.conf
- # 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に変更
+ アクセス権の変更


```lang:/etc/httpd/conf.d/zabbix.conf
#
# 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で制限しつつ、パスワードも変更しておく)また、本画面で言語を日本語にも変更できますので変更しておいてください。

![Screen Shot 2015-08-01 at 9.52.28 AM.png](https://qiita-image-store.s3.amazonaws.com/0/20193/763f6f43-9339-1625-9333-b0daffc86f88.png "Screen Shot 2015-08-01 at 9.52.28 AM.png")

# 監視対象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のホスト名を設定しています。

```lang:/etc/zabbix/zabbix_agentd.conf
- 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

![Screen Shot 2015-08-02 at 10.14.25 AM.png](https://qiita-image-store.s3.amazonaws.com/0/20193/07ba44df-3330-9605-b9db-ce7033635b57.png "Screen Shot 2015-08-02 at 10.14.25 AM.png")

次にアイテムを追加します。
今回はCPUのアイドル状態を取得するようにします。

+ 設定->ホスト->ip-172-31-22-37->アイテム
+ アイテムの作成

アイテムは以下にします。

+ 名前->CPU(idle)
+ キー->system.cpu.util[,idle]
+ データ型->数値(浮動小数)
+ 単位->%

![Screen Shot 2015-08-02 at 10.43.19 AM.png](https://qiita-image-store.s3.amazonaws.com/0/20193/7d6c6ca3-70bf-b544-a4aa-d215eaf67f0d.png "Screen Shot 2015-08-02 at 10.43.19 AM.png")


問題なければ作成したアイテムのエラーの部分が緑のままとなります。

![Screen Shot 2015-08-02 at 10.41.11 AM.png](https://qiita-image-store.s3.amazonaws.com/0/20193/89c6b6e6-8406-3a3e-09e5-c1a31dba8453.png "Screen Shot 2015-08-02 at 10.41.11 AM.png")


何かしら問題があるとエラーの部分が赤くなります。
以下トラブルシューティングの方法となります。

+ 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)->「+」を選択->グラフ

![Screen Shot 2015-08-02 at 10.48.15 AM.png](https://qiita-image-store.s3.amazonaws.com/0/20193/b989e612-efdb-7b3f-d0af-9d94fb061a69.png "Screen Shot 2015-08-02 at 10.48.15 AM.png")

# テンプレートを使って一度に複数の監視設定をする

いちいちアイテムを設定するのは面倒です。また、監視したい内容はサーバーの役割ごとに違いますが、LinuxサーバーであればとりあえずCPU、メモリはみたいなど定型化していると思います。

監視したい内容をまとめたものとして **テンプレート**　というものが存在し、それをホストと関連付けることで一括で監視したい内容を設定できます。

+ 設定->ホスト->ip-172-31-22-37
+ テンプレート->「新規テンプレートをリンク」行の選択->Template OS Linux
+ 追加

上記によってテンプレートで指定されている内容はまとめて監視設定することができます。

実際に何が監視されているかは以下で確認ができます。

+ 監視データ->最新データ

![Screen Shot 2015-08-02 at 11.33.22 AM.png](https://qiita-image-store.s3.amazonaws.com/0/20193/6c22e95c-7479-e2f8-afce-77fd4f86fbc0.png "Screen Shot 2015-08-02 at 11.33.22 AM.png")

CloudWatchだとカスタムメトリクスを設定しないと取得できないメモリの取得や他にも詳細な情報が取得できているのが確認できます。

テンプレートでは他にTemplate App HTTP ServiceやTemplate App MySQLなどがあるのでサーバーの役割に応じて設定すると管理も楽になるかと思います。

# CloudWatchの情報をZabbixに保存させる

基本が分かったので一番やりたかったことをやります。

[fluentdでCloudWatchのELBのメトリクスをZABBIXに渡す](http://blog.kenjiskywalker.org/blog/2013/03/21/cloudwatch-fluentd-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をインストールとサービスの自動起動を設定します。

[td-agent2をAmazon Linuxで実行する](http://dev.classmethod.jp/cloud/td-agent2-amazon-linux/)

```
$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

```lang:/etc/td-agent/td-agent.conf
<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に流すようにします。

```lang:/etc/td-agent/td-agent.conf
<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で情報を確認してみます。

![Screen Shot 2015-08-02 at 2.26.27 PM.png](https://qiita-image-store.s3.amazonaws.com/0/20193/13844627-2298-f08e-5214-db21f2fe60e3.png "Screen Shot 2015-08-02 at 2.26.27 PM.png")

こんな感じで取得できていればバッチリです!