[JAWS-UG CLI] CloudWatch:#1 メトリックを見る (SNS)

AWS CLIを利用してCloudWatchのメトリックを見てみます。
今回は、SNSを例として使います。


前提条件
========

CloudWatchへの権限
-----------

SNSに対して読み取り権限があること。


SNSへの権限
-----------

SNSに対してフル権限があること。


AWS CLIのバージョン
-------------------

以下のバージョンで動作確認済

* AWS CLI 1.10.26

```bash:コマンド:
aws --version
```

```text:結果(例):
aws-cli/1.10.26 Python/2.7.11 Darwin/15.4.0 botocore/1.4.17
```

バージョンが古い場合は最新版に上げることをオススメします。

```bash:コマンド(OSXの場合)
sudo -H /opt/local/bin/pip install -U awscli 
```


0. 準備
=======


0.1. リージョンの決定
---------------------

利用するリージョンを決めます。 (カレントユーザが利用するカレントリージ
ョンも切り変わります。)

```bash:変数の設定(東京リージョンの場合):
export AWS_DEFAULT_REGION='ap-northeast-1'
```


0.2. 変数の確認
---------------

プロファイルが想定のものになっていることを確認します。

```bash:コマンド:
aws configure list
```

```text:結果(例):
            Name                    Value             Type    Location
            ----                    -----             ----    --------
         profile         admin-prjz-mbp13        env    AWS_DEFAULT_PROFILE
      access_key     ****************XXXX shared-credentials-file
      secret_key     ****************XXXX shared-credentials-file
          region                         ap-northeast-1  env    AWS_DEFAULT_REGION
```

1. 事前作業
===========

1.1. トピックの指定
-------------------

対象となるトピックを指定します。

```bash:変数の設定:
SNS_TOPIC_NAME="$(date +%Y%m%d)-handson-topic" \
  && echo ${SNS_TOPIC_NAME}
```

そのリージョンでユニークである必要があります。

すでに同じ名前のトピックが存在しないことを確認します。

```bash:コマンド:
aws sns list-topics |\
        grep ${SNS_TOPIC_NAME}
```

```text:結果:
      (戻り値なし)
```


1.2. トピックの作成
---------------------

以下の手順でトピックを作成してください。

* トピックの作成 http://qiita.com/tcsh/items/e05e21e7338668cbf3b8
* 通知先の登録 (e-mail) http://qiita.com/tcsh/items/ca81576b0018bfa32cbe





2. 対象の指定
=============


2.1. 名前空間の指定
--------------

CloudWatchの名前空間を指定します。

```bash:変数の設定:
CWATCH_NAMESPACE='AWS/SNS'
```


2.2. ディメンションの指定
--------------------

CloudWatchのディメンションを指定します。

ここでは、トピック名をディメンションとして利用します。

```bash:変数の設定:
CWATCH_DIMENSIONS="Name=TopicName,Value=${SNS_TOPIC_NAME}"
```



3. メトリックの一覧
===================

指定した名前空間の指定したディメンションで利用できるメトリックの一覧を表示してみましょう。

```bash:コマンド:
aws cloudwatch list-metrics \
       --namespace ${CWATCH_NAMESPACE} \
       --dimensions ${CWATCH_DIMENSIONS}
```

SNSトピックの作成後、一覧表示されるまで5-10分ほど必要になるようです。


```json:結果:
   {
       "Metrics": [
           {
               "Namespace": "AWS/SNS", 
               "Dimensions": [
                   {
                       "Name": "TopicName", 
                       "Value": "example-topic"
                   }
               ], 
               "MetricName": "PublishSize"
           }, 
           {
               "Namespace": "AWS/SNS", 
               "Dimensions": [
                   {
                       "Name": "TopicName", 
                       "Value": "example-topic"
                   }
               ], 
               "MetricName": "NumberOfNotificationsDelivered"
           }, 
           {
               "Namespace": "AWS/SNS", 
               "Dimensions": [
                   {
                       "Name": "TopicName", 
                       "Value": "example-topic"
                   }
               ], 
               "MetricName": "NumberOfMessagesPublished"
           }, 
           {
               "Namespace": "AWS/SNS", 
               "Dimensions": [
                   {
                       "Name": "TopicName", 
                       "Value": "example-topic"
                   }
               ], 
               "MetricName": "NumberOfNotificationsFailed"
           }
       ]
   }
```

SNSトピックの作成直後だと、PublishSizeは無いかもしれません。



4. 統計情報の範囲、周期の決定
=============================


4.1. 統計周期の決定
-------------------

統計情報の取得単位(周期)を秒単位で指定します。
ここでは5分(300秒)周期にしてみます。

```bash:変数の設定:
CWATCH_STAT_PERIOD='300'
```


4.2. 統計期間の決定
-------------------

統計情報の対象期間を指定します。
ここでは、24時間(1440分)前から現在を対象にしてみます。

```bash:変数の設定:
CWATCH_END_TIME=`date -u '+%FT%TZ'` \
     && echo ${CWATCH_END_TIME}
   TIME_BEFORE_MIN='1440'
```

```bash:変数の設定(OSX/BSD系OSの場合):
CWATCH_START_TIME=`date -u -v-${TIME_BEFORE_MIN}M '+%FT%TZ'` \
     && echo ${CWATCH_START_TIME}
```

```bash:変数の設定(Linux系OSの場合):
CWATCH_START_TIME=`date -u -d "${TIME_BEFORE_MIN} mins ago" '+%FT%TZ'` \
     && echo ${CWATCH_START_TIME}
```


5. 統計情報の確認
=========================================

