CloudWatchと正面から向き合ってみる

みんな苦闘するCloudWatch。
習熟すれば少しは好きになれるんじゃないかと思いきちんと把握してみます。
AWSで完結できればいろいろ楽だし安いので、DataDogを入れる前に。

# 先に所感とまとめ
- **何だかんだ言ってCloudWatchはありがたい存在**
    - いろいろ使いづらいところがあるとはいえ、色々な面倒事を無条件でやってくれるので
        - データ収集(ロギング、メトリクス化)、ストレージ、可視化
            - オンプレではFluentd, Zabbix, Kibanaなど構築しないとできないこと
        - 特にサーバレスだとその恩恵は大きい
- **イベントで担保できるものはアラームではなくイベント駆動で通知する**
    - [サポートされている各サービスからの CloudWatch イベント イベントの例](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/events/EventTypes.html)
    - ※CloudWatch Eventsは[Amazon EventBridge](https://docs.aws.amazon.com/ja_jp/eventbridge/latest/userguide/what-is-amazon-eventbridge.html)に名称とサービスの立ち位置が変更され、将来的にこちらに統一される予定です。
- **デフォルトのメトリクスは即座にアラームを作成して監視しましょう**
    - [CloudWatch メトリクスを発行する AWS のサービス](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/aws-services-cloudwatch-metrics.html)
    - わざわざAWSがメトリクスまで作成してくれているので、アラームを作成するだけで監視できます
        - 例: [Lambda](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/monitoring-functions-metrics.html) の`Errors`メトリクスを監視すれば、該当リージョンで発生した全てのLambdaのエラーを検知できます
- **CloudWatchインサイトは普通に使いましょう**
    - [一番意識の低いAWS CloudWatch Insights入門](https://qiita.com/sot528/items/8431317c26780e6a7e54)
- **CloudWatch周りもすべてコード化すべき**
    - 参考: [serverless framework](https://github.com/ACloudGuru/serverless-plugin-aws-alerts)、[Cloudformation & AWS SAM](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/with-scheduledevents-example-use-app-spec.html)
    - 自動化されていない監視は何かを見落としているサイン（入門 監視）
- **監視は超重要**
    - [入門 監視](https://www.amazon.co.jp/%E5%85%A5%E9%96%80-%E7%9B%A3%E8%A6%96-%E2%80%95%E3%83%A2%E3%83%80%E3%83%B3%E3%81%AA%E3%83%A2%E3%83%8B%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3-Mike-Julian/dp/4873118646/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=%E5%85%A5%E9%96%80+%E7%9B%A3%E8%A6%96&qid=1557287805&s=gateway&sr=8-1)


# 用語
厳密には正しくないかもだけど、CloudWatchの用語を図と一言でざっくりまとめる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50056/5a29561c-a63c-4e2b-a1a7-dce3cca7d6d3.png)


**ログイベント**: 1行のログ
**ログストリーム**: ログをまとめたもの。例えば同じEC2インスタンスからのログは同じログストリームにまとめられる。
**ロググループ**: ログストリームをまとめたもの。
**メトリクスフィルタ**: ログをメトリクスに加工。またメトリクスをフィルタして別のメトリクスに加工。
**メトリクス**: ログを、グラフ描画やアラート通知に利用できる数値に加工したもの。
**ディメンション**: メトリクスのプロパティ。
**統計**: 指定した期間のメトリクスのデータの集計
**アラーム**: 指定した期間の単一のメトリクスの数値を監視し、設定したしきい値等を基準にアクションを起こす

- 詳細は以下を参照。
    - [Amazon CloudWatch Logs の概念](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/logs/CloudWatchLogsConcepts.html)
    - [ログデータの検索およびフィルタリング](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/logs/MonitoringLogData.html)

# 監視と検知
- [イベント](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/events/EventTypes.html)で拾えるものはイベントで拾う
    - ※CloudWatch Eventsは[Amazon EventBridge](https://docs.aws.amazon.com/ja_jp/eventbridge/latest/userguide/what-is-amazon-eventbridge.html)に名称とサービスの立ち位置が変更され、将来的にこちらに統一される予定です。
- イベントで拾えないものは[アラーム](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/AlarmThatSendsEmail.html)を使ってSNSに流す
    - [AWS Chatbot](https://aws.amazon.com/jp/chatbot/)は便利なので使いましょう
        - Slackのチャンネルに `aws` のユーザを登録しないと機能しないのでお気を付けください
    - [CloudWatchアラーム通知をSlackにする](https://qiita.com/hf7777hi/items/e0f43f0fb7e2effa0af8)


## ログの中に **Error** という文字列が含まれていたら通知したい
- メトリクスフィルタを作成してError通知用メトリクスを作成し、それをアラームに使う
    - [例: 語句の出現回数をカウントする](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/logs/CountOccurrencesExample.html)


# 調査・分析
ログデータの調査方法、検索方法、分析方法についてまとめる。
現状は↓の順に確認を行っている。

1. インサイト
1. デフォルトのダッシュボード(下の方に記載)
2. メトリクスからのログ確認

## インサイト
CloudWatchを使っていて、まだインサイトを使っていない人は今すぐ使うべきです。
なぜなら5分の習熟で使いこなせて、それで充分に実用的だからです。

- 詳細は以下の記事を参照:
    - [一番意識の低いAWS CloudWatch Insights入門](https://qiita.com/sot528/items/8431317c26780e6a7e54)

## ドキュメントではデフォでCLIを推奨される
マネコンのUIがつらいから？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50056/54b06acb-7406-a485-cae5-97e596c930e4.png)


## それでもマネコンを使う場合
- [フィルターパターンを使用したログデータ検索](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/logs/SearchDataFilterPattern.html)


# 可視化
ログデータの可視化についてまとめる。

## ダッシュボード
デフォルトのダッシュボードは手っ取り早くAWSのサービスの状況を確認できる。
![dashboard.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50056/a3dbfe34-7f7f-1daf-2e20-c7e99def1dcd.gif)

### リソースグループ
![rg.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50056/3ce51db7-26b5-bb71-8d81-3d30b7117a95.gif)

- CloudWatchのダッシュボードでは表示できる件数が限られる(Lambdaなら100件までなど)ので、それを超過する場合は可視性の観点で導入するメリットが大きい
- タグベース or CloudFormationスタックベースでリソースをグルーピングできる

#### すべてのCFnスタックにリソースグループを作成するスクリプト

```bash
#!/usr/bin/env bash

# Stack IDのリストを取得(削除済みは除く)
TMP=/tmp/_tmp_stack_id
targets=(`aws cloudformation list-stacks | jq -r '.[][] | select(.DeletionTime==null) | .StackId'`)

# リソースグループを作成
for id in "${targets[@]}"
do
  stack=`echo $id | awk  -F'/' '{print $2}'`
  aws resource-groups create-group \
    --name ${stack} \
    --resource-query '{"Type": "CLOUDFORMATION_STACK_1_0", "Query": "{\"ResourceTypeFilters\":[\"AWS::AllSupported\"],\"StackIdentifier\":\"'${id}'\"}"}'
done
```

## カスタムダッシュボード
便利だが、新規に作成されたリソースの追加が漏れがちなので悩ましいところ。

# メモ
- 1つのロググループに属することができるログストリームの数に制限なし
- [ログのストリームをダイレクトにLambdaに流せるらしい](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/logs/SubscriptionFilters.html#LambdaFunctionExample)
- [VPCを利用する場合はCloudWatch Logsにプライベート接続可能](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/logs/cloudwatch-logs-and-interface-VPC.html)
- [メトリクスはリージョン間で完全に分離されている](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/cloudwatch_architecture.html)
- [AWS SDK Metricsでメトリクスをサポートと共有し効率よく問題解決](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/CloudWatch-Agent-SDK-Metrics.html)
- [メトリクス作成チュートリアル](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/PublishMetrics.html)
- [CloudWathch よくある質問](https://aws.amazon.com/jp/cloudwatch/faqs/)
    - バイナリのログはサポートしていない
- TODO: 新機能の雑な感想
    - Syntheticsは外部監視(外形監視)として普通に使えそう
    - ServiceLensはX-Rayがより便利になった感じ(分散トレーシング)
    - Contributor Insightsは性能検証につかえそうだけど触ってない
    - CloudWatch settingsはマルチアカウントの監視が便利になったっぽい
    - Container Insightsはコンテナ用で便利でしょうが未検証