Terraform으로 Grafana Cloud에서 Grafana IRM 관리하기

Terraform으로 Grafana Cloud에서 Grafana IRM 관리하기 (Manage Grafana IRM in Grafana Cloud using Terraform)

출처: 문서

Terraform을 사용해 Grafana IRM 리소스를 관리하는 방법을 알아봐요. 이 가이드에서는 Terraform을 사용해 통합(integration)을 연결하고, 에스컬레이션 정책을 구성하며, 온콜 스케줄을 추가하는 방법을 보여줘요.

여러 팀에 걸친 IRM 사용을 설명하기 위해 이 가이드에서는 Devs와 SREs라는 두 팀을 예로 들어요. 또한 IRM용 Slack을 구성하는 데 필요한 단계도 포함돼 있어요.

참고 Grafana IRM은 제한된 리소스 집합, 주로 OnCall 기능과 관련된 리소스에 대해 Terraform 기반 구성을 지원해요. 이 리소스들은 Terraform에서 grafana_oncall_ 명명 규칙을 사용해요. 나머지 IRM 구성 요소는 아직 Terraform으로 구성할 수 없어요.

시작하기 전에

시작하기 전에 다음이 준비되어 있는지 확인해 주세요.

  • 시작하기에 설명된 대로 Grafana Cloud 계정
  • 머신에 설치된 Terraform
  • Grafana 인스턴스의 관리자 권한
  • (선택) Slack을 Grafana IRM과 통합하려면 Slack 워크스페이스의 관리자 권한

참고 다음의 모든 Terraform 구성 파일은 같은 디렉터리에 저장해야 해요.

Slack을 Grafana IRM에 연결하기

Terraform 설정에 Slack 설정을 포함하기 전에 먼저 Grafana IRM으로 Slack 통합을 구성해야 해요.

Slack 워크스페이스를 Grafana IRM에 연결하려면 Grafana IRM용 Slack 통합 문서를 참고하세요.

Grafana 프로바이더 구성하기

이 Terraform 구성은 Grafana 프로바이더를 설정해서 Grafana IRM 리소스를 관리할 때 필요한 인증을 제공해요.

Terraform으로 Grafana Cloud 스택 생성 및 관리에 설명된 것과 비슷한 설정을 재사용해서 서비스 계정과 토큰을 만들 수 있어요.

  1. Grafana에서 서비스 계정과 토큰을 만드세요. 새로 만들려면 서비스 계정 토큰을 참고하세요.
  2. main.tf라는 파일을 만들고 다음을 추가하세요.
terraform {
  required_providers {
    grafana = {
      source  = "grafana/grafana"
      version = ">= 3.15.3"
    }
  }
}

provider "grafana" {
  alias = "oncall"

  url  = "<Stack-URL>"
  auth = "<Service-account-token>"
  oncall_url = "<OnCall-URL>"
}
  1. 다음 필드 값을 바꾸세요.
    • <Stack-URL>을 Grafana 스택의 URL로
    • <Service-account-token>을 만든 서비스 계정 토큰으로
    • <OnCall-URL>을 IRM 설정(Settings) 페이지의 Admin & API 탭에서 찾은 API URL로

참고 서비스 계정에 올바른 권한이 있다면 이 프로바이더 설정으로 다른 Grafana 리소스도 관리할 수 있어요.

OnCall API 토큰으로 인증하기 (폐기 예정)

OnCall API 토큰은 폐기되고 있어요. 기존 토큰은 계속 동작하지만, 모든 새 API 인증에는 Grafana Cloud 서비스 계정 토큰을 사용할 것을 권장해요.

OnCall API 토큰으로 인증하기

기존 OnCall API 토큰을 사용하려면:

  1. Grafana Cloud 인스턴스에 로그인하세요.
  2. Alerts & IRM > IRM을 선택하세요.
  3. Settings를 클릭한 다음 Admin & API를 선택하세요.
  4. Grafana IRM API 섹션을 찾으세요.
  5. 기존 OnCall API 토큰을 보거나, 복사하거나, 취소하세요.
  6. main.tf라는 파일을 만들고 다음을 추가하세요.
terraform {
  required_providers {
    grafana = {
      source  = "grafana/grafana"
      version = ">= 2.9.0"
    }
  }
}

