[JAWS-UG CLI] CloudWatch:#5 アラームの設定 (IAM変更の検知)

AWS CLIを利用して、CloutWatch Logsで設定したメトリックフィルタのデータに対してアラームの設定をしてみます。


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


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

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


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

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

  * AWS CLI 1.7.22

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

結果(例):

      aws-cli/1.7.26 Python/2.7.5 Darwin/13.4.0


0. 準備
=======


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

作成するユーザのデフォルトリージョンを決めます。

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

```bash:コマンド(アイルランドリージョンの場合):
export AWS_DEFAULT_REGION='eu-west-1'
```


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

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

```bash:変数の確認:
aws configure list
```

結果(例):

            Name                    Value             Type    Location
            ----                    -----             ----    --------
         profile       cloudwatchFull-prjZ-mbp13iamFull-prjZ-mbp13              env    AWS_DEFAULT_PROFILE
      access_key     ****************XXXX shared-credentials-file
      secret_key     ****************XXXX shared-credentials-file
          region                eu-west-1              env    AWS_DEFAULT_REGION


0.3. 名前空間の確認
-------------------

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

        CWATCH_NAMESPACE: ${CWATCH_NAMESPACE}

ETX
```


0.4. メトリック名の確認
-----------------------

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

        CWATCH_METRIC_NAME: ${CWATCH_METRIC_NAME}

ETX
```


0.5. メトリックの存在確認
-------------------------

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

結果:

      {
        "Metrics": [
          {
              "Namespace": "CloudTrailMetric",
              "Dimensions": [],
              "MetricName": "IAMAuthnAuthzActivity"
          }
        ]
      }


0.6. SNSトピック名の確認
------------------------

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

        SNS_TOPIC_ARN: ${SNS_TOPIC_ARN}

ETX
```


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

IAMに変更があった場合にアラームがあがるように設定していきます。


1.1. 監視周期の決定
-------------------

まず、監視周期を決めます。 本ハンズオンでははやめにアラーム通知が欲しいので60秒に指定します。

```bash:コマンド:
CWATCH_ALARM_PERIOD='60'
```


1.2. アラーム対象の決定
-----------------------

アラームの対象となる、metric名(必須)とUnit単位(任意)を指定します。

```bash:コマンド:
CWATCH_METRIC_UNIT='Count'
```

```bash:コマンド:
CWATCH_STATISTICS='Sum'
```


1.3. アラーム名の決定
---------------------

アラーム名を決定します。 可能な限りDescriptionも指定するようにしましょ
う。

```bash:コマンド:
CWATCH_ALARM_NAME='IAMAuthnAuthzActivityAlarm'
CWATCH_ALARM_DESC='Alarm for IAM modify.'
```


1.4. アラーム閾値の決定
-----------------------

アラームの閾値を指定します。

evaluation period: 2回(period)状態が継続した場合にアラームを通知します
。

閾値と比較演算子: キューにジョブが1つ以上
(GreaterThanOrEqualToThreshold)あるとアラームを通知します。

```bash:コマンド:
CWATCH_EVALUATION_PERIOD='1'
CWATCH_THRESHOLD='1'
CWATCH_COMPARISON='GreaterThanOrEqualToThreshold'
```


2. 本作業
=========


2.1. アラームの設定
-------------------

実際にアラームを設定してみましょう。

```bash:コマンド:
CWATCH_ALARM_TOPIC=${SNS_TOPIC_ARN}
```

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

        CWATCH_NAMESPACE:          ${CWATCH_NAMESPACE}
        CWATCH_METRIC_NAME:        ${CWATCH_METRIC_NAME}
        CWATCH_STATISTICS:         ${CWATCH_STATISTICS}
        CWATCH_ALARM_PERIOD:       ${CWATCH_ALARM_PERIOD}
        CWATCH_EVALUATION_PERIOD:  ${CWATCH_EVALUATION_PERIOD}
        CWATCH_THRESHOLD:          ${CWATCH_THRESHOLD}
        CWATCH_COMPARISON:         ${CWATCH_COMPARISON}
        CWATCH_ALARM_NAME:         ${CWATCH_ALARM_NAME}
        CWATCH_ALARM_DESC:        "${CWATCH_ALARM_DESC}"
        CWATCH_ALARM_TOPIC:        ${CWATCH_ALARM_TOPIC}

ETX
```

