CloudWatchカスタムメトリクスに閾値を設定して、アラーム時にSNSでメール通知する

CloudWatchカスタムメトリクスに閾値を設定して、アラーム時にSNSでメール通知する

CloudWatchカスタムメトリクスに閾値を設定して、アラーム時にSNSでメール通知する

AWS DVAの出題範囲の1つでもある、モニタリング・トラブルシューティングに関する内容です。

以下のページで、Lambda関数とEventBridgeを使用して、CloudWatchカスタムメトリクスを定期的に配信する方法をご紹介しました。

https://awstut.com/2023/04/02/use-eventbridge-and-lambda-to-deliver-cloudwatch-custom-metrics-on-a-regular-basis

今回はカスタムメトリクスに閾値を設定して、条件を満たした際にメール通知する方法を考えます。

メール通知する方法については、AWS公式で以下の通り言及されています。

Amazon CloudWatch は、Amazon SNS を使用して E メールを送信します。最初に、SNS トピックを作成してサブスクライブします。CloudWatch アラームを作成する際、この SNS トピックを追加して、アラームの状態が変わったときにメールの通知が送信されるように設定できます。

Amazon SNS 通知の設定

本ページでは、上記に従って、カスタムメトリクスが条件を満たした際に、メール通知する構成をご紹介します。

構築する環境

Diagram of setting threshold values for CloudWatch Custom Metrics and email notification via SNS.

Lambda関数を作成します。
この関数の働きは、CloudWatchカスタムメトリクスとして、0から9の数字をランダムにプッシュすることです。

EventBridgeルールで、この関数を定期的に実行します。
実行間隔は1分間とします。

CloudWatchアラームを設定し、カスタムメトリクスの値を監視します。
この値が2回連続で7以上の値だった場合、アラームします。
アラームの通知先をSNSトピックとします。

SNSトピックのサブスクライバーとして、メールアドレスを指定します。

CloudFormationテンプレートファイル

上記の構成をCloudFormationで構築します。
以下のURLにCloudFormationテンプレートを配置しています。

https://github.com/awstut-an-r/awstut-dva/tree/main/05/003

テンプレートファイルのポイント解説

本ページでは、CloudWatchアラームを使用して、カスタムメトリクスに閾値を設定し、条件を満たした場合にSNS経由でメール通知することを中心に取り上げます。

Lambda関数とEventBridgeを使用して、カスタムメトリクスを定期的に配信する方法については、以下のページをご確認ください。

https://awstut.com/2023/04/02/use-eventbridge-and-lambda-to-deliver-cloudwatch-custom-metrics-on-a-regular-basis

以下がカスタムメトリクスを配信する上でポイントとなる情報です。

  • 名前空間:test
  • メトリック名:randomnum
  • ディメンション名:lambda
  • ディメンションの値:dva-05-003
  • 配信する値:0から9でランダムの値

CloudWatchアラーム

Resources:
  Alarm:
    Type: AWS::CloudWatch::Alarm
    Properties:
      ActionsEnabled: true
      AlarmActions:
        - !Ref SNSTopicArn
      AlarmDescription: test alarm
      AlarmName: !Ref Prefix
      ComparisonOperator: GreaterThanOrEqualToThreshold
      Dimensions:
        - Name: !Ref CloudWatchMetricDimensionName
          Value: !Ref CloudWatchMetricDimensionValue
      EvaluationPeriods: 2
      InsufficientDataActions:
        - !Ref SNSTopicArn
      MetricName: !Ref CloudWatchMetricName
      Namespace: !Ref CloudWatchMetricNamespace
      OKActions:
        - !Ref SNSTopicArn
      Period: 60
      Statistic: Average
      Threshold: 7.0
      Unit: Count
Code language: YAML (yaml)

アラームの状態に変化があった際に、以下の3つのプロパティにSNSトピックを指定することで、通知を受け取ることができます。

  • AlarmActionsプロパティ:ALARM状態に移行時の通知先。
  • InsufficientDataActionsプロパティ:INSUFFICIENT_DATA状態に移行時の通知先。
  • OKActionsプロパティ:OK状態に移行時の通知先。

4つのプロパティ(ComparisonOperator, EvaluationPeriods, Period, Threshold)で、アラームする条件を設定します。
今回はこれらを組み合わせて、60秒ごとにメトリクスの値を評価し、メトリクスの値が2回連続で7.0以上だった場合に、ALARM状態に移行します。

3つのプロパティ(Dimensions, MetricName, Namespace)で、対象のメトリクスを設定します。
今回は先述のLambda関数で、メトリクス配信時と同一の値を設定します。

