CloudWatchMetricsの基本的な操作とアラーム設定方法

# はじめに
CloudWatch MetricsとAlarmは運用を基礎から支える大事なサービスだと思います。
前から気になっていたので、基本的な操作を確認しました。

各サービスの概念などはBlackBeltを参考にし、この記事ではマネコンでの操作をメモできればと思います。

https://www.youtube.com/watch?v=fzVkJne3OMI

## CloudWatch Metrics
早速CloudWatch Metricsを触ってみます。
今回はlambda関数を実行することで自動収集されるメトリクスを利用して、
関数のエラー率、処理時間のMAX,MIN,AVGなどをグラフ化してみようと思います。

<details><summary>lambdaサンプル</summary>

```index.js
exports.handler = async (event) => {
    // 基本の2秒待機
    await new Promise(resolve => setTimeout(resolve, 2500));

    // ランダムで最大1秒の追加待機時間
    const additionalWait = Math.random() * 1000; // 0から1000ミリ秒(1秒)のランダムな値
    await new Promise(resolve => setTimeout(resolve, additionalWait));

    return {
        statusCode: 200,
        body: 'Hello from Lambda!'
    };
};
```


```index.js
exports.handler = async (event) => {
    return {
        statusCode: 200,
        body: 'Hello from Lambda!'
    };
};
```


```index.js
exports.handler = async (event) => {
    throw new Error('アラーム検知テスト');
};
```

</details>

### lambda関数のエラー率を計測する
#### マネコンからMetricsへアクセス
CloudWatchページからアクセスします。

![cap1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654730/3b870730-66a5-40ba-5759-068971a2a96f.png)

#### 計測したいメトリクスをグラフ表示させる

+、-ボタンをクリックすることで任意のメトリクスをフィルターできます。

![cap2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654730/b201c94e-3a9a-489c-10f5-ed85050de15b.png)

作成したlambdaのメトリクスを選択します。

#### グラフを確認してみる
エラー率を確認するために、まずは全体実行数を表示させます。

![cap3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654730/eedbd641-eb2f-235f-7173-655afca5f808.png)

作成したlambdaの「invocations」メトリクスを選択し、グラフ表示させました。
5回起動されたことが分かります。

#### 他のメトリクスをグラフ上に表示する
同様に、エラーの数もグラフ上に同時に表示してみます。
メトリクスから、エラーの数を計測している「Errors」を選択します。

![cap4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654730/93f57658-4adb-905b-216b-ecb848038fce.png)

グラフ上に「invocations」「Errors」が同時に表示されました。
次はこれらの数をinputに、エラー率を計測してみます。

#### タブを切り替える
メトリクスを組み合わせて新たなメトリクスを表示させるには、数式機能を使います。

![cap5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654730/8528b0bb-4a4a-ddde-55a4-706333a729c1.png)

「グラフ化したメトリクス」タブに移動します。

#### 数式を追加する
今回はエラー率を表示してみたいので、「Errors/invocations」の結果を表示させます。

![cap6.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654730/3aaa90b9-04ec-2580-6cbf-322ef181c4fa.png)

数式を追加 > 一般 > パーセンテージ を選択します。

![cap7.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654730/b45937b6-c4b4-a2e7-a002-2724eee7400f.png)

新たに「式１」と書かれたメトリクスが表示されました。

#### 数式を修正する
数式の内容が「invocations/Errors」になっているので修正します。

![cap8.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654730/2985c815-0358-9c96-d8ea-b44e0deaf391.png)

鉛筆マークから修正を行います。

#### ラベルなどを整える
ラベルなども変更できるため適宜修正します。

![cap9.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654730/73b7355f-32a9-ef66-d3cc-49b2c6e32c93.png)

良い感じにエラー発生確率を確認できるグラフが完成しました！

### lambda関数の処理時間を計測する
#### 処理時間を取得する
続いて、処理時間のMAX,MIN,AVGを取得してみようと思います。

![cap10.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654730/af0b74ff-0cfc-d149-106a-b2d8045f5def.png)

処理時間メトリクスである「Duration」をグラフ表示した後、
複製ボタンをクリックします。


#### 統計属性を変更する
統計タブを変更し、DurationのMAX,MIN,AVGをそれぞれ表示してみました。

![cap11.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654730/0663af38-5848-463c-0d26-18239b4e9336.png)

このように、一つのメトリクスでも、統計によってさまざまなデータのとり方ができることが確認できました。

#### グラフを保存する
メトリクスのグラフは、このままでは保存されません。
設定した内容を保存するためには、ダッシュボードにグラフを追加する必要があります。

![cap12.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654730/b35efe21-ec90-1974-cfd2-99829f82a314.png)

アクション > ダッシュボードに追加 を選択します。

#### ダッシュボードを作成する①
ダッシュボードが存在しない場合、新規作成を行います。

![cap13.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654730/fa72e2e8-e1ba-a798-b9cf-9574a4e33fda.png)

新規作成をクリックします。

