

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# Terraform을 사용하여 알림 리소스 생성 및 관리
<a name="v9-alerting-setup-provision-terraform"></a>

****  
이 설명서 주제는 **Grafana 버전 9.x**를 지원하는 Grafana 워크스페이스를 위해 설계되었습니다.  
Grafana 버전 10.x를 지원하는 Grafana 워크스페이스의 경우 [Grafana 버전 10에서 작업](using-grafana-v10.md) 섹션을 참조하세요.  
Grafana 버전 8.x를 지원하는 Grafana 워크스페이스의 경우 [Grafana 버전 8에서 작업](using-grafana-v8.md) 섹션을 참조하세요.

Terraform의 Grafana 제공업체를 사용하여 알림 리소스를 관리하고 Grafana 시스템에 프로비저닝합니다. Grafana 알림에 대한 Terraform 제공업체 지원을 사용하면 전체 Grafana 알림 스택을 코드로 쉽게 생성, 관리 및 유지할 수 있습니다.

Terraform을 사용하여 알림 리소스를 관리하는 방법에 대한 자세한 내용은 Terraform 설명서의 [Grafana Provider](https://registry.terraform.io/providers/grafana/grafana/latest/docs) 설명서를 참조하세요.

다음 태스크를 완료하여 Terraform을 사용해 알림 리소스를 생성하고 관리하세요.

1. 프로비저닝을 위한 API 키를 생성하세요.

1. Terraform 제공업체를 구성하세요.

1. Terraform에서 알림 리소스를 정의하세요.

1. `terraform apply`를 실행하여 알림 리소스를 프로비저닝하세요.

## 사전 조건
<a name="v9-alerting-setup-provision-tf-prerequisites"></a>
+ grafana/grafana [Terraform provider](https://registry.terraform.io/providers/grafana/grafana/1.28.0) 1.27.0 이상이 있는지 확인하세요.
+ Grafana 9.1 이상을 사용하고 있는지 확인하세요. Grafana 버전 9를 사용하여 Amazon Managed Grafana 인스턴스를 생성한 경우 이에 해당합니다.

## 프로비저닝을 위한 API 키 생성
<a name="v9-alerting-setup-provision-tf-apikey"></a>

[일반 Grafana API 키를 생성](Using-Grafana-APIs.md)하여 Grafana에서 Terraform을 인증할 수 있습니다. API 키를 사용하는 대부분의 기존 도구는 새로운 Grafana 알림 지원과 함께 자동으로 작동해야 합니다. 특별히 Terraform에서 사용할 키 생성에 대한 자세한 내용은 [Using Terraform for Amazon Managed Grafana automation](https://aws-observability.github.io/observability-best-practices/recipes/recipes/amg-automation-tf/)을 참조하세요.

**프로비저닝을 위한 API 키를 생성하는 방법**

1. CI 파이프라인에 대한 새 서비스 계정을 생성하세요.

1. '알림 규칙 프로비저닝 API에 액세스' 역할을 할당하세요.

1. 새 서비스 계정 토큰을 생성하세요.

1. Terraform에서 사용할 토큰의 이름을 지정하고 저장하세요.

또는 기본 인증을 사용할 수 있습니다. 지원되는 모든 인증 형식을 보려면 Terraform 설명서의 [Grafana authentication](https://registry.terraform.io/providers/grafana/grafana/latest/docs#authentication)을 참조하세요.

## Terraform 제공업체 구성
<a name="v9-alerting-setup-provision-tf-configure"></a>

Grafana 알림 지원은 [Grafana Terraform 제공업체](https://registry.terraform.io/providers/grafana/grafana/latest/docs)의 일부로 포함됩니다.

다음은 Terraform 제공업체를 구성하는 데 사용할 수 있는 예제입니다.

```
terraform {
    required_providers {
        grafana = {
            source = "grafana/grafana"
            version = ">= 1.28.2"
        }
    }
}

provider "grafana" {
    url = <YOUR_GRAFANA_URL>
    auth = <YOUR_GRAFANA_API_KEY>
}
```

## 연락 지점 및 템플릿 프로비저닝
<a name="v9-alerting-setup-provision-tf-contacts"></a>

연락 지점은 알림 스택을 외부 환경에 연결합니다. 외부 시스템에 연결하는 방법과 알림을 전송할 위치를 Grafana에 알려줍니다. 15개가 넘는 서로 다른 [통합](https://registry.terraform.io/providers/grafana/grafana/latest/docs/resources/contact_point#optional) 중에서 선택할 수 있습니다. 이 예제에서는 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
       }
   }
   ```

1. 텍스트 필드에 알림 텍스트를 입력하세요.

   `text` 필드는 [Go 스타일 템플릿 지정](https://pkg.go.dev/text/template)을 지원합니다. 이를 통해 Grafana 알림 전달 템플릿을 Terraform에서 직접 관리할 수 있습니다.

1. `terraform apply` 명령을 실행합니다.

1. Grafana UI로 이동하여 연락 지점의 세부 정보를 확인하세요.

   UI에서 Terraform을 통해 프로비저닝된 리소스를 편집할 수 없습니다. 그러면 알림 스택이 항상 코드와 동기화됩니다.

1. **테스트**를 클릭하여 연락 지점이 올바르게 작동하는지 확인하세요.

**참고**  
여러 연락 지점에서 동일한 템플릿을 재사용할 수 있습니다. 위 예제에서는 `{{ 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
}
```

## 알림 정책 및 라우팅 프로비저닝
<a name="v9-alerting-setup-provision-tf-notifications"></a>

알림 정책은 위치가 아닌 알림 인스턴스를 라우팅하는 방법을 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 = ["..."]
           }
       }
   }
   ```

1. mute\$1timings 필드에서 음소거 타이밍을 알림 정책에 연결하세요.

1. `terraform apply` 명령을 실행합니다.

1. Grafana UI로 이동하여 알림 정책의 세부 정보를 확인하세요.
**참고**  
UI를 통해 Terraform에서 프로비저닝된 리소스를 편집할 수 없습니다. 그러면 알림 스택이 항상 코드와 동기화됩니다.

1. **테스트**를 클릭하여 알림 포인트가 올바르게 작동하는지 확인하세요.

## 프로비저닝 음소거 타이밍
<a name="v9-alerting-setup-provision-tf-mutetiming"></a>

음소거 타이밍은 정의된 기간에 알림 메시지를 음소거할 수 있는 기능을 제공합니다.

**음소거 타이밍을 프로비저닝하는 방법**

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"]
       }
   }
   ```

1. `terraform apply` 명령을 실행합니다.

1. Grafana UI로 이동하여 음소거 타이밍의 세부 정보를 확인하세요.

1. `mute_timings` 필드를 사용하여 알림 정책에서 새로 생성된 음소거 타이밍을 참조하세요. 그러면 일부 또는 모든 알림에 음소거 시간이 적용됩니다.
**참고**  
UI를 통해 Terraform에서 프로비저닝된 리소스를 편집할 수 없습니다. 그러면 알림 스택이 항상 코드와 동기화됩니다.

1. **테스트**를 클릭하여 음소거 타이밍이 올바르게 작동하는지 확인하세요.

## 알림 규칙 프로비저닝
<a name="v9-alerting-setup-provision-tf-rules"></a>

[알림 규칙](v9-alerting-managerules.md)을 사용하면 Grafana 데이터 소스에 대해 경고할 수 있습니다. 이미 구성한 데이터 소스일 수도 있습니다. 아니면 알림 규칙과 함께 [Terraform에서 데이터 소스를 정의](https://registry.terraform.io/providers/grafana/grafana/latest/docs/resources/data_source)할 수도 있습니다.

**알림 규칙을 프로비저닝하는 방법**

1. 쿼리할 데이터 소스와 규칙을 저장할 폴더를 생성하세요.

   이 예제에서 [테스트를 위한 TestData 데이터 소스 구성](testdata-data-source.md) 데이터 소스가 사용됩니다.

   Grafana의 모든 백엔드 데이터 소스에 대해 알림을 정의할 수 있습니다.

   ```
   resource "grafana_data_source" "testdata_datasource" {
       name = "TestData"
       type = "testdata"
   }
   
   resource "grafana_folder" "rule_folder" {
       title = "My Rule Folder"
   }
   ```

1. 알림 규칙을 정의하세요.

   알림 규칙에 대한 자세한 내용은 [how to create Grafana-managed alerts](https://grafana.com/blog/2022/08/01/grafana-alerting-video-how-to-create-alerts-in-grafana-9/)를 참조하세요.

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"
               })
           }
       }
   }
   ```

1. Grafana UI로 이동하여 알림 규칙을 확인하세요.

   알림 규칙이 실행 중인지 확인할 수 있습니다. 또한 각 알림 규칙의 쿼리 단계에 대한 시각화를 볼 수 있습니다.

   알림이 실행되면 Grafana에서는 사용자가 정의한 정책을 통해 알림을 라우팅합니다.

   예를 들어 Slack을 연락 지점으로 선택하면 Grafana의 임베드된 [Alertmanager](https://github.com/prometheus/alertmanager)에서 자동으로 Slack에 메시지를 게시합니다.