AWS CLIで取得したAmazon CloudWatch Metricsのget-metric-statisticsの結果を、jqでCSVに変換する

# What's？

Amazon CloudWatch Metricsから統計情報を取得した結果を、CSVに変換したいなというメモです。

# 環境

今回の環境は、こちらです。

```shell
$ aws --version
aws-cli/2.7.21 Python/3.9.11 Linux/5.4.0-122-generic exe/x86_64.ubuntu.20 prompt/off
```

AWSのクレデンシャルは、環境変数で設定しているものとします。

```shell
$ export AWS_ACCESS_KEY_ID=.....
$ export AWS_SECRET_ACCESS_KEY=.....
$ export AWS_DEFAULT_REGION=.....
```

# お題

Amazon RDSの`CPUUtilization`を対象にしましょう。

https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/rds-metrics.html

こちらをAWS CLIで取得し、jqでCSV形式に変換します。この時に時刻（`Timestamp`）でソートもします。

なお、メトリクスをAWS CLIで取得する方法は、このあたりを参考に。

https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/US_SingleMetricPerInstance.html

https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/metrics_dimensions.html

使用するコマンドは、`aws cloudwatch get-metric-statistics`ですね。

メトリクスを取得するAmazon RDSインスタンスは、以下のように変数で定義しているものとします。

```shell
$ RDS_INSTANCE_IDENTIFIER=.....
```

# メトリクスを取得する

まずは、メトリクスを取得しましょう。

使用するAWS CLIのコマンドは`aws cloudwatch get-metric-statistics`です。

https://awscli.amazonaws.com/v2/documentation/api/latest/reference/cloudwatch/get-metric-statistics.html

取得で使う名前空間とメトリクス名はこちら。

- `namespace` … `AWS/RDS`
- `metric-name` … `CPUUtilization`

https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/rds-metrics.html

`statistics`は`Average`とし、取得期間は`2022-08-04T08:00:00Z`〜`2022-08-04T08:10:00Z`（UTC）、`period`は`60`とします。

https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/Statistics-definitions.html

こういうコマンドになりますね。

```shell
$ aws cloudwatch get-metric-statistics \
    --namespace AWS/RDS \
    --metric-name CPUUtilization  \
    --dimensions Name=DBInstanceIdentifier,Value=$RDS_INSTANCE_IDENTIFIER \
    --statistics Average \
    --start-time 2022-08-04T08:00:00Z \
    --end-time 2022-08-04T08:10:00Z \
    --period 60
```

手元の環境での結果。

```json
{
    "Label": "CPUUtilization",
    "Datapoints": [
        {
            "Timestamp": "2022-08-04T08:02:00+00:00",
            "Average": 10.433681122704089,
            "Unit": "Percent"
        },
        {
            "Timestamp": "2022-08-04T08:06:00+00:00",
            "Average": 10.20017000283338,
            "Unit": "Percent"
        },
        {
            "Timestamp": "2022-08-04T08:08:00+00:00",
            "Average": 9.858004733175562,
            "Unit": "Percent"
        },
        {
            "Timestamp": "2022-08-04T08:03:00+00:00",
            "Average": 10.04149930834486,
            "Unit": "Percent"
        },
        {
            "Timestamp": "2022-08-04T08:07:00+00:00",
            "Average": 10.533333333333333,
            "Unit": "Percent"
        },
        {
            "Timestamp": "2022-08-04T08:09:00+00:00",
            "Average": 9.600320010667023,
            "Unit": "Percent"
        },
        {
            "Timestamp": "2022-08-04T08:00:00+00:00",
            "Average": 10.683155280745321,
            "Unit": "Percent"
        },
        {
            "Timestamp": "2022-08-04T08:04:00+00:00",
            "Average": 9.566666666666665,
            "Unit": "Percent"
        },
        {
            "Timestamp": "2022-08-04T08:01:00+00:00",
            "Average": 10.26649555840736,
            "Unit": "Percent"
        },
        {
            "Timestamp": "2022-08-04T08:05:00+00:00",
            "Average": 10.39149347510875,
            "Unit": "Percent"
        }
    ]
}
```

