【SOA対策】CloudWatch

# CloudWatchとは？
AWSリソース、アプリケーション、オンプレミスのモニタリングを行ってくれるマネージドサービス

# 重要用語

## ◯CloudWatch メトリクス
各リソースから送られてくるデータポイント（一定期間で送られてくる数値情報）のまとまりを`CloudWatch Metrics`と呼ぶ。

####□メトリクス種類
**標準メトリクス**
CPU使用率、ネットワーク使用率など

**カスタムメトリクス**
ディスク使用率、メモリ使用率など

※EC2モニタリング例
####□メトリクスの保存期間
| データポイント期間　|　保存期間 |
|:-----------|:------------|
| 60 秒未満（高分解能カスタムメトリクス）     | 3 時間 |
| 60 秒（詳細モニタリング）    | 15 日間                     |
| 300 秒（標準）      | 63 日間   |
| 3600 秒    | 455 日 (15 か月)|


####□Dimensions
メトリクスを特定するためのラベル、データポイントに付与されている文字列的な情報
=>インスタンスIDなど。

####□Namespaces
大量のメトリクスを大きく分けるコンテナ
=>`AWS/ApiGateway`のように分けられる。

####□Statistics
指定した期間のメトリクスデータの集計

| 統計 |　説明 |
|:-----------|:------------|
| Minimum    | 特定の期間の最小値                      |
| Maximum    | 特定の期間の最大値                      |
| Sum        | 該当するメトリクスで加算されたすべての合計値   |
| Average    | 指定した期間の Sum/SampleCountの値（平均値）|
| SampleCount| 統計計算で使用するデータポイントの**数** |
| pNN.NN     | パーセンタイル => なにそれ？な方は[こちら](https://toukeigaku-jouhou.info/2018/03/31/percent-and-percentile/)で理解出来ると思います。|

####□Periods
Statisticsを何秒単位で集約するかを決めた数値情報で１秒単位で設定可能。
=>例） `直近5分間`で`平均CPU使用率`が`80%`を超えたときにメールで通知

çCloudWatch メトリクスをもとにアラームを発行する機能。
メトリクスが特定の閾値を超えた際にアラームが発動し設定していたアクションを実行が可能
・`SNS`を利用してEmail送信
・`AutoScaring`で指定したAMIから`EC2`を起動
・`Lambda`の呼び出しなど
####□Alarmのステータス
**OK**: 閾値内の値
**ALARM**: 閾値外の値
**INSUFFICIENT**: 収集し始めなどの理由により、データが不足していてアラームの状態を判定できない。

####□Alarmの評価
**Periods**: 上記参照
**Evaluation Periods**: アラームの状態を決定するまでに要するデータポイントの数
**Datapoints to Alarm**: ALARM状態に移るために閾値を超過する必要がある評価期間内のデータポイントの数

####□欠落データの処理方法の設定

| 処理方法 |説明  |
|:-----------|:------------|
| notBreaching   | 欠落データポイントは閾値内。|
| breaching    | 欠落データポイントは閾値外。  |
| ignore        | 直近のアラーム状態を維持   |
| missing    | 過去のデータポイントに遡る。|

##◯CloudWatch Logs
ログ監視と保存を担う機能。
様々なAWSリソースのログを`CloudWatch Logsダッシュボード`に集約出来、
ログの分析、メトリクスフィルターを使用して状態の監視を行い、特定の状態でAlarmを発砲してエラーを検知出来るサービス。
ログデータ保存期間は無制限もしくは**1日間～10年間**

####□ログの保存単位
**ログイベント**: リソースによって記録されたのログレコード１つ分
**ログストリーム**: ログイベントのまとまり
**ロググループ**: ログストリームのまとまり
例) EC2インスタンスが起動 => ログイベント情報流れてきてEC2インスタンスIDごとに分け、ログストリームに保存、ロググループ`EC2システムログ`という名前でグルーピング

####□CloudWatch Logs agent

EC2やオンプレミスサーバーからシステムレベルのメトリクスを収集することが出来る。
`CloudWatch Logs agent`からログデータが送信される間隔は、デフォルトでは**5秒**。(設定可）

####□サブスクリプション
サブスクリプションを利用するとCloudWatch Logsに保存したログデータをリアルタイムに処理し、下記のサービスに配信することが出来る。
・`Amazon Kinesis Data Streams`
・`Amazon Kinesis Data Firehose`
・`AWS Lambda`

ログの転送条件を定義する為にサブスクリプションフィルタを作成し下記を設定

| 項目 |説明  |
|:-----------|:------------|
| log group name   | サブスクリプションフィルタを適用するロググループ名。|
| フィルタパターン   |特定の文字列を含むログデータのみを送信するなど、メトリクスフィルターで指定されたものに一致する語句や値を、ログイベントの中で検索出来る。 |
| destination arn        | サブスクリプションフィードの送信先として使用する `Kinesis Data Streams`、`Kinesis Data Firehose`、または `Lambda`関数のリソースネーム (ARN)。|
| role arn   | CloudWatch Logs が送信先のリソースにデータを置くのに必要な権限を与えるためのIAMロール|
| ディストリビューション   | `Kinesis Data Streams` にデータを送信する場合、メソッドを指定する。|


##◯CloudWatch Events 
CloudWatch Eventsは、独自のトリガー（**イベントソース**）と何かしらの後続アクション(**ターゲット**)との組み合わせを定義するサービス。AWSの各サービスをよりシームレスに連携することが出来る。

####□イベントソース

**スケジュール**: 期間・時間ベースのトリガー定義。
**ターゲット**: AWSリソースの状態変化をトリガーにする。

####□ターゲット
ターゲットには既存のAWSリソースに対するアクションを定義
1つのイベントソースに対して複数のターゲットを定義することも可能。

・Amazon EC2 インスタンス
・AWS Lambda 関数
・Amazon Kinesis Data Streams のストリーム
・Amazon Kinesis Data Firehose の配信ストリーム
・Amazon CloudWatch Logs のロググループ
・Amazon ECS タスク
・Systems Manager コマンドを実行
・Systems Manager オートメーション
・AWS Batch ジョブ
・Step Functions ステートマシン
・CodePipeline のパイプライン
・CodeBuild プロジェクト
・Amazon Inspector の評価テンプレート
・Amazon SNS のトピック
・Amazon SQS キュー

組み込みターゲット: EC2 CreateSnapshot API call、EC2 RebootInstances API call、EC2 StopInstances API call、および EC2 TerminateInstances API call。
別の AWS アカウントのデフォルトのイベントバス
[Amazon CloudWatch Events とは](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/events/WhatIsCloudWatchEvents.html)

### 参考
[・【AWS】CloudWatch メトリクスを中心に6つの観点から徹底解説！](https://www.youtube.com/watch?v=0QoTZG_oYHY&list=PLtpYHR4V8Mg97DdIXF2HFGl1aWo5nSnNJ)
[・AWS再入門ブログリレー Amazon CloudWatch 編](https://dev.classmethod.jp/articles/re-introduction-2020-cloudwatch/)