🦈

Terraform管理のすゝめ - Datadog Monitoring

2024/12/23に公開

はじめに

弊環境ではDatadog(=DD)のリソースを一部Terraformで管理しています。
本記事では、そこに至った動機、Terraform管理におけるナレッジを述べていきたいと思います。

Monitoring

DDに集められたメトリクスはMonitoringにて閾値などにより検知する仕組みが導入されています
DDではサービスという区切りで依存関係を整理することを推奨しています。
独自にDDへ送信するタイミングで定義したサービス名に加えて、外部リソース(AWS-SQSやMySQLなど)が自動で検知されています。

Monitoringでやりたかったこと

検知されたサービス群のMonitoringをサービスに応じて担当しているチームに応じてSlackに通知をしたい。
例えばSQSやMySQLなどはSREへ、各サービスは主担当のチームへ

DDのサービスの特性

サービスの種類の増加はDDで制御できない

  • ある日突然サービスとして検知されるようになったりする
  • SDKやDDの仕様変更などでも外部リソースのサービス名は変わる
  • 新しいサービスの出現はシステムの開発サイクルに依存する。(新機能の開発でS3を使うようになったり、マイクロサービスが増えたり)。しかし、監視ツールを開発サイクルと紐づけたくはない
    つまり、サービスの増減は管理しきれないし、したくない

不完全なif分岐

Monitoring内でif文をひたすら書いて分岐させる方法をすぐに思いつきますが、現実的ではありません
Monitoringにはif分岐はありますが、else分岐はありません
サービスA,B,Cが検知されている際に、if:A,if:B,if:Cといった具合で記述することを想定しますが、前段で述べたように、ある日サービスDが増える可能性があります。
Dはif分岐に記述されていないため、通知対象から漏れます。困ります

理想では、if分岐の最後にelse:@info-etcといった記述はできないため、対処できません

対応策

DDだけでは網羅性を担保できないので、Terraformの変数で上記のif-else分岐を達成します。

Before: 1つのmonitoring内でテンプレート変数を利用し通知先を分岐
After: N個のmonitoringでテンプレート変数は利用せず、任意の通知先へ分岐

おまけ

  • 一部のMonitoringのみTerraform管理、という形態にする場合、必ずTerraform管理されているとわかるようなタグを付与しよう
  • MonitoringのExportからTerraform形式の出力を得れるので、手元で作って→Terraform化がおすすめ

Discussion