uokadaの見逃し三振は嫌いです

ここで述べられていることは私の個人的な意見に基づくものであり、私が所属する組織には一切の関係はありません。

terraformerを利用してDatadog monitorなどをterraformで管理するようにした

最近、会社の方針でDatadog monitor と SLOのcodificationをしていました。

運用中のシステムであれば既にモニターもSLOもいくつか存在すると思いますが、既存のDatadogリソースを新規でコード化しterraformで作成した新しいモニターで置き換えるのは色々と不都合が生じます。

例えば、既存のモニターに紐付いたリソース、ダウンタイムの設定やドキュメント内のリンクなどがモニターの置き換えによって破壊されます。 リンクがどのモニターと紐付いていたのかはterraform apply時のログなどから調査しないと復旧が困難でしょうし壊れている箇所をすべてリストアップするのは現実的ではありません。

なので、既存のdatadogリソースをterraform importしてかつそれらをコード化する作業が必要になってきます。

数十個のモニターを手作業でインポート&コード化していくのは現実的ではないので何かしらのツールが必要になってくるのですが、自分のケースではterraformerというGoogleCloudPlatformが提供しているツールを利用してcodificationを達成しました。

github.com

なぜ、terraformerかというとDatadogの公式ドキュメントでもこのツールを使ったリソースのimport方法が紹介されており特に不具合がないので紹介されているのだろうという安心感もあります。

docs.datadoghq.com

terraformer はGo製のツールでインストールもhomebrewがサポートしているので特にハマるところはないでしょう。

$ brew info terraformer
terraformer: stable 0.8.15 (bottled), HEAD
CLI tool to generate terraform files from existing infrastructure
https://github.com/GoogleCloudPlatform/terraformer
Not installed
From: https://github.com/Homebrew/homebrew-core/blob/HEAD/Formula/terraformer.rb
License: Apache-2.0
==> Dependencies
Build: go ✘
==> Options
--HEAD
        Install HEAD version
==> Analytics
install: 1,537 (30 days), 4,094 (90 days), 12,486 (365 days)
install-on-request: 1,537 (30 days), 4,093 (90 days), 12,481 (365 days)
build-error: 0 (30 days)

$ brew install terraformer

terraformer自体は直接terraformリソースを変更することはなくDatadog関連のリソースにアクセスしてそれをコードに落とし込んでくれます。 なので、Datadogのアプリケーションキーとシークレットキーさえあれば試すことは簡単です。

上述のDatadogのドキュメントだとそれらのキーを引数に取る方法でコマンドを実行していますが、コードを読むと環境変数で取れるようになっているので環境変数を使ってキーをセットするのがオススメです。

$ export DATADOG_API_KEY= YOUR_DATADOG_API_KEY
$ export DATADOG_APP_KEY= YOUR_DATADOG_APP_KEY

https://github.com/GoogleCloudPlatform/terraformer/blob/e00592e28377f32c38b5816dcb13487548ede24a/cmd/provider_cmd_datadog.go#L39-L40

こんな風に複数のタイプのリソースをまとめてコード化出来ます。":" コロン区切りで同タイプの複数のリソースをまとめてコードに落とし込むことも出来ます。

$ terraformer import datadog --resources=monitor,dashboard --filter=monitor=1234,dashboard=abc-def-ghi

# 同タイプのリソースをまとめてコード化する例
$ terraformer import datadog --resources=monitor--filter=monitor=1234:5678:9012

生成されるterraformリソースはDatadogのmessage変数が1行で定義されているので余裕があればヒアドキュメントスタイルに修正しておくのがオススメです。 自分の場合は3桁近いモニターを一度にterraform管理に移行したので面倒くささありそのままにしてしまいました。

Datadogのドキュメントが良く出来ているのでハマることはないと思いますが、コード化した後の微調整が面倒くさくなるのでコード化も良し悪しだなという感じですね。 ブラウザ上で修正することが出来るのでモニターを編集してしまいそれをコードに落とし込まず気づいた人が直すという運用になりがち。