provider "grafana" {
  alias = "oncall"

  oncall_access_token = "<OnCall-API-Token>"
  oncall_url = "<OnCall-URL>"
}
  1. 다음 필드 값을 바꾸세요.
    • <OnCall-API-Token>을 기존 OnCall API 토큰으로
    • <OnCall-URL>을 IRM 설정(Settings) 페이지의 Admin & API 탭에서 찾은 API URL로

온콜 스케줄 추가하기

이 Terraform 구성은 grafana_oncall_schedule 리소스를 사용해 Grafana IRM 안에서 SREs와 Devs라는 두 개의 온콜 스케줄을 설정해요. 또한 이 구성에는 각 팀의 온콜 스케줄에 대한 알림을 받을 Slack 채널도 포함돼 있어요.

온콜 스케줄 관리에 대해 더 배우려면 온콜 스케줄 문서를 참고하세요.

  1. 캘린더 서비스에 새 캘린더 두 개를 만드세요. 하나는 Devs용, 하나는 SREs용이에요.
  2. 비밀 iCal URL을 찾아 저장하세요. 예를 들어 Google 캘린더에서는 이 URL을 설정 > 내 캘린더 설정 > 캘린더 통합에서 찾을 수 있어요.
  3. schedule.tf라는 파일을 만들고 다음을 추가하세요.
# Name of the Slack channel to notify about on-call schedules for Devs
data "grafana_oncall_slack_channel" "Devs" {
  provider = grafana.oncall

  name = "<Devs-channel-name>"
}

# Name of the Slack channel to notify about on-call schedules for SREs
data "grafana_oncall_slack_channel" "SREs" {
  provider = grafana.oncall

  name = "<SREs-channel-name>"
}

resource "grafana_oncall_schedule" "schedule_Devs" {
  provider = grafana.oncall

  name             = "Devs"
  type             = "ical"
  ical_url_primary = "<secret-iCal-URL-for-devs-calendar>"
  slack {
    channel_id = data.grafana_oncall_slack_channel.Devs.slack_id
  }
}

resource "grafana_oncall_schedule" "schedule_SREs" {
  provider = grafana.oncall

  name             = "SREs"
  type             = "ical"
  ical_url_primary = "<secret-iCal-URL-for-SREs-calendar>"
  slack {
    channel_id = data.grafana_oncall_slack_channel.SREs.slack_id
  }
}
  1. 다음 필드 값을 바꾸세요.
    • <Devs-channel-name>을 Devs의 온콜 스케줄에 대해 알릴 Slack 채널 이름으로
    • <SREs-channel-name>을 SREs의 온콜 스케줄에 대해 알릴 Slack 채널 이름으로
    • <secret-iCal-URL-for-devs-calendar>를 첫 번째 단계에서 만든 Devs 캘린더의 비밀 iCal URL로
    • <secret-iCal-URL-for-SREs-calendar>를 첫 번째 단계에서 만든 SREs 캘린더의 비밀 iCal URL로

에스컬레이션 체인 추가하기

이 Terraform 구성은 grafana_oncall_escalation_chain (Resource)을 사용해 Grafana IRM에 SREs와 Devs라는 두 개의 에스컬레이션 체인을 만들어요. 또한 이 구성은 grafana_oncall_escalation (Resource)을 사용해 각 에스컬레이션 체인에 다음 세 단계를 추가해요.

  • 온콜 스케줄의 사용자에게 알림
  • 5분 동안 대기
  • 기본 Slack 채널에 알림
  1. escalation-devs.tf라는 파일을 만들고 다음을 추가하세요.
resource "grafana_oncall_escalation_chain" "Devs" {
  provider = grafana.oncall

  name = "Devs"
}

// Notify users from on-call schedule
resource "grafana_oncall_escalation" "notify_schedule_step_Devs" {
  provider = grafana.oncall

  escalation_chain_id          = grafana_oncall_escalation_chain.Devs.id
  type                         = "notify_on_call_from_schedule"
  notify_on_call_from_schedule = grafana_oncall_schedule.schedule_Devs.id
  position                     = 0
}

// Wait step for 5 Minutes
resource "grafana_oncall_escalation" "wait_step_Devs" {
  provider = grafana.oncall

  escalation_chain_id = grafana_oncall_escalation_chain.Devs.id
  type                = "wait"
  duration            = 300
  position            = 1
}