## CSVに変換する

では、この結果をCSVに変換しましょう。jqの`@csv`フォーマットを使用します。

> The input must be an array, and it is rendered as CSV with double quotes for strings, and quotes escaped by repetition.

[jq Manual / Builtin operators and functions / Format strings and escaping](https://stedolan.github.io/jq/manual/#Formatstringsandescaping)

また、ソートは`sort_by`を使用します。

[jq Manual / Builtin operators and functions / sort, sort_by(path_expression)](https://stedolan.github.io/jq/manual/#sort,sort_by(path_expression))

こんな感じになります。

```shell
$ aws cloudwatch get-metric-statistics \
    --namespace AWS/RDS \
    --metric-name CPUUtilization  \
    --dimensions Name=DBInstanceIdentifier,Value=$RDS_INSTANCE_IDENTIFIER \
    --statistics Average \
    --start-time 2022-08-04T08:00:00Z \
    --end-time 2022-08-04T08:10:00Z \
    --period 60 \
    | jq -r '.Datapoints | sort_by(.Timestamp) | .[] | [.Timestamp, .Average, .Unit] | @csv'
```

結果。

```text
"2022-08-04T08:00:00+00:00",10.683155280745321,"Percent"
"2022-08-04T08:01:00+00:00",10.26649555840736,"Percent"
"2022-08-04T08:02:00+00:00",10.433681122704089,"Percent"
"2022-08-04T08:03:00+00:00",10.04149930834486,"Percent"
"2022-08-04T08:04:00+00:00",9.566666666666665,"Percent"
"2022-08-04T08:05:00+00:00",10.39149347510875,"Percent"
"2022-08-04T08:06:00+00:00",10.20017000283338,"Percent"
"2022-08-04T08:07:00+00:00",10.533333333333333,"Percent"
"2022-08-04T08:08:00+00:00",9.858004733175562,"Percent"
"2022-08-04T08:09:00+00:00",9.600320010667023,"Percent"
```

ヘッダー行を付けたくなるかもしれません。その場合はこちら。

```shell
$ aws cloudwatch get-metric-statistics \
    --namespace AWS/RDS \
    --metric-name CPUUtilization  \
    --dimensions Name=DBInstanceIdentifier,Value=$RDS_INSTANCE_IDENTIFIER \
    --statistics Average \
    --start-time 2022-08-04T08:00:00Z \
    --end-time 2022-08-04T08:10:00Z \
    --period 60 \
    | jq -r '["Timestamp", "Average", "Unit"], (.Datapoints | sort_by(.Timestamp) | .[] | [.Timestamp, .Average, .Unit]) | @csv'
```

結果。

```shell
"Timestamp","Average","Unit"
"2022-08-04T08:00:00+00:00",10.683155280745321,"Percent"
"2022-08-04T08:01:00+00:00",10.26649555840736,"Percent"
"2022-08-04T08:02:00+00:00",10.433681122704089,"Percent"
"2022-08-04T08:03:00+00:00",10.04149930834486,"Percent"
"2022-08-04T08:04:00+00:00",9.566666666666665,"Percent"
"2022-08-04T08:05:00+00:00",10.39149347510875,"Percent"
"2022-08-04T08:06:00+00:00",10.20017000283338,"Percent"
"2022-08-04T08:07:00+00:00",10.533333333333333,"Percent"
"2022-08-04T08:08:00+00:00",9.858004733175562,"Percent"
"2022-08-04T08:09:00+00:00",9.600320010667023,"Percent"
```

こんな感じでしょうか。

`Timestamp`はUTCなので、日本時間に変更するなどしたかったら、さらにこれを加工する感じですね。