ベーシックなCloudWatchアラームをCloudFormationで作成する

2024.01.29

CloudWatchアラームは特定のメトリクスを評価し、 評価に応じたアクションを起こすためのリソースです。 異常な振る舞いや閾値超過に気付けるような仕組みを作る際に役立つます。

今回はベーシックな設定のCloudWatchアラームを CloudFormationテンプレート化してみます。 具体的には単一のメトリクスを基本的な統計で評価するような アラームを作成します。

はじめにまとめ

  • 公式ドキュメントはこちら
  • CloudWatchアラームの設計要素
    • どのメトリクスを
    • どの統計で
    • どう評価して
    • どうアクションを起こすか
  • CloudWatchアラームのパラメータ
    • 基本設定: AlarmName, AlarmDescription
    • メトリクス: Namespace, Dimensions, MetricName, Unit
    • 統計: Period, Statistic
    • 評価: Threshold, ComparisonOperator, EvaluationPeriods, DatapointsToAlarm, TreatMissingData
    • アクション: ActionsEnabled, AlarmActions, OKActions, InsufficientDataActions
  • CloudWatchアラームのテンプレートサンプル
    • EC2インスタンスのCPU使用率アラーム

CloudWatchアラームの設計要素

CloudWatchアラームの設計要素は大きく分けて 以下の4つあります。

  • [メトリクス] どのメトリクスを
  • [統計] どの統計で
  • [評価] どう評価して
  • [アクション] どうアクションを起こすか
設計要素
メトリクス EC2インスタンスのCPU使用率
統計 5分間の平均
評価 90%以上で「超過」
3回の評価のうち、2回「超過」していたらアラーム状態
アクション アラーム状態に遷移したときにSNSトピックへ通知

それぞれの要素を CloudWatchアラームのパラメータとともに 説明していきます。

CloudWatchアラームのパラメータ

📌 基本設定

  • AlarmName : アラーム名(String)
  • AlarmDescription : アラームの説明(String)

アラームの名前や説明を記載します。 アラーム名を指定しない場合は、 CloudFormation が一意の名前を生成します。

📌 メトリクス

  • Namespace : メトリクスの名前空間(String)
  • Dimensions : メトリクスのディメンション(Array of Dimension)
  • MetricName : メトリクスの名前 (String)
  • Unit : メトリクスの単位 (String)

どのメトリクスを監視するか を指定します。

Namespace, Dimensions, MetricName

メトリクスは名前空間(Namespace)とディメンション(Dimensions, 任意)、 名前(MetricName)で一意に決まります。 調べ方については以下ブログを参照ください。

Unit

必ずしも指定する必要はありませんが単位(Unit)を指定できます。 たとえば SecondsGigabytesMegaBits/Second 、などです。 「この単位でしきい値設定をすること」 を明示的に記したい場合は役立ちます。

Unit で使える値は限られています。 使いたい場合は以下を参照ください。

📌 統計

  • Period : 「統計を適用する期間」の秒数 (Integer)
  • Statistic : 適用する統計 (String)

メトリクスを どのような統計として 解釈するかを指定します。

Period

Period (期間) には秒数を書きます。 取りうる値は 10秒、30秒、および 60×N秒です。 例えば「とあるメトリクスの 5分間(=300秒)の平均」を評価したい場合は、 Period には 300 を指定します。

Statistic

Statistic には使用する統計を書きます。 例えば「とあるメトリクスの 5分間(=300秒)の平均」を取りたい場合は、 Statistic には Average を指定します。

取りうる Statistic は以下のとおりです。

  • SampleCount : 期間中のデータポイント数
  • Sum : 期間中のデータポイントの値の合計
  • Average : 平均 (= Sum/SampleCount)
  • Minimum : 期間中の最小値
  • Maximum : 期間中の最大値

📌 評価

  • Threshold : しきい値 (Number)
  • ComparisonOperator : 比較に用いる算術演算 (String)
  • EvaluationPeriods : 評価する期間の数 (Integer)
  • DatapointsToAlarm : アラート状態になるために必要な「しきい値超過」の数(Integer)
  • TreatMissingData : 欠損データポイントをどう処理するか (String)

得られた統計を どう評価するか を指定します。

Threshold, ComparisonOperator

Threshold と ComparisonOperator を使って、 個々の統計に対する評価方法を定めます。 例えば「5分間のCPU使用率 平均」が 90% より大きい ときに「しきい値超過」としたい場合は 以下のような値となります。

  • Threshold : 90
  • ComparisonOperator : GreaterThanThreshold

EvaluationPeriods, DatapointsToAlarm

EvaluationPeriods と DatapointsToAlarm を使って、 N 回の評価のうち、「しきい値超過」が M 回存在したらアラートにする 設定を行います。 ここでいう N が EvaluationPeriods であり、 M が DatapointsToAlarm です。

TreatMissingData

