プライベートサブネットに配置したCanaryスクリプトからWebサイトのログイン確認を行う監視機能を作ってみた

2021.05.26

どーもsutoです。

「AWSのサービスを使ってWebサイトのDeep Health Checkのような動作を構築することはできますか?」というご相談があり、CloudWatch Synthetics Recorderを使えばそのような動作をするCanaryを簡単に作成できるのではと思って試してみました。

今回の検証では「WordPressのログイン処理」を動作するCanaryを作ってWeb監視(URL階層監視)をしてみます。

なので、「サイト内でSQLサーバを読みに行くリンクへアクセスする」ような動作をSynthetics Recorderで記録すれば、お手軽にDeep Health Checkの仕組みを実装できると思います。

今回の検証の概要

構成

今回の検証環境はこちら

  • 今回のLambda関数の配置はデフォルトVPCとする
    • 別リージョン、または別アカウントのVPCでも問題ない
  • CloudWatch Syntheticsのデフォルト設定では、非VPCのLambda関数のためグローバルIPは可変である
    • よって今回は、URL監視をする側のIPアドレスを固定したい要件を考慮し、Lambda関数をプライベートサブネットに配置し、NATゲートウェイ(NATGW)経由でWebサイトにアクセスを行ってみる
      • Lambda関数のアクセス元はNATGWのグローバルIPとなるので、セキュリティグループで制御が可能となる
  • CloudWatch SyntheticsのCanary(Lambda関数)で「Word Pressのログイン」を定期的に実行するURL監視を行う

手順の概要

おおまかに以下の流れで設定していきます。

※testVPC内にWordpress用のEC2が作成済であることを前提とします。

  • 1.デフォルトVPCに設定追加
    • パブリックサブネットにNATGW作成
    • プライベートサブネットを作成し、ルートテーブルのデフォルト(0.0.0.0/0)をNATGWに向ける
  • 2.testVPCに設定追加
    • EC2(WordPress)のセキュリティグループ(SG)にNATGWのEIPを許可
  • 3.Cloudwatch SyntheticsでCanary作成
  • 4.CanaryのLambda関数にアタッチするためのIAMロールに設定追加

実際に作ってみた

1.デフォルトVPCに設定追加

ここでは細かい手順は省略させていただきますが、以下のようにNATGW、プライベートサブネットとそのルートテーブルを設定します。

またNATGWのEIPを控えておいてください。

2.testVPCに設定追加

以下のようにWordpress用EC2にアタッチしているSGにNATGWのEIPを許可するようにします。

3.Cloudwatch SyntheticsでCanary作成

AWSコンソール「Cloudwach」メニューから「Synthetics → Canary」を選択し、「Canaryを作成」をクリック

設計図で「Canary Recorder」を選択。(初回の方は、Crome pluginをクリックし拡張機能をインストール)

Chrome拡張機能を追加する(初回のみ)

AWSコンソール画面に戻ると、エンドポイントを入力するボックスが表示されるので、Wordpressのログイン画面のURLを入力する(今回の検証ではEC2のパブリックDNSをそのまま入力しています)

ブラウザの別タブでWordpressのログイン画面にアクセスし、Cloudwatch Synthetics Recorderのアイコンをクリック、「Start Recording」をクリックします

ここから自分のPC操作の記録が始まるので、以下のブラウザ操作をレコードします

①ログイン画面のユーザ名を入力するボックスをクリック

②ログインするためのユーザ名をキーボードで手動入力(例では"suto"と入力)

③パスワードを入力するボックスをクリック

④パスワードをキーボードで手動入力

⑤「ログイン」ボタンをクリックしてログインする

操作レコード時の注意点

いろいろ検証中して気づいたのですが、以下のような操作はRecorderの操作にうまく記録されませんでしたのでご注意ください。

  • 「Ctrl +」「Alt +」のようなショートカットキーによるブラウザ操作
  • 「Tab」キーによる入力ボックスの遷移や、パスワード入力後の「Enter」キー押下によるログイン実行

操作を記録する際はあくまでアナログチックな動きを心がければ問題ないと思います。

ここまで完了したらSynthetics Recorder拡張機能の「End recording」をクリックします。するとスクリプトが自動生成されるので、「Copy to clipboard」をクリックしてスクリプトの全文をコピーします

AWSコンソール画面に戻り、スクリプトエディタの欄にコピーしたスクリプトを貼り付けます。

その他ビルダー名、スケジュールなどはお好きなように設定

アタッチするIAMロールはここでは新規作成を選択します(追加する必要があるIAMポリシーは後ほど実施)

VPC設定では「デフォルトVPC」「プライベートサブネット」「デフォルトのSG」を選択します

※ここに設定するSGに関しては、最低限アウトバウンドにエフェメラルポートの許可があればOKなのでデフォルトのSGで十分です。インバウンド許可は何も必要ありません。

すべてのパラメータへ入力が終わったら「Canaryを作成」をクリックし、設定を保存します。

数分後Canary設定が表示され、LambdaのメニューにLambda関数が生成されています。

4.CanaryのLambda関数にアタッチするためのIAMロールに設定追加

CanaryのLambdaはVPC内リソースとして設定されているので、LambdaのIAMロールにVPCリソースにアクセスできる権限を追加する必要があります。

AWSコンソールの「IAMロール」からSynthetics RecorderにアタッチしているIAMロールを開き、IAMマネージドポリシー「AWSLambdaVPCAccessExecutionRole」を追加します

「Cloudwatch Synthetics」画面に戻り、先ほど作成したCanaryから「編集」をクリックし、何も変更せず保存を実行します。(以下のハマりどころ回避として念のため)

Canary設定更新時の注意点

Cloudwatch Syntheticsで生成されたLambda関数の設定を変更したい場合は、必ずCanary側の画面で編集して保存しないと反映されない。(Lambdaの画面から変更をかけても反映されない)

結果を見てみる

タブ「Step」から実際のCanaryの結果を見てみましょう

※上記の検証結果の画面では9ステップになっていますが、いくつかマウスの左クリックの空打ちがRecorderに記録されてしまったためです。動作に支障は起こしていないので無視してください

すべてのStepが「Passed」としてサイト上で記録した操作が正常に完了していることが分かります

次にタブ「スクリーンショット」を確認してみます

Step7の「ログインボタン押下」の操作前と操作後の画面となります。Canaryのスクリプトがしっかりログインできていることが分かります

まとめ

以上、Deep Health Check機能を持つことができるCloudwatch SyntheticsのWeb監視(URL階層監視)を設定する方法でした。

Recorderを使ってWebサイトのGUI操作をレコードして、その動作を自動でスクリプト化してくれますので、自分たちで独自コードを書かなくてもWebコンテンツの動作確認を兼ねたURL監視を実装できるのが大きなメリットだと思います。

本記事が誰かの参考になれば幸いです。

参考記事