翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
Terraform を使用したアラートリソースの作成と管理
このドキュメントのトピックは、Grafana バージョン 9.x をサポートする Grafana ワークスペース向けです。
Grafana バージョン 10.x をサポートする Grafana ワークスペースについては、「Grafana バージョン 10 での作業」を参照してください。
Grafana バージョン 8.x をサポートする Grafana ワークスペースについては、「Grafana バージョン 8 での作業」を参照してください。
Terraform の Grafana プロバイダーを使用してアラートリソースを管理し、Grafana システムにプロビジョニングします。Terraform プロバイダーによる Grafana アラートのサポートにより、Grafana アラートスタック全体をコードとして簡単に作成、管理、維持できます。
Terraform を使用してアラートリソースを管理する方法の詳細については、Terraform ドキュメントの [Grafana プロバイダー]
Terraform を使用してアラートリソースを作成および管理するには、次のタスクを実行します。
-
プロビジョニング用の API キーを作成します。
-
Terraform プロバイダーを設定します。
-
Terraform でアラートリソースを定義します。
-
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 キーを作成するには
-
CI パイプラインの新しいサービスアカウントを作成します。
-
ロール「アラートルールプロビジョニング API にアクセス」を割り当てます。
-
新しいサービスアカウントトークンを作成します。
-
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 に伝えます。選択できる統合
コンタクトポイントとテンプレートをプロビジョニングするには
-
このコードブロックをローカルマシンの .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 } } -
通知のテキストをテキストフィールドに入力します。
text
フィールドは Go 形式のテンプレートをサポートします。これにより、Terraform で Grafana アラート通知テンプレートを直接管理できます。 -
terraform apply
コマンドを実行します。 -
Grafana UI に移動し、コンタクトポイントの詳細を確認します。
UI から Terraform 経由でプロビジョニングされたリソースを編集することはできません。これにより、アラートスタックは常にコードと同期したままになります。
-
[テスト] をクリックして、コンタクトポイントが正しく機能することを確認します。
注記
多くのコンタクトポイントで同じテンプレートを再利用できます。上記の例では、{{ 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 に指示します。ラベルとマッチャーのシステムを使用して、発動アラートを以前に定義したコンタクトポイントに接続します。
通知ポリシーとルーティングをプロビジョニングするには
-
このコードブロックをローカルマシンの .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 = ["..."] } } }
-
mute_timings フィールドで、ミュートタイミングを通知ポリシーにリンクします。
-
terraform apply
コマンドを実行します。 -
Grafana UI に移動し、通知ポリシーの詳細を確認します。
注記
Terraform からプロビジョニングされたリソースを UI から編集することはできません。これにより、アラートスタックは常にコードと同期したままになります。
-
[テスト] をクリックして、通知ポイントが正しく機能していることを確認します。
ミュートタイミングのプロビジョニング
ミュートタイミングを使用すると、定義された期間のアラート通知をミュートできます。
ミュートタイミングをプロビジョニングするには
-
このコードブロックをローカルマシンの .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"] } }
-
terraform apply
コマンドを実行します。 -
Grafana UI に移動し、ミュートタイミングの詳細を確認します。
-
mute_timings
フィールドを使用して、通知ポリシーで新しく作成したミュートタイミングを参照します。これにより、通知の一部またはすべてにミュートタイミングが適用されます。注記
Terraform からプロビジョニングされたリソースを UI から編集することはできません。これにより、アラートスタックは常にコードと同期したままになります。
-
[テスト] をクリックして、ミュートタイミングが正しく機能していることを確認します。
アラートルールのプロビジョニング
アラートルールを使用すると、あらゆる Grafana データソースに対してアラートを実行できます。これは、既に設定済みのデータソースを使用することも、アラートルールとともに [Terraform でデータソースを定義]
アラートルールをプロビジョニングするには
-
クエリするデータソースと、ルールを保存するフォルダを作成します。
この例では、テスト用 TestData データソースの設定 データソースが使用されます。
アラートは Grafana の任意のバックエンドデータソースに対して定義できます。
resource "grafana_data_source" "testdata_datasource" { name = "TestData" type = "testdata" } resource "grafana_folder" "rule_folder" { title = "My Rule Folder" }
-
アラートルールを定義します。
アラートルールの詳細については、[Grafana マネージドアラートの作成方法]
を参照してください。 -
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" }) } } }
-
Grafana UI に移動し、アラートルールを確認します。
アラートルールが発射しているかどうかを確認できます。また、アラートルールの各クエリステージを視覚化することもできます。
アラートが発生すると、Grafana は定義したポリシーを通じて通知をルーティングします。
例えば、コンタクトポイントとして Slack を選択した場合、Grafana の埋め込みアラートマネージャー
は Slack にメッセージを自動的に投稿します。