【AWS】AWS CLIでCloudWatchAlarmsの一覧を取得する【CloudWatch】

# 目的
設定済みのCloudWatchAlarmの一覧を取得する必要があったので、AWS CLI及びjqのコマンドをメモ。
AWS CLIのプロファイル名は「your-env」としています。環境に応じて適宜変えてください。

# 取得したい項目
- AlarmName
- Namespace
- Dimensions
- MetricName
- Statistic
- Period
- Threshold
- ComparisonOperator
- EvaluationPeriods

# コマンド
## 基本（加工整形なし）
### 実行コマンド

```bash
$ aws --profile your-env cloudwatch describe-alarms
```

### 実行結果

```json
{
    "MetricAlarms": [
        {
            "EvaluationPeriods": 1,
            "AlarmArn": "arn:aws:cloudwatch:ap-northeast-1:123456789012:alarm:DB-Connections",
            "StateUpdatedTimestamp": "2018-07-01T12:34:56.789Z",
            "AlarmConfigurationUpdatedTimestamp": "2018-07-01T12:34:56.789Z",
            "ComparisonOperator": "GreaterThanOrEqualToThreshold",
            "AlarmActions": [
                "arn:aws:sns:ap-northeast-1:123456789012:NotifyTopic"
            ],
            "Namespace": "AWS/RDS",
            "StateReasonData": "{\"version\":\"1.0\",\"queryDate\":\"2018-07-01T12:34:56.789+0000\",\"startDate\":\"2018-07-01T12:34:56.789+0000\",\"statistic\":\"Average\",\"period\":300,\"recentDatapoints\":[0.0],\"threshold\":3000.0}",
            "Period": 300,
            "StateValue": "OK",
            "Threshold": 3000.0,
            "AlarmName": "DB-Connections",
            "Dimensions": [
                {
                    "Name": "DBInstanceIdentifier",
                    "Value": "your-db-name"
                }
            ],
            "Statistic": "Average",
            "StateReason": "Threshold Crossed: 1 datapoint [0.0 (07/01/18 12:34:56)] was not greater than or equal to the threshold (3000.0).",
            "InsufficientDataActions": [],
            "OKActions": [],
            "ActionsEnabled": true,
            "MetricName": "DatabaseConnections"
        },
        {
※省略
        },
        {
※省略
        }
    ]
}

```

## 値のみをそのまま取得
### 実行コマンド
必要な項目のみを指定し、map()関数で新たなJSONオブジェクトに変換しています。

```bash
$ aws --profile your-env cloudwatch describe-alarms | jq '.MetricAlarms | map({"AlarmName": .AlarmName, "Namespace": .Namespace, "Dimensions": .Dimensions, "MetricName": .MetricName, "Statistic": .Statistic, "Period": .Period, "Threshold": .Threshold, "ComparisonOperator": .ComparisonOperator, "EvaluationPeriods": .EvaluationPeriods})'

```

### 実行結果
```json
[
  {
    "AlarmName": "DB-Connections",
    "Namespace": "AWS/RDS",
    "Dimensions": [
      {
        "Name": "DBInstanceIdentifier",
        "Value": "your-db-name"
      }
    ],
    "MetricName": "DatabaseConnections",
    "Statistic": "Average",
    "Period": 300,
    "Threshold": 3000,
    "ComparisonOperator": "GreaterThanOrEqualToThreshold",
    "EvaluationPeriods": 1
  },
  {
※省略
  },
  {
※省略
  }
]

```

## Dimensionsをフラットに展開する
### 実行コマンド
上記に加え、Dimensionsが配列なので、これを展開します。
Dimensionsの要素数は通常1つだけなので、添え字を直接指定します。

```bash
aws --profile your-env cloudwatch describe-alarms | jq '.MetricAlarms | map({"AlarmName": .AlarmName, "Namespace": .Namespace, "DimensionName": .Dimensions[0].Name, "DimensionValue": .Dimensions[0].Value, "MetricName": .MetricName, "Statistic": .Statistic, "Period": .Period, "Threshold": .Threshold, "ComparisonOperator": .ComparisonOperator, "EvaluationPeriods": .EvaluationPeriods})'

```

### 実行結果

```json
[
  {
    "AlarmName": "DB-Connections",
    "Namespace": "AWS/RDS",
    "DimensionName": "DBInstanceIdentifier",
    "DimensionValue": "your-db-name",
    "MetricName": "DatabaseConnections",
    "Statistic": "Average",
    "Period": 300,
    "Threshold": 3000,
    "ComparisonOperator": "GreaterThanOrEqualToThreshold",
    "EvaluationPeriods": 1
  },
  {
※省略
  },
  {
※省略
  }
]
```


## フラットに展開した状態でCSV出力する
### 実行コマンド
上記と同じ項目を、CSVで出力します。

```bash
aws --profile your-env cloudwatch describe-alarms | jq -r '.MetricAlarms[] | [.AlarmName, .Namespace, .Dimensions[0].Name, .Dimensions[0].Value, .MetricName, .Statistic, .Period, .Threshold, .ComparisonOperator, .EvaluationPeriods] | @csv'

```

### 実行結果

```csv
"DB-Connections","AWS/RDS","DBInstanceIdentifier","your-db-name","DatabaseConnections","Average",300,3000,"GreaterThanOrEqualToThreshold",1
※省略
```


## フラットに展開した状態でCSV出力し、さらにAlarmActionsを付与する
### 実行コマンド
上記CSVに、更にAlarmActionsを追加します。
AlarmActionsは複数指定できますが、現状対応できるのは1つだけです。

```bash
aws --profile your-env cloudwatch describe-alarms | jq -r '.MetricAlarms[] | [.AlarmName, .Namespace, .Dimensions[0].Name, .Dimensions[0].Value, .MetricName, .Statistic, .Period, .Threshold, .ComparisonOperator, .EvaluationPeriods, .AlarmActions[0]] | @csv'

```

### 実行結果

```csv
"DB-Connections","AWS/RDS","DBInstanceIdentifier","your-db-name","DatabaseConnections","Average",300,3000,"GreaterThanOrEqualToThreshold",1,"arn:aws:sns:ap-northeast-1:123456789012:YourSnsTopicToNotify"
※省略
```


# Furthermore
## 未調査事項
- Dimensionsが複数存在するケースがあり得るか

基本的に1つしか指定できないはずですが、裏取りは未実施です。


## Alarmが100件を超える場合
API Referenceにある通り、DescribeAlarms APIで取得できる最大件数は100件となります。

これを超えて全て取得する場合、以下の操作を行う必要があります。

- レスポンスのJSONに「NextToken」オブジェクトが追加されるので、これを取得
- リクエストに「NextToken」オブジェクトを追加して、更にDescribeAlarmsを実行する
- レスポンスに「NextToken」が存在しなくなるまで、これを繰り返す

# 関連ドキュメント
## AWS公式ドキュメント

describe-alarms — AWS CLI 1.16.7 Command Reference
https://docs.aws.amazon.com/cli/latest/reference/cloudwatch/describe-alarms.html

DescribeAlarms - Amazon CloudWatch
https://docs.aws.amazon.com/AmazonCloudWatch/latest/APIReference/API_DescribeAlarms.html