AWS re:Invent 2023 で紹介されたCloudWatch関連アップデートのまとめ

この記事は [NTTテクノクロスアドベントカレンダー2023](https://qiita.com/advent-calendar/2023/ntt-tx) シリーズ1 12/17の記事です。
NTTテクノクロスの木村です。
普段はAWSを活用したWebアプリ/インフラ開発の業務に携わってます。

# はじめに
今年は AWS re:Invent 2023@ラスベガス に現地参加してきました！
参加したセッションにてCloudWatch関連の新機能の紹介が多くありましたので、本記事では気になった機能のまとめ＆実際に使ってみた所感をお伝えします。


## 1. CloudWatch Logs Infrequent Access（GA）
低頻度アクセス用のログクラス（IA）を提供します。
IAクラスは既存のStandardクラスと比較すると1GBあたりの転送コストを50%削減できますが、一方でサブスクリプションフィルターやS3エクスポート等の機能にサポートしていません。
コストが低い分、利用できる機能に制限があるイメージです。

早速使ってみます。
マネジメントコンソールより`CloudWatch` > `ログ` > `ロググループ` > `ロググループを作成` を選択します。
ロググループ名を入力し、ログクラスの欄で`Infrequent Access`を選択し、`作成`を選択します。

![1-1r.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2321772/0c4c748d-a10a-7459-bc9d-554cccef51bc.png)

作成したロググループを見ると、メトリクスフィルターやサブスクリプションフィルターなどで`サポートされていません`の記載が確認できます。画面下部のタブについても非活性となっており、機能は利用できません。

![1-2r.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2321772/bc39d254-8c6d-a23f-bc86-0ef1c476a309.png)


設定はとても簡単ですが、**ログクラスは後からの変更は不可**となりますので要注意です。
要件に応じて最適なログクラスを選択することで、コスト削減に役立ちそうです。


https://aws.amazon.com/jp/blogs/aws/new-amazon-cloudwatch-log-class-for-infrequent-access-logs-at-a-reduced-price/

https://aws.amazon.com/jp/about-aws/whats-new/2023/11/amazon-cloudwatch-logs-infrequent-access-log-class/


## 2. CloudWatch Logs Anomaly Detection（GA）
機械学習を活用したログの異常検出、パターン分析機能として、以下の3つが発表されました。

- パターンビュー：ログに繰り返し発生するパターンを検出・可視化
- 比較モード：指定した期間内のログ差異を比較
- 異常ディテクター：ログの異常発生の可能性を検出

今回は3つめの 異常ディテクター を設定してみます。

`CloudWatch` > `ロググループ` > `<設定対象のロググループ名>` > `異常をログ記録` > `異常ディテクターを作成` を選択します。

![2-1r.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2321772/c0b1f70b-b669-348a-c9ac-9558fbc1004e.png)

　
次に異常ディテクターの詳細設定で、`異常検知フィルタパターン`を設定します。
`イベントメッセージをログ記録`にサンプルログを入力して`パターンをテスト`を実行することで、パターンのテストも可能です。
設定が完了したら`異常検出をアクティブ化`を選択します。

![2-2r.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2321772/ad412cf1-7e85-4854-6a0e-081f603d13e0.png)

　
アクティブ化するとトレーニングが開始され、`異常検出はトレーニングです。`の文言が表示されます。

![2-3r.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2321772/62a4b2e5-afe1-881f-91f9-31bfa4d2e681.png)

およそ24時間後にトレーニングが完了しました。
異常検出されていない場合は以下のような表示になります。
![2-4r.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2321772/3cbb3412-6595-06ad-6b25-4897a3b4fb7a.png)


https://aws.amazon.com/jp/about-aws/whats-new/2023/11/aws-cloudwatch-logs-anomaly-detection-pattern-analysis/



## 3. CloudWatch Natural Language Query Generation（preview）
生成AIを活用して、自然言語でLogs Insight・Metrics Insights向けのクエリを自動生成する機能です。クエリ作成が苦手のため、個人的に嬉しい機能です。
ただし2023年11月26日時点ではプレビュー版であり、東京リージョンは未対応となります。今後の東京リージョンへの対応に期待です。

実際に使ってみます。
本機能をサポートしているバージニア北部リージョンにて、`CloudWatch` > `ログ` > `ログのインサイト` > `Query Generator` を選択します。

![3-1r.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2321772/62fa4230-e1d6-6e1b-b2cf-3cf8ee906893.png)


クエリを発行したいロググループを選択し、`Prompt`欄に生成したいクエリを入力して`新しいクエリを生成`を選択します。
今回はプロンプト例にあった`List all client exceptions from the last 1 hour in my exception logs`（直近1時間以内のすべてのクライアント例外をリスト化する）を入力しました。
※プロンプト例は`Prompt`の隣にある`情報`を選択すると参照可能です。

![3-2r.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2321772/3d80fff7-5174-81c9-4d35-87f9c0b66db5.png)


生成した結果が以下の通りです。良い感じですね。
細かく見ると「1時間」の指定はないですが、降順で取得しているので精度としては問題ないかと思います。

```
fields @timestamp, @message 
| filter @message like /4..|5../ 
| sort @timestamp desc
```

https://aws.amazon.com/jp/about-aws/whats-new/2023/11/amazon-cloudwatch-ai-powered-natural-language-query-generation-preview



## 4. CloudWatch Application Signals（preview）
Werner VogelsのKeynoteでも紹介されてました。
アプリケーションのパフォーマンスに関するリクエスト量、可用性、レイテンシーなどの重要なメトリクスを収集し、自動的にダッシュボード化してくれる機能です。
さらに、アプリケーションのSLO（サービスレベル目標）を定義して監視することも可能です。
今までCloudWatchでのアプリパフォーマンス可視化はX-Rayを使うなど色々と大変でしたので、オブザーバビリティを促進する観点でもかなり嬉しい機能かと思います。
対応言語は2023/12/6時点ではJavaのみですが、GA時には対応言語が増えることに期待したいです。

使ってみた所感も載せかったのですが、この記事の発表日までに検証と執筆が間に合いませんでした（すみません…）ので、概要のご紹介まで。

https://aws.amazon.com/jp/blogs/aws/amazon-cloudwatch-application-signals-for-automatic-instrumentation-of-your-applications-preview/



## 5. CodeWhispererを活用したCloudWatchカスタムダッシュボード・カスタムウィジェットの作成
最後に、re:Inventでの発表ではありませんが興味深いアップデートがありましたので紹介します。
コード自動生成サービスのCodeWhispererが、CloudWatchカスタムダッシュボード・カスタムウィジェットをサポートしました。CodeWhispererにコメントを入力すると、コメントに対応したコードを自動生成してくれるそうです。
下記のAWS公式ブログでCDKコードを自動生成する手順がありましたので、実際にいくつか試してみました。

https://aws.amazon.com/jp/blogs/news/leverage-generative-ai-to-create-custom-dashboard-widgets-in-amazon-cloudwatch-using-amazon-codewhisperer-jp/


#### コメント「# define lambda function that has inline code」の実行結果
Lambda関数を定義する意図のコメントです。
以下の通り、いい感じにLambda関数のコードが生成されました。
```python
# define lambda function that has inline code
   lambda_fn = aws_lambda.Function(
        self, "lambda_function",
        runtime=aws_lambda.Runtime.PYTHON_3_9,
        handler="lambda-handler.main",
        code=aws_lambda.Code.from_inline(
            """
            def main(event, context):
                print("Hello World!")
            """
        ),
    )
```

#### コメント「# define custom widget to display lambda function」の実行結果
Lambda関数をディスプレイするカスタムウィジェットを定義する意図のコメントです。
こちらは `markdown=f'''`までは自動生成されましたが、それ以降は何も補完されませんでした。 またカスタムウィジェットですので`aws_cloudwatch.CustomWidget`の生成を期待していたのですが、`aws_cloudwatch.DashboardWidget`が生成される結果となりました。
```python
# define custom widget to display lambda function
    widget = aws_cloudwatch.DashboardWidget(
            width=24,
            height=3,
            markdown=f'''    
```


#### コメント「# define a text widget that displays "Hello World"」の実行結果
テキストウィジェットを定義する意図のコメントです。
こちらはいい感じに`aws_cloudwatch.TextWidget`の定義が生成されました。
```python
# define a text widget that displays "Hello World"
    text_widget = aws_cloudwatch.TextWidget(
        markdown="Hello World",
        height=2,
        width=24   
```


この後も手順に準じてコード自動生成を試してみましたが、コメントの意図とは異なるコードが生成されるケースも散見されました。状況に応じてインプットとなるコメントの精査やアウトプットのコードの手修正は必要かな、という所感です。
とはいえ、私の様なコーディング苦手人間からするとコーディング時に次々とコードを補完してくれる機能はありがたく、とても有用に感じました。
今後も積極的に活用したいと思います。


## さいごに
全体として、トレンドのAIや機械学習の技術をCloudWatchに活用したアップデートが目立ちました。またオブザーバビリティを促進するための機能もより充実化している印象です。


明日は@tkai0216さんの記事です。引き続き [NTTテクノクロスアドベントカレンダー2023](https://qiita.com/advent-calendar/2023/ntt-tx) をお楽しみください。