🦈
Terraform管理のすゝめ - Datadog Monitoring
はじめに
弊環境では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