Grafana Alert を Terraform で作成する

Grafana Alert を Terraform で作成する

こんにちは、kyuitaです。

Terraformのアラートルールは普段Yamlファイルで記述しているのですが、最近TerraformのGrafana Providerでアラートを作成することができることを知り実際に試してみたので、その手順を共有します。

grafana自体は既存の環境がある前提でTerraformからGrafanaにアラートルールを作成していきます。

Grafana Service Accountとトークン

Terraform Providerで必要になるトークンを作成する。

Administration > Users and access > Service accounts > Create service accountと移動する。

Grafana Service Accountとトークンの画面(1)

今回は名前をterraform、Roleを Admin にしておいて作成

Grafana Service Accountとトークンの画面(2)

Add service account tokenをクリックする。

Grafana Service Accountとトークンの画面(3)

Grafana Service Accountとトークンの画面(4)

Generate tokenを押して作成されたトークンをメモしておく。

これで一旦Terraform providerに渡すトークンの準備は完了です。

Terraform Providerの設定

Terraform Providerを利用することで、TerraformがGrafanaAPIを叩けるようになります。

Plain text
provider.tf

terraform {
  required_providers {
    grafana = {
      source  = "grafana/grafana"
      version = ">= 4.0.0" 
    }
  }
}

provider "grafana" {
  url   = # grafanaダッシュボードのURL
  auth  = # 先ほどメモしたトークン値
}

アラートルールの作成

alert.tfファイルを作成

とりあえずCPU使用率90%を超えた場合のアラートを作成してみます

Plain text
alert.tf

# アラートをまとめるフォルダ
resource "grafana_folder" "vmetrics_alerts" {
  title = "VictoriaMetrics Alerts"
}

# Grafana上で設定しているデータソース名
data "grafana_data_source" "vm" {
  name = "VictoriaMetrics" 
}

resource "grafana_rule_group" "memory_check" {
  name             = "VictoriaMetrics-Alerts"
  folder_uid       = grafana_folder.vmetrics_alerts.uid
  interval_seconds = 60

  rule {
    name           = "High Memory Usage"
    condition      = "C"
    for            = "5m"

    # --- データ取得 (A) ---
    data {
      ref_id         = "A"
      datasource_uid = data.grafana_data_source.vm.uid

      relative_time_range {
        from = 600
        to   = 0
      }

      model = jsonencode({
        datasourceUid = data.grafana_data_source.vm.uid
        expr          = "100 * (1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)"
        refId         = "A"
      })
    }

    # --- データ加工: 直近値の取得 (B) ---
    data {
      ref_id         = "B"
      datasource_uid = "-100"

      relative_time_range {
        from = 0
        to   = 0
      }

      model = jsonencode({
        expression = "A"
        type       = "reduce"
        reducer    = "last"
      })
    }

    # --- 判定: しきい値チェック (C) ---
    data {
      ref_id         = "C"
      datasource_uid = "-100"

      relative_time_range {
        from = 0
        to   = 0
      }

      model = jsonencode({
        conditions = [{
          evaluator = {
            params = [90]
            type   = "gt"
          }
          operator = { type = "and" }
          query    = { params = ["B"] }
          type     = "query"
        }]
        type = "threshold"
      })
    }
  }
}

terraform plan実行

Plain text
$ terraform plan
data.grafana_data_source.vm: Reading...
data.grafana_data_source.vm: Read complete after 1s [id=1:xxxxxxxxx]

...

Plan: 2 to add, 0 to change, 0 to destroy.

この手順でTerraformを通して既存環境のGrafanaにアラートルールを作成することができました。

最後に

YAMLファイルに記述して変更する場合はGrafanaサーバーの再起動が必要だったのですが、Terraform の Grafana providerの場合はAPIを叩く方式のため変更のたびにGrafanaサーバーを再起動が不要となるのは便利に感じました。

Grafana Alertの管理方法に良いものがないか探していたのでこれから使用していってみてContact policyなどもTerraformで管理できるようなので既存環境からの移行など調べていきたいと思います。