http://docs.aws.amazon.com/sns/latest/dg/MonitorSNSwithCloudWatch.html

利用できるメトリックから、実際に値を取ってみましょう。
SNSトピック作成直後であれば、残念ながら全て空になっているはずです。

以下の値は、固定のまま利用し、CWATCH_METRIC_NAMEとCWATCH_STATISTICSの値を適宜切り変えていきます。

```bash:変数の確認:
cat << ETX

CWATCH_NAMESPACE:   ${CWATCH_NAMESPACE}
CWATCH_START_TIME:  ${CWATCH_START_TIME}
CWATCH_END_TIME:    ${CWATCH_END_TIME}
CWATCH_STAT_PERIOD: ${CWATCH_STAT_PERIOD}
CWATCH_DIMENSIONS:  ${CWATCH_DIMENSIONS}

ETX
```


5.1. NumberOfMessagesPublished
-------------------------

metric名と集計方法を決定します。

```bash:変数の設定:
CWATCH_METRIC_NAME='NumberOfMessagesPublished'
CWATCH_STATISTICS='Sum'
```

```bash:コマンド:
aws cloudwatch get-metric-statistics \
     --namespace ${CWATCH_NAMESPACE} \
     --metric-name ${CWATCH_METRIC_NAME} \
     --start-time ${CWATCH_START_TIME} \
     --end-time ${CWATCH_END_TIME} \
     --period ${CWATCH_STAT_PERIOD} \
     --statistics ${CWATCH_STATISTICS} \
     --dimensions ${CWATCH_DIMENSIONS}
```

```json:結果(データが存在する場合の例):
{
    "Datapoints": [
        {
            "Timestamp": "2015-01-05T00:02:00Z", 
            "Sum": 0.0, 
            "Unit": "Count"
        }
    ], 
    "Label": "NumberOfMessagesPublished"
}
```

```json:結果(データが存在しない場合の例):
{
    "Datapoints": [], 
    "Label": "NumberOfMessagesPublished"
}
```



5.2. PublishSize
-----------

metric名を決定します。

```bash:変数の設定:
CWATCH_METRIC_NAME='PublishSize'
```

集計方法を決定します。
PublishSizeは、以下の4種類の集計方法を選択できます。

```bash:変数の設定:
CWATCH_STATISTICS='Minimum'
CWATCH_STATISTICS='Maximum'
CWATCH_STATISTICS='Average'
CWATCH_STATISTICS='SampleCount'
```

```bash:コマンド:
aws cloudwatch get-metric-statistics \
     --namespace ${CWATCH_NAMESPACE} \
     --metric-name ${CWATCH_METRIC_NAME} \
     --start-time ${CWATCH_START_TIME} \
     --end-time ${CWATCH_END_TIME} \
     --period ${CWATCH_STAT_PERIOD} \
     --statistics ${CWATCH_STATISTICS} \
     --dimensions ${CWATCH_DIMENSIONS}
```

```json:結果:
   {
     "Datapoints": [],
     "Label": "PublishSize"
   }
```


5.3. NumberOfNotificationsDelivered
------------------------------

metric名と集計方法を決定します。

```bash:変数の設定:
CWATCH_METRIC_NAME='NumberOfNotificationsDelivered'
CWATCH_STATISTICS='Sum'
```

```bash:コマンド:
aws cloudwatch get-metric-statistics \
     --namespace ${CWATCH_NAMESPACE} \
     --metric-name ${CWATCH_METRIC_NAME} \
     --start-time ${CWATCH_START_TIME} \
     --end-time ${CWATCH_END_TIME} \
     --period ${CWATCH_STAT_PERIOD} \
     --statistics ${CWATCH_STATISTICS} \
     --dimensions ${CWATCH_DIMENSIONS}
```

```json:結果(データが存在する場合の例):
{
    "Datapoints": [
        {
            "Timestamp": "2016-05-09T05:19:00Z", 
            "Sum": 1.0, 
            "Unit": "Count"
        }
    ], 
    "Label": "NumberOfNotificationsDelivered"
}
```

```json:結果(データが存在しない場合の例):
   {
     "Datapoints": [],
     "Label": "NumberOfNotificationsDelivered"
   }
```


5.4. NumberOfNotificationsFailed
---------------------------

metric名を決定します。

```bash:変数の設定:
CWATCH_METRIC_NAME='NumberOfNotificationsFailed'
```

集計方法を決定します。
NumberOfNotificationsFailedは、以下の2種類の集計方法を選択できます。

```bash:変数の設定:
CWATCH_STATISTICS='Sum'
CWATCH_STATISTICS='Average'
```

```bash:コマンド:
aws cloudwatch get-metric-statistics \
     --namespace ${CWATCH_NAMESPACE} \
     --metric-name ${CWATCH_METRIC_NAME} \
     --start-time ${CWATCH_START_TIME} \
     --end-time ${CWATCH_END_TIME} \
     --period ${CWATCH_STAT_PERIOD} \
     --statistics ${CWATCH_STATISTICS} \
     --dimensions ${CWATCH_DIMENSIONS}
```

```json:結果(データが存在する場合の例):
{
    "Datapoints": [
        {
            "Timestamp": "2016-05-09T05:19:00Z", 
            "Average": 0.0, 
            "Unit": "Count"
        }
    ], 
    "Label": "NumberOfNotificationsFailed"
}
```

```json:結果(データが存在しない場合の例):
   {
     "Datapoints": [],
     "Label": "NumberOfNotificationsFailed"
   }
```


完了
====

CloudWatchに保存されたSNSの監視情報について見ることができました。