```bash:コマンド:
aws cloudwatch put-metric-alarm \
          --namespace           ${CWATCH_NAMESPACE} \
          --metric-name         ${CWATCH_METRIC_NAME} \
          --statistic           ${CWATCH_STATISTICS} \
          --period              ${CWATCH_ALARM_PERIOD} \
          --evaluation-periods  ${CWATCH_EVALUATION_PERIOD} \
          --threshold           ${CWATCH_THRESHOLD} \
          --comparison-operator ${CWATCH_COMPARISON} \
          --alarm-name          ${CWATCH_ALARM_NAME} \
          --alarm-description  "${CWATCH_ALARM_DESC}" \
          --alarm-actions       ${CWATCH_ALARM_TOPIC}
```

結果:

      (戻り値なし)


2.2. アラーム変更履歴の確認
---------------------------

アラーム変更履歴に、以下のエントリがあることを確認します。

* アラーム作成

```bash:コマンド:
CWATCH_MAX_ITEMS='1'
```

```bash:コマンド:
aws cloudwatch describe-alarm-history \
          --alarm-name ${CWATCH_ALARM_NAME} \
          --max-items ${CWATCH_MAX_ITEMS}
```

結果:

      {
        "AlarmHistoryItems": [
          {
              "Timestamp": "2015-05-11T06:39:43.670Z",
              "HistoryItemType": "ConfigurationUpdate",
              "AlarmName": "IAMAuthnAuthzActivityAlarm",
              "HistoryData": "{\"version\":\"1.0\",\"type\":\"Create\",\"createdAlarm\":{\"threshold\":1.0,\"namespace\":\"CloudTrailMetric\",\"okactions\":[],\"alarmActions\":[\"arn:aws:sns:eu-west-1:XXXXXXXXXXXX:trail-alarm\"],\"actionsEnabled\":true,\"alarmName\":\"IAMAuthnAuthzActivityAlarm\",\"alarmConfigurationUpdatedTimestamp\":\"2015-05-11T06:39:43.670+0000\",\"alarmArn\":\"arn:aws:cloudwatch:eu-west-1:XXXXXXXXXXXX:alarm:IAMAuthnAuthzActivityAlarm\",\"stateUpdatedTimestamp\":\"2015-05-11T06:39:43.670+0000\",\"statistic\":\"Sum\",\"stateValue\":\"INSUFFICIENT_DATA\",\"metricName\":\"IAMAuthnAuthzActivity\",\"period\":60,\"dimensions\":[],\"evaluationPeriods\":1,\"comparisonOperator\":\"GreaterThanOrEqualToThreshold\",\"insufficientDataActions\":[],\"alarmDescription\":\"Alarm for IAM modify.\"}}",
              "HistorySummary": "Alarm \"IAMAuthnAuthzActivityAlarm\" created"
          }
        ]
      }


3. 事後作業
===========


3.1. アラーム設定の確認
-----------------------

アラームの設定内容を確認します。

```bash:コマンド:
aws cloudwatch describe-alarms --alarm-names ${CWATCH_ALARM_NAME}
```

結果:

      {
        "MetricAlarms": [
          {
              "EvaluationPeriods": 1,
              "AlarmArn": "arn:aws:cloudwatch:eu-west-1:258890897647:alarm:IAMAuthnAuthzActivityAlarm",
              "StateUpdatedTimestamp": "2015-05-11T06:39:43.670Z",
              "AlarmConfigurationUpdatedTimestamp": "2015-05-11T06:39:43.670Z",
              "ComparisonOperator": "GreaterThanOrEqualToThreshold",
              "AlarmActions": [
                  "arn:aws:sns:eu-west-1:258890897647:trail-alarm"
              ],
              "AlarmDescription": "Alarm for IAM modify.",
              "Namespace": "CloudTrailMetric",
              "Period": 60,
              "StateValue": "INSUFFICIENT_DATA",
              "Threshold": 1.0,
              "AlarmName": "IAMAuthnAuthzActivityAlarm",
              "Dimensions": [],
              "Statistic": "Sum",
              "StateReason": "Unchecked: Initial alarm creation",
              "InsufficientDataActions": [],
              "OKActions": [],
              "ActionsEnabled": true,
              "MetricName": "IAMAuthnAuthzActivity"
          }
        ]
      }


3.2. IAMグループの作成
----------------------

```bash:コマンド:
aws iam create-group --group-name test-`date +%Y%m%d`-02
```

結果(例):

      {
        "Group": {
          "Path": "/",
          "CreateDate": "2015-05-11T06:03:33.140Z",
          "GroupId": "AGPAIXZBI34RKKCMV27VS",
          "Arn": "arn:aws:iam::258890897647:group/test-20150511-02",
          "GroupName": "test-20150511-02"
        }
      }


3.3. アラームの受信確認
-----------------------


完了
====