ばーろぐわにる

SIerからWEB系?インフラエンジニアにジョブチェンジした見習いの備忘録。投稿内容は私個人の意見であり、所属企業・部門見解を代表するものではありません。

DatadogのダッシュボードをTerraformでちょっとだけ簡単に作る方法

目的

Datadogのダッシュボードをシステム毎にいっぱい作らなければいけないけど、いちいちポチポチやるのはとてもめんどくさい。かと言ってゼロからTerraformで作るのは大変そうという人向けのちょっとだけ簡単になる作り方です。

作り方

API Key, Application Keyの取得

Terraformからダッシュボードを作成するのに必要なのでコンソールから作成しておきます。

f:id:oneal-desu:20200812225402p:plain

テンプレートとなるダッシュボード作成

サービス毎に横展開できるようなテンプレートとなるダッシュボードをコンソールから作成します。完成したらURLに含まれるダッシュボードIDを控えておきます。

f:id:oneal-desu:20200812230551p:plain

Terraformの設定、初期化

terraform-provider-datadogの設定、テンプレートを読み込むリソースを定義しておきます

terraform {
  required_version = "~>0.12.24"
}

provider "datadog" {
  version = "v2.7.0"
  api_key = "[YOU_API_KEY]"
  app_key = "[YOUR_APPLICATION_KEY]"
}

resource "datadog_dashboard" "template" {}

あとはterraform initしておきます

terraform init

テンプレートを取り込み、hcl形式で表示

terraform importで作成したテンプレートをtfstateに取り込みます

 > terraform import datadog_dashboard.template 5kx-kxj-r4q
datadog_dashboard.template: Importing from ID "5kx-kxj-r4q"...
datadog_dashboard.template: Import prepared!
  Prepared datadog_dashboard for import
datadog_dashboard.template: Refreshing state... [id=5kx-kxj-r4q]

Import successful!

The resources that were imported are shown above. These resources are now in
your Terraform state and will henceforth be managed by Terraform.

terraform showでhcl形式で取り込んだテンプレートを表示できます。

> terraform show
# datadog_dashboard.template:
resource "datadog_dashboard" "template" {
    id           = "5kx-kxj-r4q"
    is_read_only = false
    layout_type  = "ordered"
    notify_list  = []
    title        = "template"

    widget {
        layout = {}

        query_value_definition {
            autoscale = true
            precision = 2
            time      = {}
            title     = "Running task count"

            request {
                aggregator = "last"
                q          = "avg:aws.ecs.service.running{*}"
            }
        }
    }
    widget {
        layout = {}

        timeseries_definition {
            show_legend = false
            time        = {}
            title       = "CPU Usage (%)"

            request {
                display_type = "line"
                q            = "avg:system.cpu.user{*}"

                style {
                    line_type  = "solid"
                    line_width = "normal"
                    palette    = "dog_classic"
                }
            }

            yaxis {
                include_zero = true
                max          = "auto"
                min          = "auto"
                scale        = "linear"
            }
        }
    }
    widget {
        layout = {}

        note_definition {
            background_color = "white"
            content          = <<~EOT
                # Title
                ## memo
                This is test note.
            EOT
            font_size        = "14"
            show_tick        = false
            text_align       = "left"
            tick_edge        = "left"
            tick_pos         = "50%"
        }
    }
}

あとはこれをコピペしてダッシュボードを作成してあげればOKです。出力をファイルに出したいときは -no-color オプションを付与してあげます。僕の記憶では少し前までterraform showはtfstateの中身をそのまま表示するだけだったと思うのでとても便利になりました。

以上です。