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


目的

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

Amazon CloudWatch Synthetics とは(自分の理解)

やったこと

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

構成図

手順

事前準備

  • 構成図の通り、以下の環境を作成しておく。
    • 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

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

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


動作確認

正常時の動作

  • 監視アクセスに成功すると、成功としてカウントされ、スクリーンショット等も取得される。(私の環境では日本語は文字化けしているが…)

  • 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になっており、それがエラー原因であることが表示される。

所感

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