Amazon CloudWatch Syntheticsで簡単監視入門

## はじめに

皆さん運用監視してますか？
運用監視はいろいろと手間がかかるので敬遠されがちなんですが、運用監視の仕組みがないと、何かトラブルが起こっても気が付きません。
なので、システムを長期間安定的に稼働させるためには、運用監視の仕組みが不可欠ですよね。
今回はWebサイトの死活監視で利用できるAmazon CloudWatch Synthetics(以下Synthetics)について紹介します。


## Amazon CloudWatch Syntheticsとは

詳細な情報は公式のリファレンスを見て頂くとして、ざっくりと概要の説明をします。
Syntheticsを使うとWebサイトやAPIの定期的な死活監視をすることができます。
例えば、正常にWebページを取得できるか、APIを正常に呼び出すことができるか、などを定期的にチェックすることが可能です。

しかも、チェックする部分はLambdaのコードになっているので、自分なりにカスタマイズすることができます。
例えば、このAPIが正常に呼び出されたらこういうレスポンスが返ってくる、というのが決まっていれば、自分でプログラムを書けばチェックすることが可能です。


## 実際に設定してみる

では、実際に試してみましょう。
Cloudwatchの画面から、「Synthetics」>「Canaryを作成」をクリックします。

![Snag_252e212c.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192873/219b9eb4-1a11-f3e6-6892-ad5cf46e202e.png)


いろいろな選択肢がありますが、「設計図を使用する」を選択します。
今回はWebページの死活監視をするために、「ハートビートのモニタリング」を選択します。

![Snag_2531e009.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192873/6138230f-567d-dbae-7cb1-69f4c21af942.png)


Syntheticsでは、一つの監視単位をCanaryという名前で呼びます。
Canaryの名前と、監視したいWebページのURLを記載します。
また、スクリプトエディタでは実際に実行されるスクリプトが表示されています。
もし、スクリプトのカスタマイズに興味がある方は下記を参照ください。
[Canary スクリプト用のライブラリ関数](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_Function_Library.html#CloudWatch_Synthetics_Library_UIcanaries)

![Snag_253e0970.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192873/697dea00-05e9-bf2b-450f-8b4302e3fc87.png)

次にスクリプトをどのタイミングで実行するのか、データの保存期間の設定を行います。
今回はテストのため「1回実行」にしてみます。

![Snag_253fb5b9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192873/24626c5b-3db1-f9bc-f7da-65df2badcd64.png)

次にログ情報などを保存するS3バケットとIAM Roleの設定です。
とりあえず、デフォルトで設定します。

![Snag_25416686.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192873/6874d97a-a648-9079-bd47-53ecbc0aca05.png)

最後にCloudwatchアラームの設定を行います。
設定した閾値を超えた場合(下回った場合)に、指定したSNSトピックに通知します。
最後に「Canaryを作成」をクリックすれば、設定は完了です。

![Snag_254f1f47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192873/50eca927-1114-cd36-3e46-e9ad33ad5732.png)

## 監視状況を確認してみる

作成したCanaryは自動実行されるので、内容を確認してみます。
今回監視対象としたWebページは実際に存在するので、結果は成功として記録されます。
また、「スクリーンショット」、「HARファイル」、「ログ」も確認することが可能です。

![Snag_255896fc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192873/32eb2993-309c-eebe-fc00-e8cc4629ea8b.png)

「スクリーンショット」タブでは、画面のスクリーンショットを確認することができ、「HARファイル」タブではHARファイルの内容を確認することができ、「ログ」タブでは、実際にスクリプトが実行された際のログを確認することが可能です。

ちなみに、もしWebサイトに正常にアクセスできない場合は、エラーになります。

![Snag_256132c8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192873/f1042779-cd21-76cd-9bf9-2ee55bf497b3.png)


ChatbotとSlackを連携している場合は、下記の様なメッセージが届きます。

![Snag_2561b834.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192873/d56eb621-f112-c174-2c94-d653e565a878.png)

## APIエンドポイントのテストをする場合

簡単にAPIエンドポイントの場合について紹介します。
設計図でAPI Canaryを選択します。
そして、HTTPメソッドの選択、ヘッダーや送信するデータの設定を行います。

![Snag_2566197b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192873/85716432-ce39-1d74-31fd-b236b9ac2d73.png)

スクリプトエディタの内容も「ハートビートのモニタリング」の場合とは少し違いますね。
API呼び出しが200で成功しているかどうかは簡単に確認できそうです。

![Snag_2566d4ad.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192873/dbfc3020-3e84-46c4-9400-23da7764597a.png)


## 最後に

Webサイトの死活監視やAPIエンドポイントの死活監視は重要だけれども、いざ仕組みを作ろうと思うと結構めんどくさいことが多いです。
ですが、Syntheticsを使うと簡単に実現できるかことがお分かりいただけたのではないでしょうか。
証明書切れでWebページにつながらなくなったり、APIのデプロイで正常に動かなくなったり、ということを検知することができるので、非常に有益なサービスだと思います。
料金もそこまで高額ではないので、皆さんぜひ使ってみてください。

## 参考

[模擬モニタリングの使用](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries.html)
[Synthetics Canary のセキュリティ上の考慮事項](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/servicelens_canaries_security.html)