Slide 1

Slide 1 text

DatadogをTerraform で触ってみた Datadogはじめました! 鈴木進吾

Slide 2

Slide 2 text

自己紹介 鈴木 進吾 @mominosin もみん,もみあげマン,etc… UniFa Inc. インフラエンジニア

Slide 3

Slide 3 text

保育園向けサービスやってます https://lookmee.jp

Slide 4

Slide 4 text

Datadogは 昨年末くらいから利用開始した 初心者です (※主にAWS)

Slide 5

Slide 5 text

どうやって設定されてます? ブラウザでポチポチ? DatadogのAPI叩いてる? dogshell ?

Slide 6

Slide 6 text

私が選んだのは Provider: Datadog - Terraform by HashiCorp https://www.terraform.io/docs/providers/datadog/index.html

Slide 7

Slide 7 text

できること アラートやダッシュボードは作れる 今の所インテグレーションはGCPのみ Provider: Datadog - Terraform by HashiCorp https://www.terraform.io/docs/providers/datadog/index.html

Slide 8

Slide 8 text

このあたりはポチポチ APIキー インテグレーション

Slide 9

Slide 9 text

DatadogをTerraform で触ってみる

Slide 10

Slide 10 text

Terraformの初期設定 API keyとApplication Keyを準備 variable "datadog_api_key" { default = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" } variable "datadog_app_key" { default = "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy" } provider "datadog" { api_key = "${var.datadog_api_key}" app_key = "${var.datadog_app_key}" }

Slide 11

Slide 11 text

Monitor設定作ってみる Datadog: datadog_monitor - Terraform by HashiCorp https://www.terraform.io/docs/providers/datadog/r/monitor.html

Slide 12

Slide 12 text

なんか書くこと多い…!!

Slide 13

Slide 13 text

すでにあるやつ取り込んでみよう サンプルをコピペした設定ファイルを準備(fooのところは書き換えたほうが良い) terraform import でmonitor idを指定し取り込む ❯ terraform import datadog_monitor.foo 7508938 datadog_monitor.foo: Importing from ID "7508938"... datadog_monitor.foo: Import complete! Imported datadog_monitor (ID: 7508938) datadog_monitor.foo: Refreshing state... (ID: 7508938) 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. ❯ head -n 5 datadog_monitor.tf resource "datadog_monitor" "foo" { name = "Name for monitor foo" type = "metric alert" message = "Monitor triggered. Notify: @hipchat-channel" escalation_message = "Escalation message @pagerduty"

Slide 14

Slide 14 text

差分を確認 terraorm planで取り込んだ値と設定ファイルの値の差分を比較 ❯ terraform plan |landscape ~ datadog_monitor.foo 取り込んだ値 設定ファイルの値 escalation_message: "" => "Escalation message @pagerduty" message: -{{#is_alert}} -Storage Space: {{value}} % -@slack-alert -{{/is_alert}} +Monitor triggered. Notify: @hipchat-channel name: "RDS Free Storage Space is very low {{dbinstanceidentifier.name}}" => query: "avg(last_5m):100 - avg:aws.rds.filesystem.usedPercent{env:prd} by { silenced.%: "0" => "1" silenced.*: "" => "0" tags.#: "0" => "2" tags.0: "" => "foo:bar" tags.1: "" => "baz" thresholds.%: "4" => "5" thresholds.critical: "10.0" => "4" thresholds.critical_recovery: "20.0" => "3" thresholds.ok: "" => "0"

Slide 15

Slide 15 text

取り込んだ値を設定ファイルに反映 反映できると差分が無くなる ❯ terraform plan |landscape No changes

Slide 16

Slide 16 text

TerraformでMonitor設定を作ろう 反映した設定の複製 変数等や疑似ループも利用可能 - 環境別、リソース別でまとめて記述できる 定期的に差分チェック - 一時的な対応でミュートやしきい値変更した際の戻し忘れ防止

Slide 17

Slide 17 text

ただ…ダッシュボードは…

Slide 18

Slide 18 text

Terraform v0.11以下はべた書き 「resources」の括りのみのループ datadogのproviderでは大きい括り - Timeboard - Screenboard 各グラフべた書きするしかない!! resource "datadog_timeboard" "fizz_buzz" { title = "fizz_buzz" description = "created using the Datadog provider in Terraform" read_only = true graph { title = "Photo ALB Response Time" viz = "timeseries" precision = 0 request { q = "avg:aws.applicationelb.target_response_time.average{$Target_Group}" type = "line" style { palette = "orange" type = "solid" width = "normal" } } request { q = "week_before(avg:aws.applicationelb.target_response_time.average{$Target_Group})" type = "line" style { palette = "orange" type = "dotted" width = "normal" } } request { q = "avg:aws.applicationelb.target_response_time.average{targetgroup/fizzbuz/xxxxxxxxxxxxxxx}" type = "line" style { palette = "cool" type = "solid" width = "normal" } } request { q = "week_before(avg:aws.applicationelb.target_response_time.average{targetgroup:targetgroup/production-misokatsu/24d81e 06963f1ee3})" type = "line" style { palette = "cool" type = "dotted" width = "normal" } } 切れてますが5倍以上長い→

Slide 19

Slide 19 text

ダッシュボードは 複製するにしても つらい!!

Slide 20

Slide 20 text

Terraform v0.12待ち まだPreview版 - 去年の夏には…との噂だった for_each使える テンプレート機能とかもつく variable "graph_list" { default = { ALB_Response_time_01 = "avg:aws.applicationelb.target_response_time.average{*}" ALB_Response_time_02 = "avg:aws.applicationelb.target_response_time.average{*}" ALB_Response_time_03 = "avg:aws.applicationelb.target_response_time.average{*}" ALB_Response_time_04 = "avg:aws.applicationelb.target_response_time.average{*}" } } resource "datadog_timeboard" "sample_12" { title = "tf12_test_v12" description = "created using the Datadog provider in Terraform" dynamic "graph" { for_each = var.graph_list content { title = graph.key viz = "timeseries" precision = 0 request { q = graph.value type = "line" style = { palette = "orange" type = "solid" width = "normal" } } } }

Slide 21

Slide 21 text

おわり Datadogもコード化して楽に管理 - 急な環境追加 - ブラウザでの誤操作対策 - ミュート等の戻し忘れ ダッシュボードはTerraform v0.12待かな… - terraformもdatadog-providerもビルドすれば利用可能