Terraform과 GitHub Actions로 대시보드 생성 및 관리하기

Terraform과 GitHub Actions로 대시보드 생성 및 관리하기 (Create and manage dashboards using Terraform and GitHub Actions)

출처: 문서

Terraform과 GitHub Actions를 사용해 Grafana용 JSON 소스 코드로 표현된 여러 대시보드를 생성하고 관리하는 방법을 알아봐요.

사전 준비 사항

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

GitHub 저장소에 대시보드 추가하기

이 가이드에서는 ElasticSearch, InfluxDB, AWS EC2용 대시보드를 추가하는 방법을 보여줘요. 구성한 데이터 소스에 따라 다른 대시보드를 사용할 수 있어요.

  1. GitHub 저장소의 루트 디렉터리에 dashboards라는 폴더를 만드세요.
  2. dashboards 폴더 안에 세 개의 하위 폴더를 만드세요. 이 가이드에서는 elasticsearch, influxdb, aws라는 세 개의 하위 폴더를 만들 거예요.
  3. 세 개의 하위 폴더 각각에 대시보드 JSON 소스 코드를 추가하세요.

Grafana 프로바이더용 Terraform 구성

이 Terraform 구성은 Grafana 프로바이더를 구성해서 Grafana 인스턴스에서 폴더와 대시보드를 만들 때 필요한 인증을 제공해요.

  1. 다음 단계에 따라 Grafana 인스턴스에서 서비스 계정과 토큰을 만드세요.
    1. Grafana에서 서비스 계정 만들기
    2. 서비스 계정에 토큰 추가하기
  2. Git 루트 디렉터리에 main.tf라는 파일을 만들고 다음 코드 블록을 추가하세요.
terraform {
   required_providers {
      grafana = {
         source  = "grafana/grafana"
         version = ">= 2.9.0"
      }
   }
}

provider "grafana" {
   alias = "cloud"

   url   = "<Grafana-instance-url>"
   auth  = "<Grafana-Service-Account-token>"
}
  1. 다음 필드 값을 바꾸세요.
    • <Grafana-instance-url>을 Grafana 인스턴스의 URL로, 예를 들어 "https://my-stack.grafana.net/"로 바꾸세요.
    • <Grafana-Service-Account-token>을 Grafana 인스턴스의 서비스 계정 토큰으로 바꾸세요.

폴더용 Terraform 구성

이 Terraform 구성은 grafana_folder (Resource)를 사용해 Grafana 인스턴스에 ElasticSearch, InfluxDB, AWS라는 세 개의 폴더를 만들어요.

Git 루트 디렉터리에 folders.tf라는 파일을 만들고 다음 코드 블록을 추가하세요.

resource "grafana_folder" "ElasticSearch" {
  provider = grafana.cloud

  title = "ElasticSearch"
}

resource "grafana_folder" "InfluxDB" {
  provider = grafana.cloud

  title = "InfluxDB"
}

resource "grafana_folder" "AWS" {
  provider = grafana.cloud

  title = "AWS"
}

대시보드용 Terraform 구성

이 Terraform 구성은 GitHub 저장소에 만든 세 개의 폴더(elasticsearch, influxdb, aws) 안의 JSON 파일을 반복 처리하면서 Grafana 대시보드 리소스를 사용해 해당 파일들을 Grafana 인스턴스의 각 폴더에 추가해요. 사용 가능한 리소스는 다음과 같아요.

  • grafana_dashboard (Resource)
  • Grafana v13 이상의 Kubernetes 스타일 대시보드의 경우 대시보드의 Kubernetes 버전에 따라 적절한 리소스를 사용하세요. 사용 가능한 리소스(예: grafana_apps_dashboard_dashboard_v1beta1, grafana_apps_dashboard_dashboard_v1, grafana_apps_dashboard_dashboard_v2)에 대한 자세한 내용은 Grafana 리소스를 참고하세요.

예를 들어 GitHub 저장소의 elasticsearch 폴더에 JSON 소스 코드로 표현된 대시보드는 Grafana 인스턴스의 ElasticSearch 폴더에 만들어져요.

Git 루트 디렉터리에 dashboards.tf라는 파일을 만들고 다음 코드 블록을 추가하세요.

resource "grafana_dashboard" "elasticsearch" {
  provider = grafana.cloud

  for_each    = fileset("${path.module}/dashboards/elasticsearch", "*.json")
  config_json = file("${path.module}/dashboards/elasticsearch/${each.key}")
  folder      = grafana_folder.ElasticSearch.id
}

resource "grafana_dashboard" "influxdb" {
  provider = grafana.cloud

  for_each    = fileset("${path.module}/dashboards/influxdb", "*.json")
  config_json = file("${path.module}/dashboards/influxdb/${each.key}")
  folder      = grafana_folder.InfluxDB.id
}

resource "grafana_dashboard" "aws" {
  provider = grafana.cloud

  for_each    = fileset("${path.module}/dashboards/aws", "*.json")
  config_json = file("${path.module}/dashboards/aws/${each.key}")
  folder      = grafana_folder.AWS.id
}

Terraform으로 대시보드를 관리하는 GitHub 워크플로