// Notify default Slack channel step
resource "grafana_oncall_escalation" "notify_step_Devs" {
  provider = grafana.oncall

  escalation_chain_id = grafana_oncall_escalation_chain.Devs.id
  type                = "notify_whole_channel"
  important           = true
  position            = 2
}
  1. escalation-sre.tf라는 파일을 만들고 다음을 추가하세요.
resource "grafana_oncall_escalation_chain" "SREs" {
  provider = grafana.oncall

  name = "SREs"
}

// Notify users from on-call schedule
resource "grafana_oncall_escalation" "notify_schedule_step_SREs" {
  provider = grafana.oncall

  escalation_chain_id          = grafana_oncall_escalation_chain.SREs.id
  type                         = "notify_on_call_from_schedule"
  notify_on_call_from_schedule = grafana_oncall_schedule.schedule_SREs.id
  position                     = 0
}

// Wait step for 5 Minutes
resource "grafana_oncall_escalation" "wait_step_SREs" {
  provider = grafana.oncall

  escalation_chain_id = grafana_oncall_escalation_chain.SREs.id
  type                = "wait"
  duration            = 300
  position            = 1
}

// Notify default Slack channel step
resource "grafana_oncall_escalation" "notify_step_SREs" {
  provider = grafana.oncall

  escalation_chain_id = grafana_oncall_escalation_chain.SREs.id
  type                = "notify_whole_channel"
  important           = true
  position            = 2
}

Grafana IRM에 통합 연결하기

이 Terraform 구성은 grafana_oncall_integration (Resource)을 사용해 Alertmanager를 Grafana IRM에 연결해요. 또한 알림의 기본 경로로 Devs 에스컬레이션 체인을 추가해요.

  1. integrations.tf라는 파일을 만들고 다음을 추가하세요.
resource "grafana_oncall_integration" "AlertManager" {
  provider = grafana.oncall

  name = "AlertManager"
  type = "alertmanager"
  default_route {
    escalation_chain_id = grafana_oncall_escalation_chain.Devs.id
  }
}
  1. Alertmanager를 구성하려면 Grafana OnCall용 Alertmanager 통합 문서를 참고하세요.

알림 그룹 알림의 에스컬레이션 동작을 구성하는 경로 설정하기

이 Terraform 구성은 grafana_oncall_route (Resource)를 사용해 Alertmanager 통합에 대한 경로를 설정해요. 이 경로는 페이로드에 "namespace" *: *"ops-.*"가 있는 알림에 대한 알림이 SREs 에스컬레이션 체인으로 에스컬레이션되도록 해요.

routes.tf라는 파일을 만들고 다음을 추가하세요.

resource "grafana_oncall_route" "route_SREs" {
  provider = grafana.oncall

  integration_id      = grafana_oncall_integration.AlertManager.id
  escalation_chain_id = grafana_oncall_escalation_chain.SREs.id
  routing_regex       = "\"namespace\" *: *\"ops-.*\""
  position            = 0
}

Terraform 구성 적용하기

터미널에서 모든 구성 파일이 있는 디렉터리로 이동한 다음 다음 명령을 실행하세요.

  1. Terraform 구성 파일이 포함된 작업 디렉터리를 초기화하세요.
terraform init
  1. Terraform이 만들 변경 사항을 미리 확인하세요.
terraform plan
  1. 구성 파일을 적용하세요.
terraform apply

검증 (Validation)

Terraform 구성에서 변경 사항을 적용한 후 다음을 확인할 수 있어요.

  • Grafana IRM에 Devs와 SREs라는 새 스케줄 두 개가 만들어짐
  • Grafana IRM에 SREs라는 새 에스컬레이션 체인이 만들어짐
  • Grafana IRM에 Devs라는 새 에스컬레이션 체인이 만들어짐
  • Alertmanager 통합이 추가되고 에스컬레이션 정책으로 구성됨

요약 (Summary)

이 가이드에서는 통합을 연결하고, 에스컬레이션 정책을 구성하며, 온콜 스케줄을 설정해서 Terraform으로 Grafana IRM을 관리하는 방법을 배웠어요.

Terraform으로 Grafana Cloud를 관리하는 방법을 더 배우려면 Grafana 프로바이더 문서를 참고하세요.