Terraform으로 Grafana Cloud의 Fleet Management 관리

Terraform으로 Grafana Cloud의 Fleet Management 관리

Terraform을 사용해 Grafana Cloud에서 Grafana Fleet Management 컬렉터와 파이프라인을 만드는 방법을 배워요. 이 가이드는 Fleet Management 및 Grafana Alloy를 위한 접근 정책(access policy)과 토큰, 원격 속성(remote attributes)이 있는 컬렉터, Alloy 프로파일링을 위한 파이프라인을 만드는 방법을 보여줘요.

출처: 문서

본문

시작하기 전에

시작하기 전에 다음을 준비하세요:

  • Get started에 표시된 Grafana Cloud 계정
  • 머신에 설치된 Terraform
  • 머신에 설치된 Alloy
  • Grafana 인스턴스의 관리자(Administrator) 권한

참고

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

Grafana Cloud용 프로바이더 구성

이 Terraform 구성은 Cloud API와 상호작용할 때 필요한 인증을 제공하도록 Grafana 프로바이더를 구성해요. grafana_cloud_stack(Data Source)은 인스턴스의 사용자 ID와 URL 세부 정보를 검색하는 데 사용돼요.

  • Grafana Cloud 접근 정책(access policy)과 토큰을 만드세요. 새로 만들려면 Grafana Cloud Access Policies 문서를 참고하세요. 스택을 realms 목록에 추가하세요. 이 가이드의 예시에 필요한 스코프(scopes)는 다음과 같아요:

  • accesspolicies:read

  • accesspolicies:write

  • accesspolicies:delete

  • stacks:read

  • cloud-provider.tf라는 파일을 만들고 다음 코드 블록을 추가하세요:

terraform {
  required_providers {
    grafana = {
      source  = "grafana/grafana"
      version = ">= 3.19.0"
    }
  }
}

provider "grafana" {
  alias = "cloud"

  cloud_access_policy_token = ""
}

data "grafana_cloud_stack" "stack" {
  provider = grafana.cloud

  slug = ""
}
  • 다음 필드 값을 바꾸세요:

  • cloud_access_policy_token을 첫 단계에서 만든 접근 정책 토큰으로

  • slug을 Grafana Cloud 인스턴스가 제공되는 서브도메인인 스택 슬러그로: https://<slug>.grafana.net

Fleet Management용 접근 정책과 토큰 만들기

이 Terraform 구성은 다음을 생성해요:

  • fleet-management:read 및 fleet-management:write 스코프를 가진 fleet-management-policy라는 접근 정책(grafana_cloud_access_policy 리소스 사용)

  • fleet-management-token이라는 토큰(grafana_cloud_access_policy_token 리소스 사용)

  • fm-access-policy.tf라는 파일을 만들고 다음 코드 블록을 추가하세요:

resource "grafana_cloud_access_policy" "fm_policy" {
  provider = grafana.cloud

  name   = "fleet-management-policy"
  region = data.grafana_cloud_stack.stack.region_slug

  scopes = [
    "fleet-management:read",
    "fleet-management:write"
  ]

  realm {
    type       = "stack"
    identifier = data.grafana_cloud_stack.stack.id
  }
}

resource "grafana_cloud_access_policy_token" "fm_token" {
  provider = grafana.cloud

  name             = "fleet-management-token"
  region           = grafana_cloud_access_policy.fm_policy.region
  access_policy_id = grafana_cloud_access_policy.fm_policy.policy_id
}

Fleet Management용 프로바이더 구성

이 Terraform 구성은 Fleet Management API와 상호작용할 때 필요한 인증을 제공하도록 Grafana 프로바이더를 구성해요.

  • fm-provider.tf라는 파일을 만들고 다음 코드 블록을 추가하세요:
locals {
  fm_id    = data.grafana_cloud_stack.stack.fleet_management_user_id
  fm_token = grafana_cloud_access_policy_token.fm_token.token
  fm_url   = data.grafana_cloud_stack.stack.fleet_management_url
}

provider "grafana" {
  alias = "fm"

  fleet_management_auth = "${local.fm_id}:${local.fm_token}"
  fleet_management_url  = local.fm_url
}

Fleet Management 컬렉터 만들기

이 Terraform 구성은 grafana_fleet_management_collector(리소스)를 사용해 원격 속성이 있는 컬렉터를 만들어요.

이 구성은 컬렉터를 사전 등록(pre-register)만 해요. 컬렉터가 Fleet Management에 등록되고 원격 속성이 할당되려면 Run Alloy 단계를 완료해야 해요.

  • fm-collector.tf라는 파일을 만들고 다음 코드 블록을 추가하세요:
resource "grafana_fleet_management_collector" "fm_collector" {
  provider = grafana.fm

  id = "prod_collector"
  remote_attributes = {
    "env" = "PROD"
  }
  enabled = true
}

Fleet Management 파이프라인 만들기

이 Terraform 구성은 grafana_fleet_management_pipeline(리소스)를 사용해 이전 단계에서 선언한 컬렉터에 대한 매처(matcher)가 있는 Alloy 프로파일링용 파이프라인을 만들어요. 파이프라인은 프로파일을 Grafana Cloud Profiles에 기록해요.

  • profiling.alloy.tftpl이라는 파일을 만들고 다음 내용을 추가하세요:
