はじめに
これはterraform Advent Calendar 2019の22日目の記事です。
同日空いていたので、この記事とクロスポストしようとしてしまったのですが、Qiita的にダメだったので、記事内で書いたダッシュボード用のTerraformリポジトリを作るにあたって初めてTerraformerを利用してみたところ、ものすごい簡単にDatadogのDashboardがmodule化できた話を書きます。
※横着しようとしたのがダメでした。。。。。。。
Terraformerとは?
AWS/GCP/Datadogなどの環境設定をTerraformのtfコード化してくれるすばらツールです。
自分はこちらで初めて知り、使ってみたいなって思い続けて、Datadogのダッシュボードをコード化するにあたって利用しました。
Datadog DashboardのTerraform module化
流れとしてはものすごいシンプルです。
-
- テンプレート化するための元となるダッシュボードをTerraformerでインポートする
-
- インポートし作成されたtfコード内で、変数化すべきところを変数化し、module化する
-
- それを各サービス用のディレクトリから呼び出して、ダッシュボードを作成する
1の部分は、terrafomerのサンプルのように
./terraformer import datadog --resources= dashboard --filter=datadog_dashboard=[コード化したいダッシュボードのID] --api-key=[API key] --app-key[Applicationn key]
とするだけでものすごい簡単でした。
メルペイさんのこちらの記事では、Dynamic Blockへの書き換えを行ったりしていたのですが、自分の場合はそのようなことはしていません。
理由としては下記の通りです。
- 提供するダッシュボードは、Datadog自体に慣れていないことも考えられる各サービス向けに提供するテンプレートであり、作成後の編集は各サービスにお任せしている
- 元々、Datadog Agent用に共通のタグ設計を行っており、変数化する項目がサービス識別向けのタグ、環境定義のタグの2種類程度だった
そのため、modules内もシンプルになりました。
modules/datadog_dashboard/
├── dashboard_list.tf # ダッシュボードリストを定義するファイル
├── host_deep_dive_dashboard.tf # 障害対応時など各ホストを深掘りしてメトリクスみるためのダッシュボード
├── output.tf # terraform apply後にダッシュボードやダッシュボードリストをアウトプットするためのファイル
├── service_dashboard.tf # 各サービス向けのダッシュボードのテンプレート
└── variables.tf # 変数定義
output.tfですが、terraformはapplyするまで作成されるリソースのIDがわからないため、applyとあわせてURL確認できるようにこのようにしています。
中身もシンプルです。
output "host_deep_dive_dashboard_id" {
value = "${datadog_dashboard.host_deep_dive_dashboard.id}"
}
output "service_dashboard_id" {
value = "${datadog_dashboard.service_dashboard.id}"
}
output "service_id_dash_list_id" {
value = "${datadog_dashboard_list.service_id_dash_list.id}"
}
これをmodules呼び出し側でこのようにさらにoutputしつつ、URLを生成しています。
output "host_deep_dive_dashboard_url" {
value = "https://${var.datadog_url}/dashboard/${module.datadog_dashboard.host_deep_dive_dashboard_id}"
description = "host deep dive dashboardのURL"
}
output "service_dashboard_url" {
value = "https://${var.datadog_url}/dashboard/${module.datadog_dashboard.service_dashboard_id}"
description = "service dashboardのURL"
}
output "service_dashboard_list_url" {
value = "https://${var.datadog_url}/dashboard/lists/manual/${module.datadog_dashboard.service_id_dash_list_id}"
description = "dashboard listのURL"
}
終わりに
ダッシュボード用のterraformでoutput内容を加工し、URL生成を行う、みたいなことを初めて行ったのですが、他でも利用できそうなので、今後はもっとterraform outputも活用していきたいな、と思う所存でした。