SNS

Resources:
  Topic:
    Type: AWS::SNS::Topic
    Properties:
      Subscription:
        - Endpoint: !Ref MailAddress
          Protocol: email
      TopicName: !Ref Prefix
Code language: YAML (yaml)

サブスクライバーとしてメールアドレスを設定します。

環境構築

CloudFormationを使用して、本環境を構築し、実際の挙動を確認します。

CloudFormationスタックを作成し、スタック内のリソースを確認する

CloudFormationスタックを作成します。
スタックの作成および各スタックの確認方法については、以下のページをご確認ください。

https://awstut.com/2021/12/02/cloudformation-nested-stacks

各スタックのリソースを確認した結果、今回作成された主要リソースの情報は以下の通りです。

  • Lambda関数:dva-05-003-function
  • EventBridgeルール:dva-05-003-EventRule
  • CloudWatchアラーム:dva-05-003
  • SNSトピック:dva-05-003

メールアドレスの認証

SNSトピックのサブスクライバーとしてメールアドレスを指定した場合、そのメールアドレスを認証する必要があります。
指定したメールアドレスに、以下のような認証メールが送られてきます。

Detail of SNS 1.

「Confirm subscription」を押下して、認証を進めます。

Detail of SNS 2.

上記のページが表示されて、認証が完了したことがわかります。

リソース確認

AWS Management Consoleから各リソースを確認します。
まずSNSトピックを確認します。

Detail of SNS 3.

SNSトピックのサブスクライバーとして、メールアドレスが指定されています。

Lambda関数を確認します。

Detail of Lambda 1.

正常に関数が作成されています。

EventBridgeルールを確認します。

Detail of EventBridge 1.
Detail of EventBridge 2.

こちらも正常に作成されています。
1分ごとにLambda関数が実行される内容です。

CloudWatchアラームを確認します。

Detail of CloudWatch 1.
Detail of CloudWatch 2.

CloudFormationテンプレートで指定した通りに、アラーム条件が設定されていることがわかります。

Stateを見ると、「Insufficient data」であることがわかります。
この状態になる原因は、以下の通りです。

INSUFFICIENT_DATA 状態は、次のいずれかを示します。

INSUFFICIENT_DATA 状態は、次のいずれかを示します。

・Amazon CloudWatch アラームが始まったばかりです。
・メトリクスを使用できません。
・名前空間、メトリクス名、ディメンションなどのメトリクスパラメータが正しく設定されていません。
・メトリクスがアラームの状態を判断するのに十分なデータがありません。

CloudWatch アラームの状態が INSUFFICIENT_DATA になっているのはなぜですか?

今回ははCloudWatchアラームを作成して間もないことと、メトリクスのデータが十分に配信されていないことが原因です。

Actionsを見ると、通知先として、先述のSNSトピックが指定されていることも確認できます。

動作確認

準備が整いました。

INSUFFICIENT_DATA -> OK

しばらく待ってからCloudWatchメトリクスを確認します。

Detail of CloudWatch 3.

確かにカスタムメトリクスが配信されてます。
EventBridgeによって、Lambda関数が定期的に実行されているということです。

CloudWatchアラームにもメトリクスの配信状況が反映されます。

Detail of CloudWatch 4.

確かに反映されています。

そして先ほどまでの状態はINSUFFICIENT_DATAでしたが、現在はOKになりました。

これによって、以下のメールが届きました。

Detail of SNS 4.

状態がOKに変化した旨が記載されています。

このようにCloudWatchアラームの変更時に、SNS経由でメール通知を受け取ることができます。

OK -> ALARM

ALARM条件を満たすために、しばらく待機します。

Detail of CloudWatch 5.

2回連続で7以上の数字が配信されました。
これでアラームする条件を満たしました。

CloudWatchアラームを確認します。

Detail of CloudWatch 6.

確かにALARM状態に変化しました。

これによって、以下のメールが届きました。

Detail of SNS 5.

状態がALARMに変化した旨が記載されています。

ALARM -> OK

最後にOK状態に戻る際の挙動を確認します。

Detail of CloudWatch 7.

7より小さい値が配信されました。

Detail of CloudWatch 8.

CloudWatchアラームの状態がOKに戻りました。

これによって、以下のメールが届きました。

Detail of SNS 6.

状態がOKに変化した旨が記載されています。

まとめ

CloudWatchアラームを使用して、カスタムメトリクスが条件を満たした際に、SNS経由でメール通知する構成をご紹介しました。