[JAWS-UG CLI] CloudWatch:#6 カスタムメトリックの確認 (vpn-conn-monitor)

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


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

CloudWatchの読み取り権限があること。


AWS CLI
-------

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

- AWS CLI 1.11.8

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

```text:結果(例):
      aws-cli/1.11.7 Python/2.7.11 Darwin/15.6.0 botocore/1.4.64
```

バージョンが古い場合は最新版に更新しましょう。

```bash:コマンド:
sudo -H 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       lambdaFull-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. 名前空間の指定
-------------------

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

```bash:変数の設定:
CWATCH_NAMESPACE='VPNStatus'
```


1.2. メトリックの一覧
---------------------

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

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

Lambda関数の実行後、一覧表示されるまで1分ほど必要になるようです。

```json:結果:
      {
        "Metrics": [
          {
              "Namespace": "VPNStatus",
              "Dimensions": [
                  {
                      "Name": "CGW",
                      "Value": "cgw-xxxxxxxx"
                  },
                  {
                      "Name": "VGW",
                      "Value": "vgw-xxxxxxxx"
                  },
                  {
                      "Name": "Region",
                      "Value": "ap-northeast-1"
                  }
              ],
              "MetricName": "vpn-xxxxxxxx"
          }
        ]
      }
```

1.3. 変数の設定
---------------

カスタマゲートウェイIDを変数に格納します。

```bash:変数の設定(例):
VPC_CGW_ID='cgw-xxxxxxxx'
```


VPNゲートウェイ、を変数に格納します。

```bash:変数の設定(例):
VPC_VGW_ID='vgw-xxxxxxxx'
```


VPNコネクションのIDを変数に格納します。

```bash:変数の設定(例):
VPC_VPN_ID='vpn-xxxxxxxx'
```




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

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

ここでは、CGW ID、VGW ID、リージョン名をディメンションとして利用します
。

```bash:変数の設定:
CWATCH_DIMENSIONS="Name=CGW,Value=${VPC_CGW_ID} Name=VGW,Value=${VPC_VGW_ID} Name=Region,Value=${AWS_DEFAULT_REGION}" \
       && echo ${CWATCH_DIMENSIONS}
```


1.4. メトリック名の指定
-----------------------

```bash:変数の設定:
CWATCH_METRIC_NAME="${VPC_VPN_ID}"
```

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


2. 必要な要素の決定
===================


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

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

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


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

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

```bash:変数の設定:
TIME_BEFORE_MIN='1440'
```

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

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


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

実際に値を取ってみましょう。



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

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

ETX
```

```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-10-24T01:23:45Z",
              "Sum": 2.0,
              "Unit": "Count"
          }
        ],
        "Label": "vpn-xxxxxxxx"
      }
```



完了
====