目的
- 先日AWS東京リージョンの障害があり、「監視はAWS東京リージョンの外からしたほうがよいかも…」と思っていた時に、CloudWatch Syntheticsの話を聞いたので、どんなものか試してみる。
Amazon CloudWatch Synthetics とは(自分の理解)
- 外部からWebサーバ等の正常性監視ができるサービス。
- 監視の設定(canary)を作ると、実体としてはLambda Functionが作成される。
- 先人の記事「Amazon CloudWatch Synthetics を試してみた」や「CloudWatch SyntheticsでオンプレミスのProxyサーバーを経由して監視する 」を読んで、イメージを掴んでから実機で確認する。
- 監視対象の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サーバにてリンク切れを発生させると、エラー検知できることを確認
構成図
手順
事前準備
- 構成図の通り、以下の環境を作成しておく。
- 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)の内容理解やカスタマイズが必要かも…。