Terraform を使用したアラートリソースの作成と管理 - Amazon Managed Grafana

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

Terraform を使用したアラートリソースの作成と管理

このドキュメントトピックは、Grafana バージョン 10.x をサポートする Grafana ワークスペース向けに設計されています。

Grafana バージョン 9.x をサポートする Grafana ワークスペースについては、「」を参照してくださいGrafana バージョン 9 での作業

Grafana バージョン 8.x をサポートする Grafana ワークスペースについては、「」を参照してくださいGrafana バージョン 8 での作業

Terraform の Grafana プロバイダーを使用してアラートリソースを管理し、Grafana システムにプロビジョニングします。Terraform プロバイダーによる Grafana アラートのサポートにより、Grafana アラートスタック全体をコードとして簡単に作成、管理、保守できます。

Terraform を使用してアラートリソースを管理する方法の詳細については、Terraform ドキュメントの Grafana プロバイダーのドキュメントを参照してください。

Terraform を使用してアラートリソースを作成および管理するには、次のタスクを実行します。

  1. プロビジョニング用の API キーを作成します。

  2. Terraform プロバイダーを設定します。

  3. Terraform でアラートリソースを定義します。

  4. を実行してterraform apply、アラートリソースをプロビジョニングします。

前提条件

  • grafana/grafana Terraform プロバイダー 1.27.0 以降を使用していることを確認します。

  • Grafana 9.1 以降を使用していることを確認します。Grafana バージョン 9 で Amazon Managed Grafana インスタンスを作成した場合、これは当てはまります。

プロビジョニング用の API キーを作成する

通常の Grafana API キーを作成して、Grafana で Terraform を認証できます。API キーを使用する既存のツールのほとんどは、新しい Grafana アラートサポートで自動的に機能する必要があります。Terraform で使用するキーの作成の詳細については、「Amazon Managed Grafana オートメーションに Terraform を使用する」を参照してください。

プロビジョニング用の API キーを作成するには
  1. CI パイプラインの新しいサービスアカウントを作成します。

  2. ロール「アラートルールのプロビジョニング API へのアクセス」を割り当てます。

  3. 新しいサービスアカウントトークンを作成します。

  4. Terraform で使用するトークンに名前を付けて保存します。

または、基本認証を使用することもできます。サポートされているすべての認証形式を確認するには、Terraform ドキュメントの「Grafana 認証」を参照してください。

Terraform プロバイダーを設定する

Grafana アラートのサポートは、Grafana Terraform プロバイダー の一部として含まれています。

以下は、Terraform プロバイダーの設定に使用できる例です。

terraform { required_providers { grafana = { source = "grafana/grafana" version = ">= 1.28.2" } } } provider "grafana" { url = <YOUR_GRAFANA_URL> auth = <YOUR_GRAFANA_API_KEY> }

連絡先とテンプレートのプロビジョニング

コンタクトポイントは、アラートスタックを外部に接続します。外部システムに接続する方法と通知を配信する場所を Grafana に伝えます。15 種類以上の統合から選択できます。この例では、Slack コンタクトポイントを使用します。

コンタクトポイントとテンプレートをプロビジョニングするには
  1. このコードブロックをローカルマシンの .tf ファイルにコピーします。<slack-webhook-url> を Slack ウェブフック URL (またはその他の連絡先の詳細) に置き換えます。

    この例では、アラート通知を Slack に送信する連絡先を作成します。

    resource "grafana_contact_point" "my_slack_contact_point" { name = "Send to My Slack Channel" slack { url = <slack-webhook-url> text = <<EOT {{ len .Alerts.Firing }} alerts are firing! Alert summaries: {{ range .Alerts.Firing }} {{ template "Alert Instance Template" . }} {{ end }} EOT } }
  2. 通知のテキストをテキストフィールドに入力します。

    text フィールドは、Go スタイルのテンプレート をサポートします。これにより、Grafana アラート通知テンプレートを Terraform で直接管理できます。

  3. terraform apply コマンドを実行します。

  4. Grafana UI に移動し、連絡先の詳細を確認します。

    UI から Terraform を介してプロビジョニングされたリソースを編集することはできません。これにより、アラートスタックは常にコードと同期したままになります。

  5. テスト をクリックして、コンタクトポイントが正しく動作することを確認します。

注記

同じテンプレートを多くのコンタクトポイントで再利用できます。上記の例では、 ステートメントを使用して共有テンプレートが埋め込まれています。 {{ template "Alert Instance Template" . }}

このフラグメントは、Terraform で個別に管理できます。

resource "grafana_message_template" "my_alert_template" { name = "Alert Instance Template" template = <<EOT {{ define "Alert Instance Template" }} Firing: {{ .Labels.alertname }} Silence: {{ .SilenceURL }} {{ end }} EOT }

プロビジョニング通知ポリシーとルーティング

通知ポリシーは、アラートインスタンスをルーティングする方法をGrafanaに指示します。ラベルとマッチャーのシステムを使用して、以前に定義したコンタクトポイントに発声アラートを接続します。

