Terraformerを利用して手動で作成したDatadog DashboardのCodeを生成してみた

## はじめに
皆さんこんにちはasmgです。今回は、手動でDatadogのDashboardをCode化する案件を行なったのですが、一から作成するのが大変だったので簡単に生成する方法を模索して検討してみました。
## 本記事の対象者
本記事は、Terraformerを利用してDatadog Dashboardの生成にポイントを定めている為、Terraformのコード等には言及しません。なので、Terraformの構文等は理解していることを前提とします。
## 本記事のゴール
本記事では、手動で作成したDatadog DashboardをTerraformerを利用してCode化するところまでを目的とします。
## 今回使うもの
#### 実行環境
* Mac Book pro 14inch M1 PRO
#### ツール類
* Terraformer version: 0.8.21
  - Supported Providers datadog version: 3.12.0 
* Terraform version: 0.13.0

## Terraformerとは？
Googleが提供している既存のインフラストラクチャからTerraformファイルを生成する
CLIツール（サードパーティツール）になります。

https://github.com/GoogleCloudPlatform/terraformer

Terraformerを利用することによって、手動で作成されたクラウド環境や監視ツールの環境をCode化することが可能になります。

https://github.com/GoogleCloudPlatform/terraformer#table-of-contents

## Terraformerを利用するにあっての注意点
Terrafomerを利用するにあたって、Terraformをインストールしておく必要があります。
また、TerraformerはTerraform version 0.14.xをサポートしていません。Terraformerを利用するためにはTerraform version 0.13.xを利用する必要があります。
> Support terraform 0.13 (for terraform 0.11 use v0.7.9).

https://github.com/GoogleCloudPlatform/terraformer#capabilities
## Terraformerの導入方法
ここでは、terraformは導入されていることを前提として記事を進めていきます。

```
$ curl -LO https://github.com/GoogleCloudPlatform/terraformer/releases/download/$(curl -s https://api.github.com/repos/GoogleCloudPlatform/terraformer/releases/latest | grep tag_name | cut -d '"' -f 4)/terraformer-datadog-darwin-amd64
$ chmod +x terraformer-datadog-darwin-amd64
$ sudo mv terraformer-datadog-darwin-amd64 /usr/local/bin/terraformer
```
今回は、Datadogの使用しか考えていないのでDatadogのみを指定しています。
詳しいインストール方法は以下のリンクを参考にしてください。

https://github.com/GoogleCloudPlatform/terraformer#installation

## 実行方法(terraformファイルの出力)
### 事前準備
まず、`main.tf`作成し、`main.tf`があるフォルダーまで移動しterraform initを行います。

```:フォルダー構成
.
└── main.tf
```
```tf:main.tf
terraform {
  required_version = "= 0.13.0"

  required_providers {
    datadog = {
      source  = "DataDog/datadog"
      version = "3.3.0"
    }
  }
}


provider "datadog" {
  api_key = ""
  app_key = ""
}

```
```:ターミナル
$ terraform init
```
### Datadog DashboardのTerraformファイルを出力
事前準備が完了したのでDatadog DashboardのTerraformファイルを出力していきたいと思います。

```:ターミナル
$ terraformer import datadog --resources=dashboard --api-key=<API_KEY> --app-key=<APP_KEY> --filter=dashboard=<dashboard_id>
```

コマンドを実行するとファイルが生成されます。
```:Terraform生成コマンド実行後のファイル構造
.
├── generated
│   └── datadog
│       └── dashboard
│           ├── dashboard.tf
│           ├── outputs.tf
│           ├── provider.tf
│           └── terraform.tfstate
└── main.tf
```
**point**
* Dashboardをフィルタリングしたい場合には、`--filter=dashboard={dashboard_id}`でフィルタリングすることができます。

* dashboard_idはDatadog DashboardのURLからわかります。
`https://app.datadoghq.com/dashboard/{dashboard_id}/`になります。

## 実際にDashboardが生成できるか確認

Datadog Dashboard Terraformファイルの出力が完了したので、生成したファイルが正しくDatadogのDashboardに出力できるかを確認していきたいと思います。

先ほど生成したフォルダー`generated/datadog/dashboard/dashboard.tf`を以下のようにコピーしてその後Terraformをplan、applyします。

```:ファイル構造
.
├── generated
│   └── datadog
│       └── dashboard
│           ├── dashboard.tf
│           ├── outputs.tf
│           ├── provider.tf
│           └── terraform.tfstate
└── main.tf
├── dashboard.tf
```

```:コマンドの実行
$terraform plan
$terraform apply
```

applyすると最終的に以下のような結果が出力されればDatadog DashboardにDashboardが生成されます。
```:実行結果（一部抜粋）
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
```
## 実行しての問題点
1. 手動で生成したDashboardのWidgetsの順序を保った状態で生成することが出来ない。
2. Widgetsのタイトルが正常に表示されない場合がある。


1の問題は以下のissueに挙げられていたのでissueをもとにTerraformerのversionを0.8.18まで落として試してみました。

https://github.com/GoogleCloudPlatform/terraformer/issues/1328#issuecomment-1132515917

＞結果、１、２の問題共に解決することができました！


## まとめ
もし、Datadog DashboardのWidgetsの順序が保たれない場合にはversionを0.8.18まで落とすことをお勧めします。（2022年6月28日時点）
Terraformerを利用してDatadog DashboardのIaCを実現しました。生成する際に気になるポイントはありましたが、この手順を踏むことでDatadog DashboardをCode化できると思います。