이 GitHub 워크플로는 다음 단계로 구성돼요.

  • actions/checkout@v3 액션을 사용해 GitHub 저장소를 체크아웃해서 워크플로가 접근할 수 있게 해요.
  • hashicorp/setup-terraform@v1 액션을 사용해 GitHub 러너에 Terraform CLI를 설치해요.
  • GitHub 러너에서 bash 명령으로 terraform init을 실행해 Terraform 구성 파일이 들어 있는 작업 디렉터리를 초기화해요.
  • GitHub 러너에서 bash 명령으로 terraform fmt -check를 실행해 Terraform 구성 파일이 올바르게 포맷됐는지 확인해요. Terraform 구성 파일이 올바르게 포맷되지 않으면 워크플로가 이 단계에서 실패해요.
  • GitHub 러너에서 bash 명령으로 terraform plan을 실행해 Terraform이 만들 변경 사항을 미리 확인해요.
  • mshick/add-pr-comment@v1 액션을 사용해 Terraform plan의 미리보기를 풀 리퀘스트의 댓글로 올려요. 이렇게 하면 풀 리퀘스트가 머지되기 전에 Terraform이 만들 변경을 검토하는 데 도움이 돼요.
  • GitHub 러너에서 bash 명령으로 terraform apply -auto-approve를 실행해 Terraform 구성 파일을 적용해요. 적용 전에 plan의 대화형 승인을 건너뛰고 워크플로를 자동화하기 위해 명령에 -auto-approve 플래그를 추가해요. 이 단계는 변경 사항이 main 브랜치에 커밋될 때만 실행돼요. 풀 리퀘스트가 머지되면 머지 동작이 main 브랜치에 커밋을 만들어 terraform apply -auto-approve 단계가 실행되도록 해요.
  1. GitHub 저장소의 루트 디렉터리에 .github라는 폴더를 만드세요.
  2. .github 폴더 안에 workflows라는 하위 폴더를 만드세요.
  3. GitHub 워크플로를 GitHub 저장소에 추가하려면 workflows 디렉터리에 terraform.yml이라는 파일을 만들고 다음 코드 블록을 추가하세요.
name: Terraform

on:
  push:
    branches:
      - 'main'
  pull_request:

jobs:
  terraform:
    runs-on: ubuntu-latest

    steps:
      # Checkout the repository to the GitHub Actions runner
      - name: Checkout
        uses: actions/checkout@v3

      # Install the latest version of Terraform CLI
      - name: Setup Terraform
        uses: hashicorp/setup-terraform@v1

      # Initialize a new or existing Terraform working directory by creating initial files, loading any remote state, downloading modules, etc.
      - name: Terraform Init
        run: terraform init

      # Checks that all Terraform configuration files adhere to a canonical format
      - name: Terraform Format
        run: terraform fmt -check

      # Previews the changes that Terraform will make
      - name: Plan Terraform
        id: plan
        continue-on-error: true
        run: terraform plan -input=false -no-color

      # Post the preview (terraform plan) from the previous step as a GitHub pull request comment
      - name: Post Plan to GitHub PR
        if: github.ref != 'refs/heads/main'
        uses: mshick/add-pr-comment@v1
        with:
          repo-token: ${{ secrets.GITHUB_TOKEN }}
          repo-token-user-login: 'github-actions[bot]'
          message: |
            Applying:

            ```
            ${{ steps.plan.outputs.stdout }}
            ```

      # Applies the terraform configuration files when the branch is `main`
      - name: Apply Terraform
        if: github.ref == 'refs/heads/main'
        id: apply
        continue-on-error: true
        run: |
          terraform apply -auto-approve
  1. 이전 단계에서 변경한 terraform.yml을 GitHub 저장소의 main 브랜치에 커밋하세요. 변경 사항이 커밋되면, 앞서 정의한 워크플로가 풀 리퀘스트가 생성되거나 main 브랜치에 변경 사항이 커밋될 때 실행되므로 만든 GitHub 워크플로가 자동으로 실행되기 시작해야 해요.

Terraform 상태 관리하기

Terraform 백엔드를 사용해 .tfstate 파일을 저장하지 않는 경우, Terraform 상태 파일이 Git에 저장되도록 GitHub 워크플로 파일 끝에 다음 코드 블록을 추가하세요.

- name: commit the terraform state
  if: github.ref == 'refs/heads/main'
  uses: stefanzweifel/git-auto-commit-action@v4
  with:
    commit_message: Updating Terraform state
    file_pattern: terraform.tfstate

terraform apply를 실행하면 Terraform이 인프라와 구성에 대한 상태를 저장하도록 terraform.tfstate 파일을 자동으로 관리하고 업데이트해요. 이 단계는 stefanzweifel/git-auto-commit-action@v4 액션을 사용해 terraform apply 단계를 실행하며 만들어진 변경 사항에 대해 terraform.tfstate 파일을 자동으로 커밋해요.

참고 민감한 데이터가 새어 나오지 않도록 Terraform 상태 파일(terraform.tfstate)은 Git에 저장하면 안 돼요. 대신 적절한 RBAC와 함께 AWS S3 같은 원격 백엔드를 사용해 Terraform 상태 파일을 저장하세요. 자세한 내용은 Terraform 상태를 참고해요.

검증 (Validation)

GitHub 워크플로 실행이 성공하면 다음을 확인할 수 있어야 해요.

  • Grafana 인스턴스에 ElasticSearch, InfluxDB, AWS 폴더가 만들어짐
  • GitHub의 elasticsearch 폴더에서 JSON 소스 코드로 표현된 대시보드가 Grafana 인스턴스의 ElasticSearch 폴더 아래에 추가됨
  • GitHub의 influxdb 폴더의 대시보드 소스 코드가 Grafana 인스턴스의 InfluxDB 폴더 아래에 추가됨
  • GitHub의 aws 폴더의 대시보드가 Grafana 인스턴스의 AWS 폴더 아래에 추가됨

요약 (Summary)

이 가이드에서는 Terraform을 사용해 대시보드 소스 코드를 관리하는 GitHub 워크플로를 만들었어요. 이 워크플로를 사용하면 Grafana 인스턴스의 대시보드가 GitHub의 대시보드 JSON 소스 코드 파일과 동기화돼요.

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