[AWS CDK]CDKからCloudWatch Dashboardを作成する方法

## はじめに
この記事は、[ミロゴス Advent Calendar 2022](https://qiita.com/advent-calendar/2022/milogos) 15日目の記事です。
CloudWatch Dashboardを作成する方法をまとめました。

## Amazon CloudWatchとは
> Amazon CloudWatch は、Amazon Web Services (AWS) リソースと、AWS で実行されているアプリケーションをリアルタイムでモニタリングします。CloudWatch を使用してメトリクスを収集し、追跡できます。メトリクスとは、リソースやアプリケーションに関して測定できる変数です。
https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/WhatIsCloudWatch.html

## Amazon CloudWatch Dashboardとは
> Amazon CloudWatch ダッシュボードは、CloudWatch コンソールにあるカスタマイズ可能なホームページであり、ダッシュボードを使用すれば、異なるリージョンにまたがっているリソースでも、1 つのビューでモニタリングできます。CloudWatch ダッシュボードを使用して、AWS リソースのメトリクスおよびアラームをカスタマイズした状態で表示することができます。
https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/CloudWatch_Dashboards.html

## Amazon CloudWatch Metricsとは
> メトリクスとは、システムのパフォーマンスに関するデータです。デフォルトでは、多くのサービスはリソース (Amazon EC2 インスタンス、Amazon EBS ボリューム、Amazon RDS DB インスタンスなど) に対して無料のメトリクスを提供しています。また、Amazon EC2 インスタンスなど一部のリソースの詳細モニタリングを有効にしたり、独自のアプリケーションメトリクスを発行したりできます。Amazon CloudWatch は、検索、グラフ表示、アラームに備えて、アカウント内のすべてのメトリクス (AWS リソースメトリクスと、お使いのアプリケーションメトリクスの両方) をロードすることができます。
https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/working_with_metrics.html

## 環境
```
cdk version
2.45.0

python version
3.9.6
```

## 実装の流れ

#### AWS CDK
使用したCDKは以下になります。
```python
from aws_cdk import (
    aws_cloudwatch as cloudwatch,
    Duration as duration,
)
```

#### Widget
最初にダッシュボードに表示するためのウィジェットを作成します。
ウィジェットには複数の種類があるため実際に使用した一部を紹介します。

- GraphWidget  
グラフが表示されるウィジェット  
https://docs.aws.amazon.com/cdk/api/v2/python/aws_cdk.aws_cloudwatch/GraphWidget.html

```python:cdk_stack.py
grap_widget = cloudwatch.GraphWidget(
    title="タイトル",
    height=6,
    width=6,
    stacked=False,
    statistic="Sum",
    period=duration.seconds(60),
    left=[
        cloudwatch.Metric(
            metric_name="メトリクス名",
        ),
    ]
)
```

Lambdaの関数コードが呼び出された回数
![スクリーンショット 2022-12-09 18.12.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952491/40a741f8-1875-12be-403e-d96eb47a0fab.png)

- SingleValueWidget  
数値が表示されるウィジェット
https://docs.aws.amazon.com/cdk/api/v2/python/aws_cdk.aws_cloudwatch/SingleValueWidget.html

```python:cdk_stack.py
single_value_widget = cloudwatch.SingleValueWidget(
    title="タイトル",
    height=6,
    width=6,
    metrics=[
        cloudwatch.Metric(
            metric_name="メトリクス名",
        ),
    ]
)
```

指定した期間中に Query、Scanまたは ExecuteStatement (選択) オペレーションによって返される項目の数
![スクリーンショット 2022-12-09 18.34.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952491/a3dfaa81-43b4-f936-e724-18252347c91a.png)


- LogQueryWidget  
クエリー結果を表示するウィジェット
https://docs.aws.amazon.com/cdk/api/v2/python/aws_cdk.aws_cloudwatch/LogQueryWidget.html
  - Logs Insights  
https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/logs/CWL_QuerySyntax.html

```python:cdk_stack.py
log_query_widget = cloudwatch.LogQueryWidget(
    title="タイトル",
    height=6,
    width=6,
    log_group_names=["my-log-group"],
    view=cloudwatch.LogQueryVisualizationType.TABLE,
    query_lines=[
        #  Logs Insightsのクエリ構文を記載
    ],
)
```

ロググループに対するクエリの実行結果を出力
![スクリーンショット 2022-12-09 19.50.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952491/d0b7950c-3bba-b61a-d9bf-16965e7f2692.png)


#### Dashboard
最後に、ダッシュボードを作成します。
引数のwidgetsには作成したウィジェットをセットすることで表示することができます。
https://docs.aws.amazon.com/cdk/api/v2/python/aws_cdk.aws_cloudwatch/Dashboard.html
```python:cdk_stack.py
cloudwatch.Dashboard(
    self,
    "MyDashboard",
    dashboard_name="dashboardName",
    period_override=cloudwatch.PeriodOverride.AUTO,
    start="start",
    widgets=[
        [grap_widget, single_value_widget, log_query_widget]
    ]
)
```

## おわりに
CloudWatch Dashboardを画面から作成する場合、プロジェクトごとに新しく作り直す必要がありますが
CDKで作成すればプログラムを流用できるというメリットがあるため、非常に便利だと感じました。