AWS入門ブログリレー2024〜Amazon CloudWatch Synthetics編〜
当エントリは弊社AWS事業本部による『AWS 入門ブログリレー 2024』の2日目のエントリです。
このブログリレーの企画は、普段 AWS サービスについて最新のネタ・深い/細かいテーマを主に書き連ねてきたメンバーの手によって、 今一度初心に返って、基本的な部分を見つめ直してみよう、解説してみようというコンセプトが含まれています。
AWS をこれから学ぼう!という方にとっては文字通りの入門記事として、またすでに AWS を活用されている方にとっても AWS サービスの再発見や 2024 年のサービスアップデートのキャッチアップの場となればと考えておりますので、ぜひ最後までお付合い頂ければ幸いです。
では、さっそくいってみましょう。今回のテーマは『Amazon CloudWatch Synthetics』です。
CloudWatch Syntheticsのサービス概要
CloudWatch Syntheticsは一般的に「外形監視」と呼ばれる監視を実施することができるサービスになっています。
CloudWatch SyntheticsではCanaryというスクリプトを利用することでWebアプリケーションやAPIに対して継続的にテストを行います。実際のユーザートラフィックがなくてもエンドポイントをテスト可能で、設定した閾値に基づいてエラーがあればアラートを上げることができます。
監視の対象としてAWS内のリソースのみでなくAWS外のパブリックアクセスなエンドポイントも対象とすることができます。
(引用元:【AWS Black Belt Online Seminar】 Amazon CloudWatch Synthetics)
CloudWatch Syntheticsでは基本的なユースケースに対応したBlueprint(テンプレート)が用意されており、シンプルな用途ではノーコードでCanaryを作成することができます。カスタマイズを行うことで複雑な操作を表現することも可能です。
Canaryについて
Canaryとはスケジュールに沿って実行される設定可能なスクリプトです。
Canary全体構成イメージとしては以下になります。
(引用元:【AWS Black Belt Online Seminar】 Amazon CloudWatch Synthetics)
それぞれの項目について見ていきたいと思います。これから紹介する項目はCanaryを作成する際に基本的に共通して設定を行う項目になっています。
スクリプト
先ほど簡単に触れたようにBlueprintを利用することで基本的な用途に対応可能です。後ほど用意されているBlueprintについて実際に構築した例を紹介させていただきます。
その他インラインエディタやS3に保存されたファイルをインポートするという方法を選択することも可能です。
Canaryのスクリプトの本体はLambdaで構成されており、言語としてはNode.jsとPythonを選択可能です。
選択する言語によってブラウザ操作ライブラリが異なり、Node.jsではPuppeteerでPythonではSeleniumを利用することになります。
また選択するBlueprintや一部機能についてはPythonが対応していないケースがありますので注意が必要です。
スケジュール
実行スケジュールとしては3つから選択可能です。
- 継続的に実行
1~60分のから間隔を指定して、その間隔おきにスクリプトを実行します。
- CRON式
CRONで実行時間を指定し、その時刻にスクリプトを実行します。
- 1回実行
Canary は作成時にすぐにスクリプトを実行します。
またタイムアウトの設定を行うことができます。このタイムアウトにはスクリプトの実行時間のみでなくLambdaの起動時間を含みますので、コールドスタートを許容するように15秒以上を設定することが推奨されております。
データストレージ
Canaryの実行によって生成されるログ、スクリーンショットやHAR(HTTP Archive)ファイルを保存するためのS3バケットを選択します。
Node.jsを利用している場合には保存時の暗号化方法としてAWS KMSを利用することが可能です。
- ランタイムとして「syn-nodejs-puppeteer-7.0」を選択した例
- ランタイムとして「syn-python-selenium-3.0」を選択した例
データ保持期間
コンソールに表示するデータの保持期間を選択できます。成功時と失敗時それぞれに期間を設定することができます。
アクセス許可
設定したスクリプトの本体であるLambdaを動かすためのIAMロールの設定を行います。
新しいロールを選択すると必要な権限が付与されたロールが自動で作成されます。
事前にロールを作成する場合には、Canaryに必要なロールとアクセス許可を参考にIAMロールの作成を行ってください。
VPC設定(オプション設定)
こちらの設定を行うことでスクリプトの本体であるLambdaを特定のVPC内のサブネットに配置することができます。内部からのみアクセスが想定されているエンドポイントなどアクセス手段が限られている対象を監視する時に有用です。
VPCからS3などの各種パブリックエンドポイントにアクセスできない環境の場合にはVPC内にVPCエンドポイントの設定を行う必要があります。
CloudWatch アラーム(オプション設定)
Canaryの実行結果によって発動するアラームをこの画面で一括で作成することができます。もちろんCanaryの設定後CloudWatchアラームの画面から設定することも可能です。
Canary作成後以下のようにアラームが作成されておりました。
Blueprintについて
以下の6種類のBlueprintが用意されています。Pythonでは対応していないものもあるので注意してください。
(引用元:【AWS Black Belt Online Seminar】 Amazon CloudWatch Synthetics)
こちらを利用することでシンプルな要件であればノーコードで設定を行うことができます。
ではそれぞれのBlueprintについて実際に作成を行いながら見ていきたいと思います。
ハートビートのモニタリング
基本的なチェックを行うことが出来るBlueprintです。
指定したURLに対してアクセスを実行し、設定したS3バケットに対してHARファイルと実行ログを保存します。またオプションでスクリーンショットを保存することもできます。
正常/異常の判定はレスポンスのステータスコードで判断され、200番台であれば正常と判断されます。「syn-nodejs-puppeteer-7.0」を選択した例では80行目から82行目で定義されておりました。変更した場合にはこちらに手を加えることで変更できそうです。
//If the response status code is not a 2xx success code if (response.status() < 200 || response.status() > 299) { throw new Error(`Failed to load url: ${sanitizedUrl} ${response.status()} ${response.statusText()}`); }
Node.jsを利用している場合には複数のURLのモニタリングが可能になります。
- Node.jsを利用しているケース
追加後
- Pythonを利用しているケース
Pythonを選択しているケースでは複数URLの指定ができないので、追加のボタン自体が消えていました。
実行結果について
テストとしてDevIOと筆者のDevIO執筆者ページにアクセスさせ、スクリーンショットを取得するようにCanaryを作成して確認してみます。
以下のようにステップ毎に結果を取得できました。
失敗しているケースでは以下の例のように左側に発生したエラーが表示され、確認を行うことができます。
(引用元:【AWS Black Belt Online Seminar】 Amazon CloudWatch Synthetics)
スクリーンショットも問題なく取れています。
ログはS3に保存されているものと同じものが表示されていました。
HARファイルも同様にS3に保存されているものと同じものが表示されていました。
API Canary
REST APIに対して、リクエストを送信してレスポンスの確認を行うことのできるBlueprintです。
URLやヘッダー、リクエストボディを設定してリクエストを行うことができ、HTTPリクエストとレスポンスの内容とログを取得できます。
API Gatewayと統合することも可能で、同じアカウント内にあるAPI Gatewayのステージやパスを指定してリクエストを送信することができます。
- APIのURLを指定した場合
API Gatewayを指定しない場合の設定としては以下のような形で設定を行うことができます。
HTTPメソッド(GETもしくはPOST)、エンドポイントURL、ヘッダーを指定できます。
オプションでボディの指定を行うことができます。またこれもNode.jsのみとなりますが、複数ステップの指定やヘッダーとリクエスト/レスポンス本文を取得するオプションを設定することができます。
1点注意点としてエンドポイントURLを入力するとステップも自動入力されるようになっています。
入力したURLに対して「検証」をプラスして自動でステップが入力されます。
このまま登録してしまうと「検証」という日本語が含まれていることにより、メトリクスへの登録が失敗してしまいCanaryの実行が失敗と記録されてしまいます。
ステップ名を登録する際には自動で生成されたまま登録するのではなく、日本語を利用しない形にするように注意しましょう。
- API Gatewayと統合した場合
同じアカウント内にあるAPI GatewayのAPIとステージをリストから選択できます。
エンドポイントURLではなく、API Gatewayと統合を行う場合、リソース名とそれに伴うメソッドを指定します。
こちらもオプションでボディの指定を行うことができます。またこれもNode.jsのみとなりますが、複数ステップの指定やヘッダーとリクエスト/レスポンス本文を取得するオプションを設定することができます。
こちらも同様にステップ名に自動で日本語入力されるため、注意が必要です。
実行結果について
テストとして作成したREST APIのAPI Gatewayに対してアクセスを行ってみます。
ハートビートと同様にステップ毎に結果を取得できます。
HTTPリクエストのキャプチャを設定しているので、リクエストとレスポンスのヘッダと本文を取得できていました。
「Canary Test OK!」と返却するようにAPI Gatewayのmockで設定しておりましたので問題なく取得できていそうです。
リンク切れチェッカー
リンク切れチェッカーのBlueprintでは、指定したWebページをスタート地点として設定されているリンクを収集して、指定されたリンク数を上限に達するまでリンクが切れている箇所がないかを確認することができます。
(引用元:【AWS Black Belt Online Seminar】 Amazon CloudWatch Synthetics)
設定としてはハートビートのモニタリングと似ており、チェックを行う上限数を設定の内容に加えたイメージです。
こちらのBlueprintではPythonは対応しておらず、Node.jsであっても複数のステップを設定することはできません。
実行結果について
筆者のDevIO執筆者ページをスタート地点として、10個のリンクを確認してみました。
このようにチェックしたリンクを一覧にそれぞれ成功したか確認することができました。
スクリーンショット、ログ、HARファイルは以前のBlueprintと同様に取得できていました。
Canary レコーダー
Chromeの拡張機能であるCloudWatch Synthetics Recorderを利用して、Webサイトで確認して動作を記録してその操作をCanaryで実施するように設定できます。
プラグインをインストールして更新を行うと以下のように画面が変化しました。
では実際に拡張機能を使って動作を記録させていきます。まず拡張機能からレコーディングを開始させます。
ブラウザで操作を行なって、最後にレコーディングを終了させます。
すると操作を行なった内容がNode.jsのコードとして出力されました。これをコピーしエディターに貼り付けます。
これに加え共通の設定を行えば設定完了です。
実行結果について
筆者のDevIO執筆者ページからブログに移動して再度筆者のDevIO執筆者ページに戻ってくるという操作を繰り返し行なってその内容を記録する内容でテストしました。
以下のように記録した内容がステップとして記録されており、対応した内容毎に成功失敗が記録されておりました。
スクリーンショットでは、各ステップの操作の開始前と成功時が記録されておりました。
GUI ワークフロービルダー
Webページに対して、操作を行うアクションをGUIで指定して意図通りの操作をできるかを確認できます。先ほどのCanary レコーダーの操作を手動で登録するイメージを持っていただけると良いかと思います。
登録できる操作としては、クリック、セレクターの確認、テキストの確認、テキストの入力、ナビゲーションでクリックの5つになります。これらの動作を組み合わせてログインページからログイン操作が可能であるかなどのテストが可能です。
詳細な内容については以下ドキュメントを参考にしてください。
複数のアクションを登録可能で、内容を入力するとスクリプトに自動で反映されるようになっています。
実行結果について
先ほどと同様に筆者のDevIO執筆者ページからブログに移動して再度筆者のDevIO執筆者ページに戻ってくるというテストを実施しました。
登録した操作毎にステップで評価されていました。
スクリーンショットはCanary レコーダーと同様にステップの開始前と成功時が記録されておりました。
ビジュアルモニタリング
指定したURLのWebページに変化が起きていないかを検知できます。
最初に正常実行できたCanaryで取得したスクリーンショットをベースラインとして、その後のCanary実行時に取得したスクリーンショットと比較して変化がないかをチェックします。
任意で設定できる画面全体の変化割合の閾値を超える変化があると、失敗として検知できます。
設定する内容としてはハートビートのモニタリングとほぼ同様で、変化割合の閾値を追加で設定することができました。
画面の変化割合を確認する都合上、スクリーンショットの取得可否設定は存在しておらず必須で取得を行うようになっていました。
こちらのBlueprintではPythonは対応しておりません。
実行結果について
テストとしてDevIOのURLを指定して、変化をチェックしてみました。
初回実行以降に画面に変化があったため、失敗となっておりました。
スクリーンショットの画面を確認すると、Canary実行時刻のスクリーンショットと変更部分が黄色く表示される初回実行との差分を取得することができました。
新しいブログが投稿されたことにより、画面に変化が発生しそれを検知してくれておりました。
ベースラインの設定変更
監視を行うとき正とするベースラインを変更したい場合があるかと思います。その際はCanaryの再作成ではなくCanaryの設定変更で対応可能です。
対象のCanaryのアクションボタンから「編集」を選択して、
ビジュアルモニタリングの設定から設定の変更を行うことができます。
次の実行を新しいベースラインとして設定を行うことで、次回のCanary実行を正としてその次以降の実行と比較させることが可能です。
こちらの設定を行うと設定した間隔で実行するのではなく、設定完了を即実行してベースラインを変更してくれておりました。
また、ベースラインとしているスクリーンショットから画面の一部を比較対象から除外する設定も可能です。ベースラインを編集を選択すると比較対象から除外する範囲を指定できます。
実行をしていると以下のようにバナー部分が変化しておりました。
こちらを以下のように指定して比較の対象外としてみたいと思います。
結果としてバナー部分を変化していても成功と記録されるようになりました。
料金について
他のAWSサービスと同様、使った分だけ料金が請求される従量課金制となっています。
CloudWatch Synthetics自体にかかる料金とCloudWatch Syntheticsで利用されるサービスについての料金が発生します。
CloudWatch Syntheticsの利⽤料
まず一つ目の料金ですが、CloudWatch Synthetic自体の利用料となります。
こちらはCanaryの実行1回あたり、0.0019USD(東京リージョン)となります。
簡単な料金の目安です。1ヶ月(30日)監視を続けた場合の料金となっております。
実行間隔 | USD | 日本円(1USD=150円で計算) |
---|---|---|
1分間隔 | 82.08USD | 12312円 |
5分間隔 | 16.416USD | 2462円 |
10分間隔 | 8.208USD | 1231円 |
1時間間隔 | 1.368USD | 205円 |
CloudWatch Syntheticsの実行に伴う他サービスの料金
CloudWatch Syntheticsで利用する関連サービスについても利用料金が別途発生します。
具体的にはCanaryの実行に利用されるLambdaの費用、結果を保存するS3の費用などが必要になります。またオプションとしてCloudWatchアラーム等を利用する場合においても別途費用が発生してきます。
CloudWatch Synthetics一括での料金ではないのでこれらのコストが発生する点に注意してください。
終わりに
以上、『AWS 入門ブログリレー 2024』の2日目のエントリ『CloudWatch Synthetics』編でした。 次回、3/27は弊社杉金晋による「AWS Control Tower編」の予定です!
参考
【AWS Black Belt Online Seminar】 Amazon CloudWatch Synthetics