DynamoDBの接続状況、Nagiosで監視を。

踊る阿呆 Mitziです。geek目指しています。

# はじめに
cloudwatch APIでDynamoDBのリソース状況を監視することは可能ですが、
DynamoDBへ実際にアクセスしているEC2の接続状況を監視出来ないものか。

この課題、Nagios Pluginを自前で用意することで対処してみました。

## Amazon DynamoDBとは
![DynamoDB.png](https://qiita-image-store.s3.amazonaws.com/0/50310/c1681933-370d-7f81-8380-b364af0dcdeb.png)

公式サイトより
http://aws.amazon.com/jp/dynamodb/
http://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/Introduction.html
> Amazon DynamoDB は、1桁台のミリ秒単位のレイテンシーを必要とするすべての規模のアプリケーションに対応した高速かつフレキシブルな NoSQL データベースサービスです。

使っただけお金が掛かるそうなので、利用には注意らしいです。


# Index
00.　前提
01.　AWS SDK for PHP導入
02.　DynamoDBスキャンスクリプト
03.　Nagios Plugin(DynamoDB接続チェック)
04.　NRPE設定
05.　Nagios監視


# 00. 前提 

## ●検証環境
■Nagiosサーバ側
> CentOS: 6.3
> Nagios Core: 3.4.1
> nagios-nrpe: 2.12-1
> Apache: 2.2.15

■クライアント側(DynamoDBに接続するEC2)
> CentOS: 6.6
> nagios-nrpe: 2.14-1
> AWS SDK for PHP: 2.7
> PHP: 5.5.16


## ●Nagiosサーバ構築
![Nagios_logo.png](https://qiita-image-store.s3.amazonaws.com/0/50310/58182a31-8484-092b-51d0-914ab5a87c1a.png)

今回こちらが目的ではないため、新規に構築はせず既存のNagiosサーバを利用しました。
ちなみに当該Nagiosではアラートメール送信にSESを利用しています。

もし一から構築する場合は、nrpe含め yumを利用すると比較的簡単に実装出来ます。

## 01. AWS SDK for PHP導入
### ■公式を参照ください
こちらとてもシンプルですので、説明は公式に譲ります。

Getting Started with the AWS SDK for PHP
http://aws.amazon.com/jp/developers/getting-started/php/

EC2構築時にIAM Roleを利用している場合は、credentialキーの設定は必要ありません。
それはベタ書きを参照するよりシンプルで セキュアな環境となります。

### ■格納場所
DynamoDBスキャンスクリプトを実行するのは、nagiosユーザ。
そのためnagiosユーザが実行出来る階層にスクリプトともども格納する必要があります。

### ■vendorディレクトリの格納
AWS SDK for PHPはvendorディレクトリ配下にインストールされるため、
こちらをnagiosユーザが参照できる場所に格納します。

/usr/lib64/nagios/plugins/vendor


## 02. DynamoDBスキャンスクリプト

### ■公式を参考に
AWS SDK for PHP を使用してクエリを試行
http://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/GettingStartedPHPQuery.html

AWS SDK for PHP の低レベル API を使用したテーブルのスキャン
http://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/LowLevelPHPScanning.html

上記を参考に単純にテーブルをスキャンするスクリプトを作成

```bash
# vi /usr/lib64/nagios/plugins/dynamodb_check_conn.php
```

```php

<?php
require_once("/usr/lib64/nagios/plugins/vendor/autoload.php");　★参照先を上述のパスに合わせています

//ini_set( "display_errors", "Off");

use Aws\DynamoDb\DynamoDbClient;
use Aws\Common\Enum\Region;
use Aws\DynamoDb\Exception\DynamoDbException;

try{
  if(substr(gethostname(),2,1)=='y'){
    $client = DynamoDbClient::factory(array('region' => Region::SINGAPORE));
  }else{
    $client = DynamoDbClient::factory(array('region' => Region::TOKYO));
  }

  $env_flg=(substr(gethostname(),2,1));
  if($env_flg=='y'){
    $env_flg='h';
  }

  $TableList = $client->listTables();
  for($i = 0; $i < count($TableList['TableNames']); $i++){

    $tablename = $TableList['TableNames'][$i];

    if(preg_match("/^$env_flg/", $tablename)){

      $resulte = $client->scan(array(
        'TableName' => $tablename,
        'Limit' => 1,
      ));
    }
  }

  print 'OK' . PHP_EOL;

}catch(DynamoDbException $e){
  print 'NG' . PHP_EOL;
}
```

※上記はIAM Roleを利用した場合になります。
credentialsを利用する際は、ソース中に定義することも可能になります。


## 03. Nagios Plugin(DynamoDB接続チェック)
・02.のスクリプトを呼び出し、その結果をNRPEが判定できる値に変換するスクリプト。

```bash
# vi /usr/lib64/nagios/plugins/check_dynamodb_conn
# chmod 755 /usr/lib64/nagios/plugins/check_dynamodb_conn
#!/bin/sh

STATE_OK=0
STATE_WARNING=1
STATE_CRITICAL=2
STATE_UNKNOWN=3
STATE_DEPENDENT=4

ret=`php -e /usr/lib64/nagios/plugins/dynamodb_check_conn.php`

if test ${ret} = OK ; then
  echo "Status is OK"
  exit $STATE_OK

elif test ${ret} = NG ; then
  echo "Status is CRITICAL"
  exit $STATE_CRITICAL

else
  echo "Status is UNKNOWN"
  exit $STATE_UNKNOWN
fi
```
※echo結果は、Nagios GUIの「Status Information」に反映されます。

## 04. NRPE設定
Nagiosから03.のpluginを呼び出せるよう下記のように設定します。

```bash 
# vi /etc/nagios/nrpe.cfg
-----------------------
command[check_dynamodb_conn]=/usr/lib64/nagios/plugins/check_dynamodb_conn
```

・設定反映

```bash 
# service nrpe restart
```

・Nagiosサーバから動作確認

```bash 
# /usr/lib64/nagios/plugins/check_nrpe -H <EIP> -c check_dynamodb_conn
Status is OK
```

コマンドを直に叩き監視出来ることを確認出来ました。


## 05. Nagios監視
・各EC2監視に以下のように設定

```bash 
define service{
    use                    <サービス名>
    host_name              <ホスト名>
    service_description    DynamoDB Connect
    service_groups         dynamodb
    normal_check_interval  1
    check_command          check-nrpe2-cloudpack!check_dynamodb_conn
}
```

> ※servicegroup.cfg に 「dynamodb」を追記しています。
> ※check-nrpe2-cloudpackは、　`「$USER1$/check_nrpe -H $HOSTADDRESS$ -c $ARG1$」` と定義したコマンドになります。

・構文チェック

```bash 
# nagios -v /etc/nagios/nagios.cfg
```  

・設定反映

```bash 
# service nagios restart
```

# おわり
![Nagios_GUIキャプチャ.png](https://qiita-image-store.s3.amazonaws.com/0/50310/0569bcad-cf41-e0ad-85cd-6bfd21c3844f.png)

・Nagios GUIより監視出来ていることが確認出来ました。


以上になります。