通知ポリシーとルーティングをプロビジョニングするには
  1. このコードブロックをローカルマシンの .tf ファイルにコピーします。

    この例では、アラートは でグループ化されています。つまりalertname、同じ名前のアラートから送信される通知はすべて、同じ Slack メッセージにグループ化されます。

    特定の通知を異なる方法でルーティングする場合は、サブポリシーを追加できます。サブポリシーを使用すると、ラベルマッチングに基づいてさまざまなアラートにルーティングを適用できます。この例では、ラベル a=b のすべてのアラートにミュートタイミングを適用します。

    resource "grafana_notification_policy" "my_policy" { group_by = ["alertname"] contact_point = grafana_contact_point.my_slack_contact_point.name group_wait = "45s" group_interval = "6m" repeat_interval = "3h" policy { matcher { label = "a" match = "=" value = "b" } group_by = ["..."] contact_point = grafana_contact_point.a_different_contact_point.name mute_timings = [grafana_mute_timing.my_mute_timing.name] policy { matcher { label = "sublabel" match = "=" value = "subvalue" } contact_point = grafana_contact_point.a_third_contact_point.name group_by = ["..."] } } }
  2. mute_timings フィールドで、ミュートタイミングを通知ポリシーにリンクします。

  3. terraform apply コマンドを実行します。

  4. Grafana UI に移動し、通知ポリシーの詳細を確認します。

    注記

    UI から Terraform からプロビジョニングされたリソースを編集することはできません。これにより、アラートスタックは常にコードと同期したままになります。

  5. テスト をクリックして、通知ポイントが正しく動作していることを確認します。

ミュートタイミングのプロビジョニング

ミュートタイミングは、定義された期間のアラート通知をミュートする機能を提供します。

ミュートタイミングをプロビジョニングするには
  1. このコードブロックをローカルマシンの .tf ファイルにコピーします。

    この例では、アラート通知は週末にミュートされます。

    resource "grafana_mute_timing" "my_mute_timing" { name = "My Mute Timing" intervals { times { start = "04:56" end = "14:17" } weekdays = ["saturday", "sunday", "tuesday:thursday"] months = ["january:march", "12"] years = ["2025:2027"] } }
  2. terraform apply コマンドを実行します。

  3. Grafana UI に移動し、ミュートタイミングの詳細を確認します。

  4. mute_timings フィールドを使用して、通知ポリシーで新しく作成されたミュートタイミングを参照します。これにより、通知の一部またはすべてにミュートタイミングが適用されます。

    注記

    UI から Terraform からプロビジョニングされたリソースを編集することはできません。これにより、アラートスタックは常にコードと同期したままになります。

  5. テスト をクリックして、ミュートタイミングが正しく動作していることを確認します。

アラートルールのプロビジョニング

アラートルールを使用すると、Grafana データソースに対してアラートを送信できます。これは、既に設定したデータソースでも、アラートルールとともに Terraform でデータソースを定義することもできます。

アラートルールをプロビジョニングするには
  1. クエリを実行するデータソースと、ルールを保存するフォルダを作成します。

    この例では、テスト用の TestData データソースを設定するデータソースが使用されます。

    アラートは、Grafana の任意のバックエンドデータソースに対して定義できます。

    resource "grafana_data_source" "testdata_datasource" { name = "TestData" type = "testdata" } resource "grafana_folder" "rule_folder" { title = "My Rule Folder" }
  2. アラートルールを定義します。

    アラートルールの詳細については、「Grafana マネージドアラートの作成方法」を参照してください。

  3. 1 つ以上のルールを含むルールグループを作成します。

    この例では、 grafana_rule_groupリソースグループが使用されます。

    resource "grafana_rule_group" "my_rule_group" { name = "My Alert Rules" folder_uid = grafana_folder.rule_folder.uid interval_seconds = 60 org_id = 1 rule { name = "My Random Walk Alert" condition = "C" for = "0s" // Query the datasource. data { ref_id = "A" relative_time_range { from = 600 to = 0 } datasource_uid = grafana_data_source.testdata_datasource.uid // `model` is a JSON blob that sends datasource-specific data. // It's different for every datasource. The alert's query is defined here. model = jsonencode({ intervalMs = 1000 maxDataPoints = 43200 refId = "A" }) } // The query was configured to obtain data from the last 60 seconds. Let's alert on the average value of that series using a Reduce stage. data { datasource_uid = "__expr__" // You can also create a rule in the UI, then GET that rule to obtain the JSON. // This can be helpful when using more complex reduce expressions. model = <<EOT {"conditions":[{"evaluator":{"params":[0,0],"type":"gt"},"operator":{"type":"and"},"query":{"params":["A"]},"reducer":{"params":[],"type":"last"},"type":"avg"}],"datasource":{"name":"Expression","type":"__expr__","uid":"__expr__"},"expression":"A","hide":false,"intervalMs":1000,"maxDataPoints":43200,"reducer":"last","refId":"B","type":"reduce"} EOT ref_id = "B" relative_time_range { from = 0 to = 0 } } // Now, let's use a math expression as our threshold. // We want to alert when the value of stage "B" above exceeds 70. data { datasource_uid = "__expr__" ref_id = "C" relative_time_range { from = 0 to = 0 } model = jsonencode({ expression = "$B > 70" type = "math" refId = "C" }) } } }
  4. Grafana UI に移動し、アラートルールを確認します。

    アラートルールが発動しているかどうかを確認できます。アラートルールの各クエリステージを視覚化することもできます。

    アラートが発生すると、Grafana は定義したポリシーを通じて通知をルーティングします。

    例えば、Slack をコンタクトポイントとして選択した場合、Grafana の埋め込み Alertmanager は自動的にメッセージを Slack に投稿します。