【初心者】Amazon CloudWatch Synthetics を使ってみる

# 目的
- 先日AWS東京リージョンの障害があり、「監視はAWS東京リージョンの外からしたほうがよいかも…」と思っていた時に、CloudWatch Syntheticsの話を聞いたので、どんなものか試してみる。

# Amazon CloudWatch Synthetics とは（自分の理解）
- 外部からWebサーバ等の正常性監視ができるサービス。
- 監視の設定(canary)を作ると、実体としてはLambda Functionが作成される。
- 先人の記事「[Amazon CloudWatch Synthetics を試してみた](https://qiita.com/hoto17296/items/4c8562b51e1fb9d66e6a)」や「[CloudWatch SyntheticsでオンプレミスのProxyサーバーを経由して監視する](https://qiita.com/hayao_k/items/5e65fa0fac3c6360d6b9) 」を読んで、イメージを掴んでから実機で確認する。
- 監視対象のWEBサーバがSrcIP制限をかけているケースを想定して、固定IPでアクセスできるように、VPC Lambda + Nat Gatewayでの検証環境設定とする。

# やったこと
- 監視対象のWEBサーバの作成(普通のEC2インスタンス/nginx)
- 監視対象のWEBサーバとは別のVPCにて、NAT GatewayからInternet抜けできるsubnetを作成
- CloudWatch Syntheticsの監視スクリプト(canary)を作成（上記のsubnetをlambdaの動作場所として指定）
- 固定されたSrcIP(NAT Gateway経由)から監視対象のWEBサーバの正常性監視ができることを確認
- WEBサーバにてリンク切れを発生させると、エラー検知できることを確認

# 構成図
![syn00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/4436b7a0-7dc0-c880-7e49-c9ac6fd69929.png)

# 手順
## 事前準備
- 構成図の通り、以下の環境を作成しておく。
    - VPC1/Subnet1: Webサーバ(EC2インスタンス/nginx)を起動させる用のSubnet。(Public Subnet)
    - VPC2/Subnet2: canary(監視スクリプト)の実体となるLambdaを起動させる用のSubnet。Nat Gatewayでのインターネットアクセス可能にしておく。

## 監視対象のWEBサーバの作成
- 監視対象のWEBサーバ(nginx)を作成し、EIPを付与してインターネット公開する。
- index.html のコンテンツを以下とする。

``` index.html
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
    <head>
        <title>Test Page for the Nginx HTTP Server on Amazon Linux</title>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    </head>
    <body>
        <h1>Synthticsからアクセスされるページ</h1>
        <p>
        <a href="mikan.html">mikan: みかんの説明ページ</a>
        </p>
        <p>
        <a href="ringo.html">ringo: りんごの説明ページ</a>
        </p>
    </body>
</html
```

![syn01a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/bfe994df-0759-11e1-8a69-a0297176f251.png)



## CloudWatch Synthetics の監視スクリプト(canary)の作成

- CloudWatch - Synthetics - Canary を作成　を選択し、監視スクリプト(canary)を作成する。
    - 設計図を使用する（初心者なので）
    - 設計図: リンク切れチェッカー
    - アプリケーションまたはエンドポイントURL: 監視対象のWEBサーバのEIP
    - VPC設定: 作成したVPC2/Subnet2 を指定する。



![syn10a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/d7863c6b-db3c-6865-3011-2e8d259dc61f.png)
![syn11a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/c72b1995-1674-014e-196b-afe632a85256.png)


# 動作確認
## 正常時の動作
- 監視アクセスに成功すると、成功としてカウントされ、スクリーンショット等も取得される。（私の環境では日本語は文字化けしているが…）



![syn12a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/47d769ad-5fa7-0123-f79b-56fe18cd3c21.png)


- WEBサーバ側のアクセスログにはcanaryのARNが保存される。

``` /var/log/nginx/access.log
x.x.x.x - - [12/May/2020:16:03:22 +0000] "GET /mikan.html HTTP/1.1" 404 3665
 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Hea
dlessChrome/75.0.3738.0 Safari/537.36 CloudWatchSynthetics/arn:aws:synthetics:ap
-northeast-1:xxxxxxxxxxxxxx:canary:mksamba-canary" "-"
```

## リンク切れ発生時の動作
- WEBサーバにて、index.html内でリンク先として指定しているringo.htmlを削除後、再度監視アクセスを行うとエラーになる。ringo.htmlが404 Not Foundになっており、それがエラー原因であることが表示される。


![syn13a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/2be32f3b-c2b8-6d40-341a-ad15b53df934.png)




# 所感
- 監視対象とは別リージョンで起動すればリージョン障害の影響を受けずに監視ができそう。
- 簡単な監視はすぐできそうだが、監視項目をきちんと定めて動作させるには、生成されるLambda Function(node.js)の内容理解やカスタマイズが必要かも…。