CloudWatch Syntheticsでシステム監視する

[パーソンリンク アドベントカレンダー](https://qiita.com/advent-calendar/2021/personlink) 3日目です🎉
案件で外部監視のために調査したAWSの機能紹介をします。

## 概要

CloudWatch Syntheticsとは、CloudWatchの機能の一つで外部監査を実現するサービスです。
外部監視とは外部から見た接続状況の監視です。

CloudWatch Syntheticsを利用するためにまずCanaryを作成します。
Canaryとはスケジュールに沿って実行されるスクリプトであり、実態はLambdaレイヤです。
Canaryの設計図に**GUIワークフロービルダー**を選ぶと、フォーム形式で検証するためのアクションを指定できます。
要素のクリックや存在確認などを行えるため、死活監視だけでなく簡単なE2Eテストもできます。
セレクタは**Xpath**指定です。

![スクリーンショット 2021-11-19 14.10.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140953/739aa64d-ab1a-5133-4d63-71a2d1131659.png)

上記アクションをそれぞれ指定した際のPythonのスクリプトです。
customer_actions_1などの関数が、フォームで指定したアクションになります。

```python
import asyncio
from aws_synthetics.selenium import synthetics_webdriver as syn_webdriver
from aws_synthetics.common import synthetics_logger as logger, synthetics_configuration

TIMEOUT = 10

async def main():
    url = "https://example.com"
    browser = syn_webdriver.Chrome()


    # Set synthetics configuration
    synthetics_configuration.set_config({
       "screenshot_on_step_start" : True,
       "screenshot_on_step_success": True,
       "screenshot_on_step_failure": True
    });


    # ページがロードできることを確認する
    def navigate_to_page():
        browser.implicitly_wait(TIMEOUT)
        browser.get(url)

    await syn_webdriver.execute_step("navigateToUrl", navigate_to_page)


    # Execute customer steps
    # ページ内の要素をクリックする
    def customer_actions_1():
        browser.find_element_by_xpath("//h1[@id='success']").click()

    await syn_webdriver.execute_step('click', customer_actions_1)


    # 要素が存在することを確認する
    def customer_actions_2():
        browser.find_element_by_xpath("//h1[@id='success']")

    await syn_webdriver.execute_step('verifySelector', customer_actions_2)


    # ターゲット要素内の文字列を確認する
    def customer_actions_3():
        browser.find_element_by_xpath("//h1[@id='success'][contains(text(),'sample text')]")

    await syn_webdriver.execute_step('verifyText', customer_actions_3)


    # ターゲット要素にテキストを入力する
    def customer_actions_4():
        browser.find_element_by_xpath("//h1[@id='success']").send_keys("sample text")

    await syn_webdriver.execute_step('input', customer_actions_4)


    # 要素をクリックしてナビゲーションを期待する
    def customer_actions_5():
        browser.find_element_by_xpath("//h1[@id='success']").click()

    await syn_webdriver.execute_step('redirection', customer_actions_5)


    logger.info("Canary successfully executed")


async def handler(event, context):
    # user defined log statements using synthetics_logger
    logger.info("Selenium Python workflow canary")
    return await main()
```

## 確認
可用性 > Step のタブで実行結果が確認できます。

![スクリーンショット 2021-11-19 16.04.08のコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140953/0879526b-db29-ac30-e605-82148d61e2b6.png)


## 削除
検証用などで消す場合、Canaryによって作成された関連リソースは自動的に削除されないので、以下も削除する必要があります。

・Lambda関数とレイヤー
・CloudWatchアラーム
・CloudWatchLogsのロググループ
・AmazonS3オブジェクトとバケット
・IAMロール

## 参考
https://www.sunnycloud.jp/column/20210909-01/

https://qiita.com/VA_nakatsu/items/abf15ffcbb021bbe446a

https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_Blueprints.html#CloudWatch_Synthetics_Canaries_Blueprints_GUI_Workflow

https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/synthetics_canaries_deletion.html