#### ダッシュボードを作成する②
必要な項目を入力します。名前だけのようです。

![cap14.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654730/b08ebfe2-49d8-4bb0-f6e4-811f7bee18fa.png)

作成をクリックします。

#### ダッシュボードに追加する
その他、適当に選択します。

![cap15.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654730/b3ae57ee-af30-32b2-ef94-6adc826f7b84.png)

問題ない場合、「ダッシュボードに追加」をクリックします。

#### 追加されたグラフを確認する
CloudWatch > Dashboards > 作成したダッシュボードへと遷移し、グラフが保存されていることが確認できます。

![cap16.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654730/2246b037-53a0-a238-0289-545286e46573.png)

## Amazon CloudWatch Alarm

メトリクスをもとにリソースやプロダクトを監視し、問題がある状態と判断された場合、
Amazon CloudWatch Alarmを使用することで、SNSなどにアラートを上げることができます。

これも重要な機能なのでさわってみます！

### 特定状況でSNSへアラートを通知する
今回は、特定のスパン内に、lambdaのエラーが連続した場合、
アラートを発砲させるようなAmazon CloudWatch Alarmを作成してみます。

#### アラームを作成する

CloudWatch > アラーム から、「アラームの作成」を選択します

![cap17.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654730/932f039c-a223-2418-f29e-efc9580e4a00.png)

#### メトリクスを選択する

![cap18.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654730/a35ec7a8-9188-4359-d051-f0454e089ef4.png)

メトリクスの選択をクリックします。

![cap19.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654730/a03f7765-422c-6cd8-4a5c-5982f72ac4d5.png)

メトリクス画面と同様のUIが立ち上がります。
グラフ作成時と同様に、メトリクスを選択します。

![cap37.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654730/8fd2c462-e2ff-89c9-9cfe-c83bb9aeb5a8.png)

今回はlambdaの「Errors」を選択しました。

#### データポイント
Amazon CloudWatch Alarmは、データポイントという単位で、一定期間のメトリクスを集計します。

データポイントには統計方法と期間が設定されており、メトリクスの集計値は、この統計方法と期間によって決定します。

例えば、統計方法が平均値、統計期間が5分の場合、
あるデータポイントの集計値は、最初のメトリクスが届いてから5分間に届いたすべてのメトリクスの平均値、ということになります。

:::note warn
データポイントは、「**計測中のデータポイントが存在しない状態でメトリクスが届いてから作成される**」ことに注意です。
publishされる頻度の低いメトリクスの場合、データポイントが新たに作られず、アラームの評価が変更されない状況が続く可能性があります。
:::

#### アラームの条件を指定する
アラームはそれぞれ以下のような設定にしました。

![cap20_0.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654730/a5930a1b-a89c-8c1d-d6a0-1a43f0658616.png)

- 統計 : 最小
  データポイント内のデータをどう統計するか？を設定します。
  今回はエラーの数は考慮しないため、最小を選択しています。

- 期間 : 一分
  データポイントの統計収集期間を設定します。

- 条件 : １以上
    データポイントとしきい値との比較条件です。
    データポイントが1以上の場合、条件が満たされていると判断されます。

- アラームを実行するデータポイント : 2/2
    直近のデータポイント2つを確認し、
    2つともアラーム条件を満たしている場合、アラームが実行されるように設定しています。

設定後、「次へ」ボタンをクリックします。

#### アラーム状態をSNSトピックに送信する
アクションの設定画面になります。

![cap21.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654730/1449a15f-63ee-7eeb-1b79-1b6fec125bd7.png)

通知の送信先から、適当なSNSトピックを選択します。

SNS以外にも連携できます。

![cap22.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654730/3e84e125-9908-0aae-596b-8665aaf2c932.png)

今回はスルーします。

#### アラーム名とdescriptionを記入
任意の値を記入します。

![cap23.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654730/34e3d60b-1ca0-ad5d-9c13-bcc09f54c25f.png)

「次へ」をクリックします。

#### 設定内容を確認し、リソースを作成する
設定内容を確認します。

![cap24.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654730/e5dc71c9-4789-9111-21a0-a612b8b8c0dc.png)

「アラームを作成」をクリック

#### マネコンからアラームを確認する

![cap25.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654730/f77c928e-4636-bf15-0f96-0bd12a93bd11.png)

CloudWatch > アラーム から確認できます。

#### 動作を確認する
lambdaを実行し、正常終了やエラーを発生させてみます。

![cap31.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654730/423fe4f3-7997-a056-16e8-1563dc14dda7.png)

エラーのCountが1上がっているが、1/2状態なので、OKである期間が確認できます。

![cap32.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654730/a50e0d00-a84f-a167-5cb0-d4e7c1705dcf.png)

エラーが続くと2/2を満たしアラーム状態になることも確認できました。

# おわりに
CloudWatch メトリクスとアラームに挑戦してみました。
まだまだ初歩的な使い方しかしていませんが、雰囲気は掴めたと思います。

実運用でも使いそうで、わくわくします。