CloudFormationで、Metric Mathを使用してダウンタイムを設定したCloudWatchアラームを作成する

2022.03.15

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

データアナリティクス事業本部の鈴木です。

今回は、CloudFormationで作成したCloudWatchアラームのダウンタイム(特定期間の発報抑止)をMetric Mathを使用して設定してみたので、まとめてみました。

手動での設定は分かりやすい記事が多くありますが、CloudFormationから作成する方法の文献が意外と少なく、公式ドキュメントを見つつ試行錯誤したので、設定例やポイントと思ったところを記載しました。

なお、Metric Mathを使ってCloudWatchアラームのダウンタイムを設定しようというアイデアは、こちらの記事を参考にしています。

CloudWatch アラームのダウンタイム(特定期間の発報抑止)を Metric Math を使用して実現してみた | DevelopersIO

作成したCloudFormationテンプレート

検証用の構成

CloudFormationを使って、以下のような構成を作成します。イメージとしては、デッドレターキューをCloudWatchアラームで監視していて、ある特定の時間は理由があってアラートが起きないようにしたい、というような想定です。

検証用の構成

テンプレート

以下のテンプレートを使って、実験用のリソースを作成しました。

sample_template.yml

AWSTemplateFormatVersion: 2010-09-09
Description: SQS Standard Queue with alerm

Parameters:
  QueueName:
    Description: Name for queue
    Type: String
  SNSTopicName:
    Description: SNSTopicName for Alarm
    Type: String 

Resources:
  # メトリック作成用のリソース
  ## SQSキュー
  SQSQueue:
    Type: AWS::SQS::Queue
    Properties:
      MessageRetentionPeriod: 1209600
      QueueName: !Sub ${QueueName}
      VisibilityTimeout: 120

  # Metric Math実験用のリソース
  ## CloudWatch アラーム
  SQSAlarm:
    Type: AWS::CloudWatch::Alarm
    Properties:
      AlarmName: !Sub ${QueueName}-alerm
      ComparisonOperator: GreaterThanOrEqualToThreshold
      DatapointsToAlarm: 1
      EvaluationPeriods: 1
      Threshold: 1
      Metrics:
        - Expression: IF((HOUR(m1)==4),0,m1)
          Id: result
          Label: fixed_approximate_number_of_messages_visible
          ReturnData: true
        - Id: m1
          Label: approximate_number_of_messages_visible
          MetricStat:
            Metric:
              MetricName: ApproximateNumberOfMessagesVisible
              Dimensions:
                - Name: QueueName
                  Value: !Sub ${QueueName}
              Namespace: AWS/SQS
            Period: 60
            Stat: Average
          ReturnData: false
      TreatMissingData: notBreaching

ポイントと思った点はハイライトした箇所になります。

JSTの13時の間は0になるfixed_approximate_number_of_messages_visibleというラベルのメトリックをCloudWatchの機能で計算し、アラームで監視しています。

詳しくは次のセクションで説明します。

ポイント

AWS::CloudWatch::Alarmのドキュメントに沿って進めていきます。より詳しくは、ドキュメントも併せてご確認ください。

Metric Mathの内容はMetricsキーを使って表現します。Metricsキーには数式の表現や、数式で計算するメトリックの取得方法を持たせます。Metricsキーと同時に使えないキーがあることにご注意ください。

MetricsキーにはMetricDataQueryのリストを与えます。 MetricDataQueryを記載する際には、以下がポイントと思いました。

  • ExpressionMetricStat:指定することで、数式なのか単に数式で使うメトリクスを取得しているだけなのか区別します。
  • IdLabelIdは数式を使う際には、数式内でメトリックを表す変数の命名となるようです。命名には小文字から始まるなど、ルールがあるので注意が必要です。Labelは人間が分かるように付けられる名前です。
  • ReturnDataExpressionの場合はTrueMetricStatの場合はFalseを指定します。

テンプレートでは、以下の箇所になります。

sample_template.ymlの抜粋1

# sample_template.ymlの抜粋
      Metrics:
        - Expression: IF((HOUR(m1)==4),0,m1)
          Id: result
          Label: fixed_approximate_number_of_messages_visible
          ReturnData: true
        - Id: m1
          Label: approximate_number_of_messages_visible
          MetricStat:
            Metric:
              MetricName: ApproximateNumberOfMessagesVisible
              Dimensions:
                - Name: QueueName
                  Value: !Sub ${QueueName}
              Namespace: AWS/SQS
            Period: 60
            Stat: Average
          ReturnData: false

また、MetricStatは、さらにどのメトリックを取得するであったり、取得の方法を記載することができます。

  • Metric:取得するメトリックを指定できます。
  • Period:数式に渡すデータの頻度を設定できます。MetricDataQueryにも同じ項目がありますが、今回はMetricStat側のみ設定しました。
  • Stat:数式に渡すメトリックの統計量です。CloudWatch statistics definitionsに記載のある項目を指定できました。

テンプレートでは、以下の箇所になります。

sample_template.ymlの抜粋2

# sample_template.ymlの抜粋
          MetricStat:
            Metric:
              MetricName: ApproximateNumberOfMessagesVisible
              Dimensions:
                - Name: QueueName
                  Value: !Sub ${QueueName}
              Namespace: AWS/SQS
            Period: 60
            Stat: Average

やってみた

テンプレートをデプロイして、メトリックの様子を観察しました。

キューにはあらかじめ適当なメッセージを1件入れておき、アラームをアラーム状態にしておきます。

数式をIF((HOUR(m1)==4),0,m1)としているため、4時(JSTだと13時)には値が0になります。これにより、閾値との兼ね合いで、アラーム状態がOK状態に一時的に遷移するはずです。

アラームの状態は以下のようになり、期待通りに動作していることが確認できました。

アラームの遷移例

最後に

今回は、CloudFormationから、Metric Mathを使用してダウンタイムを設定したCloudWatchアラームの作成方法をご紹介しました。

Metric Mathを使用すると、ダウンタイム設定意外にもいろいろなことが実現できると思いますが、そのような際にも作成方法が参考になれば幸いです。

参考