SSTエンジニアブログ

SSTのエンジニアによるWebセキュリティの技術を中心としたエンジニアブログです。

TerraformでCloudWatch Alarm設定をしたらはまった話

はじめに

こんにちは、研究開発の宇田川です。
ブログ書きたいなぁと思いつつ、最近は「とあるプロジェクト」を取り組んでおり、パツパツ状態で前回のブログから結構経ってしまいました。

せっかくなので今回は、「とあるプロジェクト」中にはまった話をご紹介します。

いつもどおりTerraform設定

AWSサービスを使用する際は、負荷、エラー、ダウン等々に気付くために一緒にCloudWatch Alarmを設定するのは鉄板ですね。
その日はいつものようにCloudFrontとCloudWatch AlarmのTerraformの設定を書いていました。

CloudFrontのRequests数を監視する設定です。
※閾値とかはブログ用の例です。参考にするときは適宜自サイト向けに変更してください。

resource "aws_cloudwatch_metric_alarm" "cloudfront_requests_alarm" {
  alarm_name          = "cloudfront_requests" 
  comparison_operator = "GreaterThanOrEqualToThreshold"
  datapoints_to_alarm = "1"
  evaluation_periods  = "1"
  metric_name         = "Requests"
  namespace           = "AWS/CloudFront"
  period              = "60"
  statistic           = "Sum"
  threshold           = "100"
  treat_missing_data  = "notBreaching"

  dimensions = {
    distributionId = "CloudFrontのID"
    region   = "Global"
  }
}

設定を記述後、「terraform validate 」、「terraform plan」で設定内容の確認。これはOK。
「terraform apply」で AWS上に構築。これもエラー無くOK。
一応、マネージメントコンソール上で、CloudWatch Alarmの設定ができているか確認して、これもOKでした。

問題発生!

検知するかの確認のため、CloudFrontに閾値を超える程度でアクセス。
が、何分待ってもグラフが表示されず...

f:id:woodykedner:20190722181005p:plain

原因発見

調査。
そして、やっと見つけたのがTerraformでCloudWatch Alarmの設定で監視対象のAWSサービスを指定するdimensionsの設定でした。

  dimensions {
    distributionId = "CloudFrontのID"
    region   = "Global"
  }

「distributionId」の頭文字のdを大文字にして「DistributionId」、「region」のrを大文字にして「Region」とするのが正解でした。

  dimensions = {
    DistributionId = "CloudFrontのID"
    Region   = "Global"
  }

なのですが、TerraformもCloudWatchも設定追加時にエラーとはならず、そのまま設定されてしまったため気付けませんでした…

青が失敗で、オレンジが大文字にすべきところを大文字にして設定したもの。
オレンジだけDistributionIdが配信ID 、Regionがリージョンとして認識され、グラフが出力されています。

f:id:woodykedner:20190807103423j:plain

もしかしてdimensionsの設定は何でもありなんじゃないかということで、試しにdimensions を適当に設定してみました。

  dimensions {
    hogehoge = "fugafuga"
    region   = "Global"
  }

「terraform apply」で反映。特にエラーは出ずで…

f:id:woodykedner:20190807102635p:plain

設定できるんかーい!!
もちろん、グラフは出ませんけど~
dimensionsの部分は、監視対象のAWSサービスにより、IDだったり、ARNだったりするので、汎用性を持たせるために厳しく入力チェックをしていないってことなんでしょうか。

最後に

ということで、今回自分がはまったところを紹介させていただきました。
TerrafromでCloudWatch Alarmを設定しようとしている方はdimensionsの設定には気を付けましょう。

ちなみに、マネージメントコンソール上から設定する場合は、dimensions の部分は記述方式ではなく選択方式なので、このような間違いを起こすことは無いと思います。
一旦、マネージメントコンソール上で作成した設定を大文字小文字も含めて確認しながら、Terraformで記述するのが良いですね。

ではでは。