はじめに
VPC内(プライベートネットワーク)で手軽にURL監視を行う方法としてCloudWatchSyntheticsを少し試してみました。
その際の手順について簡単にまとめておこうと思います。
CloudWatch Syntheticsとは
Canaryと呼ばれるスクリプト(Lambda関数)によって、エンドポイントとAPIのモニタリングをスケジュールに沿ってモニタリングができます。
そして、スクリプト(Lambda関数)のためモニタリングの条件をカスタマイズ(自身でコーディング)できます。
詳細については合成モニタリング (canary)を参照ください。
Canary の作成
Canary を作成するを参考にCanaryを作成します。
AWSマネジメントコンソール上でCloudWatch > Synthetics Canaryへ遷移し、Canary を作成をクリックします。
画面上で以下のように指定します。
設計図:ハートビートのモニタリング
<Canaryビルダー>
名前:Canaryの名前を入力
アプリケーションまたはエンドポイントURL:モニタリング対象のURLを入力
<スクリプトエディタ>
ランタイムバージョン:ここではデフォルトのsyn-nodejs-puppeteer-9.1としています

<スケジュール>、<データ保持>、<データストレージ>
いずれもデフォルトのまま

<CloudWatchアラーム>
次の手順(CloudWatch アラームの設定)にて設定します
<VPC設定>
VPC、サブネット、セキュリティグループ: スクリプト(Lambda関数)が動作するサブネットを指定し、モニタリング対象へアクセス可能なセキュリティグループを指定
上記を入力しましたらCanaryを作成をクリックして完了です。

<ご参考>
私が本作業を実施したタイミングでは、指定したいセキュリティグループが画面上に表示されない事象が発生したため、CLIから設定を更新しました。
aws synthetics update-canary --name <上記で指定したCanary名> --vpc-config SubnetIds=subnet-aaaaaaaa,subnet-cccccccc,SecurityGroupIds=sg-xxxxxxxx
CloudWatch アラームの設定
モニタリング対象のURL監視が失敗した際にメールを通知するよう、CloudWatchアラームの設定をおこないます。
aws cloudwatch put-metric-alarm \ --alarm-name '<アラーム名>' \ --alarm-description 'Synthetics alarm metric: Failed GreaterThanOrEqualToThreshold 1' \ --actions-enabled \ --ok-actions 'arn:aws:sns:ap-northeast-1:<AWSアカウント番号>:<SNSトピック名>' \ --alarm-actions 'arn:aws:sns:ap-northeast-1:<AWSアカウント番号>:<SNSトピック名>' \ --metric-name 'Failed' \ --namespace 'CloudWatchSynthetics' \ --statistic 'Sum' \ --dimensions '[{"Name":"CanaryName","Value":"<Canary名>"}]' \ --period 300 \ --evaluation-periods 1 \ --datapoints-to-alarm 1 \ --threshold 1 \ --comparison-operator 'GreaterThanOrEqualToThreshold' \ --treat-missing-data 'notBreaching'
確認
最後に、上記手順にて設定したCanaryとアラームの動作確認をして終わります。
モニタリング対象が動作しているサーバーを停止(20:05)、起動(10:15)してアクション(SNSトピックによりメール通知される)が動作していることを確認できました。

おわりに
今回は1つのURLに対しての単純な監視設定を行いましたが、複雑なステップが必要なサービス監視の自動化や、リンク切れチェック、リリース作業の度に実施する目視でのサービス確認の自動化、性能監視などいろいろなケースで活用できそうでした。
スクリプトがLambda関数であることのカスタマイズ性の自由度がある反面、Lambda関数の運用・保守が発生するという面も踏まえて実環境への適用についてはご検討ください。