View a markdown version of this page

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

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

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

このドキュメントのトピックは、Grafana バージョン 9.x をサポートする Grafana ワークスペース向けです。

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

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

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 Webhook 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 形式のテンプレートをサポートします。これにより、Terraform で Grafana アラート通知テンプレートを直接管理できます。

  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 に移動し、通知ポリシーの詳細を確認します。

    注記

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

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

    注記

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

  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 の埋め込みアラートマネージャーは Slack にメッセージを自動的に投稿します。