// This pipeline scrapes pprof Go profiles from Alloy and sends them to Pyroscope.
//
// It requires the following environment variables to be set where Alloy is running:
//   Required:
//     * GCLOUD_RW_API_KEY: The Grafana Cloud API key with write access to Pyroscope.
//   Optional:
//     * ALLOY_ADDRESS: The address Alloy listens on. Defaults to 127.0.0.1:12345.
pyroscope.scrape "alloy" {
    targets = [
        {
            "__address__" = coalesce(
                sys.env("ALLOY_ADDRESS"),
                "127.0.0.1:12345",
            ),
            "service_name" = "alloy",
        },
    ]
    forward_to = [pyroscope.write.grafana_cloud.receiver]

    profiling_config {
        profile.process_cpu {
            enabled = true
        }

        profile.memory {
            enabled = true
        }

        profile.mutex {
            enabled = true
        }

        profile.block {
            enabled = true
        }

        profile.goroutine {
            enabled = true
        }
    }
}

pyroscope.write "grafana_cloud" {
    endpoint {
        url = "${profiles_url}"

        basic_auth {
            username = "${profiles_id}"
            password = sys.env("GCLOUD_RW_API_KEY")
        }
    }
}
  • fm-pipeline.tf라는 파일을 만들고 다음 코드 블록을 추가하세요:
locals {
  profiles_id  = data.grafana_cloud_stack.stack.profiles_user_id
  profiles_url = data.grafana_cloud_stack.stack.profiles_url
}

resource "grafana_fleet_management_pipeline" "pipeline" {
  provider = grafana.fm

  name = "profiling"
  contents = templatefile(
    "profiling.alloy.tftpl",
    {
      profiles_id  = local.profiles_id,
      profiles_url = local.profiles_url,
    },
  )
  matchers = [
    "env=\"PROD\""
  ]
  enabled = true
}

Alloy용 접근 정책과 토큰 만들기

이 Terraform 구성은 다음을 생성해요:

  • set:alloy-data-write 스코프를 가진 alloy-policy라는 접근 정책(grafana_cloud_access_policy 리소스 사용)

  • alloy-token이라는 토큰(grafana_cloud_access_policy_token 리소스 사용)

  • alloy-access-policy.tf라는 파일을 만들고 다음 코드 블록을 추가하세요:

resource "grafana_cloud_access_policy" "alloy_policy" {
  provider = grafana.cloud

  name   = "alloy-policy"
  region = data.grafana_cloud_stack.stack.region_slug

  scopes = [
    "set:alloy-data-write"
  ]

  realm {
    type       = "stack"
    identifier = data.grafana_cloud_stack.stack.id
  }
}

resource "grafana_cloud_access_policy_token" "alloy_token" {
  provider = grafana.cloud

  name             = "alloy-token"
  region           = grafana_cloud_access_policy.alloy_policy.region
  access_policy_id = grafana_cloud_access_policy.alloy_policy.policy_id
}

output "alloy_token" {
  value     = grafana_cloud_access_policy_token.alloy_token.token
  sensitive = true
}

Alloy용 구성 파일 만들기

이 Terraform 구성은 local_file(리소스)을 사용해 Fleet Management용 remotecfg 블록이 있는 Alloy 구성 파일을 만들어요.

  • config.alloy.tftpl이라는 파일을 만들고 다음 내용을 추가하세요:
remotecfg {
    id             = "${collector_id}"
    url            = "${fm_url}"
    poll_frequency = "60s"

    basic_auth {
        username = "${fm_id}"
        password = sys.env("GCLOUD_RW_API_KEY")
    }
}
  • alloy-config.tf라는 파일을 만들고 다음 코드 블록을 추가하세요:
resource "local_file" "alloy_config" {
  filename = ""
  content = templatefile(
    "config.alloy.tftpl",
    {
      collector_id = "prod_collector",
      fm_id        = local.fm_id,
      fm_url       = local.fm_url,
    },
  )
  directory_permission = "0644"
  file_permission      = "0644"
}
  • 다음 필드 값을 바꾸세요:

  • filename을 Alloy 구성 파일이 기록되어야 할 경로로(예: config.alloy)

Terraform 구성 적용

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

  • Terraform 구성 파일이 포함된 작업 디렉터리 초기화:
terraform init
  • Terraform 변경 사항 미리 보기:
terraform plan
  • 구성 적용:
terraform apply

Alloy 실행

Alloy를 시작하거나 다시 시작하는 방법은 Grafana Alloy 실행 문서를 참고하세요.

참고

이 예시의 원격 구성이 작동하려면 Alloy가 실행되는 환경에 GCLOUD_RW_API_KEY 변수가 설정되어 있어야 해요.

  • Alloy 토큰을 보려면 다음 명령을 실행하세요:
terraform output -raw alloy_token
  • 환경 변수 GCLOUD_RW_API_KEY를 첫 단계의 값으로 설정하세요.

  • Alloy를 실행하세요.

검증

Terraform 구성의 변경 사항을 적용하고 Alloy를 실행한 후 다음을 확인할 수 있어야 해요:

  • 컬렉터가 Fleet Management Inventory 탭에 추가됨:

  • 파이프라인이 Fleet Management Remote configuration 탭에 추가됨:

  • Alloy 프로파일이 Grafana Cloud Profiles로 내보내지고 있음:

요약

이 가이드에서는 Terraform을 사용해 Fleet Management와 Alloy를 위한 접근 정책과 토큰, 원격 속성이 있는 컬렉터, Alloy 프로파일링용 파이프라인을 만들었어요.

Terraform으로 Grafana Cloud를 관리하는 방법에 대해 자세히 알아보려면 Grafana 프로바이더 문서를 참고하세요.

더 알아보기 (Learn more)