TreatMissingData は欠落データポイントの解釈を定義します。 以下値を取ります。省略した場合は missing です。

  • breaching : 不良 (=しきい値超過)
  • notBreaching : 良好 (=しきい値内)
  • ignore : 現在のアラーム状態を維持
  • missing : 評価範囲内の全てで欠落している場合 INSUFFICIENT_DATA へ移行する

📌 アクション

  • ActionsEnabled : アクションを有効化するか (Boolean)
  • AlarmActions : ALARM 状態に遷移したときに実行するアクション (Array of String)
  • OKActions : OK 状態に遷移したときに実行するアクション (Array of String)
  • InsufficientDataActions : INSUFFICIENT_DATA 状態に遷移したときに実行するアクション (Array of String)

評価に基づいて どうアクションを起こすか を指定します。

ActionsEnabled のデフォルトは True (=有効)です。

AlarmActions, OKActions, InsufficientDataActions

AlarmActions, OKActions, InsufficientDataActions では それぞれの遷移時に実行する「アクション」をリストで記載します。 「アクション」はARNとして指定します。 利用可能なアクションARNは以下ドキュメントに記載があります。

いくつか例を示します。 例えば EC2アクションとして arn:aws:automate:${region}:ec2:stop (インスタンスの停止) や arn:aws:automate:${region}:ec2:reboot (インスタンスの再起動)など使えます。 また、SNS通知アクションとして arn:aws:sns:${region}:${account-id}:${sns-topic-name} (SNSトピックへ通知) が使えます。

CloudWatchアラームのテンプレートサンプル

EC2インスタンスのCPU使用率アラーム

サンプルとして EC2インスタンスのCPU使用率高騰を 通知するような CloudWatchアラームを作成します。

以下テンプレートです。

AWSTemplateFormatVersion: 2010-09-09
Description: "Watch EC2 instance CPUUtilization"
Parameters:
  NamePrefix:
    Type: String
  InstanceId:
    Type: String
  InstanceName:
    Type: String
  AlarmTopicARN:
    Type: String
  Threshold:
    Type: Number
  # OKTopicARN:
  #   Type: String
  # InsufficientDataTopicARN:
  #   Type: String

Resources:
  EC2CPUUtilizationAlarm:
    Type: AWS::CloudWatch::Alarm
    Properties:
      ### 基本設定
      AlarmName: !Sub "${NamePrefix}-${InstanceName}-cpu-utilization-alarm"
      AlarmDescription: !Sub "${InstanceName} (${InstanceId}) のCPU使用率が ${Threshold} %以上になりました"

      ### メトリクス
      Namespace: "AWS/EC2"
      Dimensions:
        - Name: "InstanceId"
          Value: !Ref InstanceId
      MetricName: "CPUUtilization"
      Unit: "Percent"

      ### 統計
      Period: 300
      Statistic: "Average"

      ### 評価
      Threshold: !Ref Threshold
      ComparisonOperator: "GreaterThanOrEqualToThreshold"
      EvaluationPeriods: 3
      DatapointsToAlarm: 2
      TreatMissingData: "missing"

      ### アクション
      ActionsEnabled: True
      AlarmActions:
        - !Ref AlarmTopicARN
      # OKActions:
      #   - !Ref OKTopicARN
      # InsufficientDataActions:
      #   - !Ref InsufficientDataTopicARN

次に示す項目をパラメータにしました。

  • NamePrefix : アラーム名のプレフィクス
  • InstanceId : 監視対象のインスタンスID
  • InstanceName : 監視対象のインスタンス名
  • Threshold : アラーム状態とするしきい値
  • AlarmTopicARN : アラーム状態に遷移したときに通知するSNSトピックARN

※OKActions および InsufficientDataActions 設定は コメントアウトしています。 利用する場合はコメントアウトを外して、パラメータをセットしてください。

img

[▲画像] テンプレート展開後のイメージ

補足: 使っていないパラメータについて

今回はシンプルなCWアラームを作成したので、 使っていないパラメータがいくつかあります。 以下にそれらパラメータを紹介します。 より高度な統計・評価を活用したい場合はこれらを活用ください。

  • ExtendedStatistic : パーセンタイル統計値 (p0.0 〜 p100)。
  • EvaluateLowSampleCountPercentile : パーセンタイル統計値の評価において、 「データポイントが少なく統計的に有意でない」ときの挙動を指定。 ignore の場合 アラーム状態は変化しない。 evaluate の場合は有意でないとしても常に評価する。
  • Metrics : Metric Math (単一もしくは複数のメトリクスから、数式を使って新しい時系列を作成できる機能) で指定する数式。
  • ThresholdMetricId : 異常検知モデルに基づくアラームで使うしきい値。 ( ANOMALY_DETECTION_BAND 関数の ID)

おわりに

以上、シンプルなCloudWatchアラームを作成しました。 公式リファレンスのページはパッと見ると設定項目が多く、最初戸惑ってしまったので、 自分の中で整理したかったモチベーションが大きかったです。

本ブログがどなたかの参考になれば幸いです。

参考