Amazon CloudWatch SyntheticsによるURL監視のアラームをメール通知してみた(AWS CDK)

2021.09.20

こんにちは、CX事業本部 IoT事業部の若槻です。

Amazon CloudWatch Syntheticsを使用すると、WebサイトやAPIのURLの監視(外形監視)を行うことができます。

今回は、Amazon CloudWatch SyntheticsによるURL監視のアラームをメール通知する構成をAWS CDKで実装してみました。

構成

10分に1回のCanary実行が一度でも失敗したらアラーム状態となりメール通知が行われます。

構築

CDKコード

lib/aws-cdk-app-stack.ts

import * as path from 'path';
import * as cdk from '@aws-cdk/core';
import * as cloudwatch from '@aws-cdk/aws-cloudwatch';
import * as cloudwatchActions from '@aws-cdk/aws-cloudwatch-actions';
import * as sns from '@aws-cdk/aws-sns';
import * as synthetics from '@aws-cdk/aws-synthetics';

export class AwsCdkAppStack extends cdk.Stack {
  constructor(scope: cdk.Construct, id: string, props: cdk.StackProps) {
    super(scope, id, props);

    //CloudWatch Synthetics Canary
    const canary = new synthetics.Canary(this, 'WebsiteCanary', {
      canaryName: `website-canary`,
      schedule: synthetics.Schedule.rate(cdk.Duration.minutes(10)),
      runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_2,
      test: synthetics.Test.custom({
        code: synthetics.Code.fromAsset(
          path.join(__dirname, `../src/lambda/website-canary-handler`)
        ),
        handler: 'index.handler',
      }),
      environmentVariables: {
        URL: 'https://dev.classmethod.jp/',
      },
    });

    //SNSトピック
    const canaryFailNotificationTopic = new sns.Topic(
      this,
      `canary-fail-notification-topic`
    );

    //CloudWatch Alarm
    const canaryAlarm = new cloudwatch.Alarm(this, 'canary-alarm', {
      alarmName: 'canary-alarm',
      metric: canary.metricFailed(),
      evaluationPeriods: 1,
      threshold: 1,
      statistic: cloudwatch.Statistic.SUM,
      comparisonOperator:
        cloudwatch.ComparisonOperator.GREATER_THAN_OR_EQUAL_TO_THRESHOLD,
      period: cdk.Duration.minutes(10),
    });

    //AlarmにSNSトピックに通知するアクションを追加
    canaryAlarm.addAlarmAction(
      new cloudwatchActions.SnsAction(canaryFailNotificationTopic)
    );
  }
}
  • Canary、SNSトピック、CloudWatch Alarmのリソースを作成しています。
  • Canaryの監視対象とするサイトのURLは環境変数URLでスクリプトに渡しています。
  • CloudWatch Alarmの評価期間はCanaryの実行間隔と同じ10分間とし、評価期間中のCanary実行のFail回数が1回以上であればアラーム状態となるようにすることにより、Canary実行が一回でも失敗すれば通知がされるようにしています。

CDKデプロイしてリソースを作成します。

サブスクリプションの登録

作成されたSNSトピックのサブスクリプションとしてメールアドレスを登録します。

アラームを発生させてみる

Canaryの監視対象URLを404となるものに変更し、CDKデプロイして変更を反映させます。

lib/aws-cdk-app-stack.ts

    const canary = new synthetics.Canary(this, 'WebsiteCanary', {
      canaryName: `website-canary`,
      schedule: synthetics.Schedule.rate(cdk.Duration.minutes(10)),
      runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_3_2,
      test: synthetics.Test.custom({
        code: synthetics.Code.fromAsset(
          path.join(__dirname, `../src/lambda/website-canary-handler`)
        ),
        handler: 'index.handler',
      }),
      environmentVariables: {
        URL: 'https://dev.classmethod.jp/hoge',
      },
    });

最新のCanary実行が失敗してアラームが発生しています。

サブスクリプションに登録したアドレスにアラーム通知がメールで届きました。

アラームのタイムラインでも現在の状態がアラーム状態となっています。

アラームの履歴を見ると詳細な時系列を確認できます。

参考

以上