Terraform으로 RBAC 프로비저닝하기
Terraform으로 RBAC 프로비저닝하기 (Provisioning RBAC with Terraform)
Terraform의 Grafana provider로 커스텀 역할을 만들·변경·제거하고 역할 할당을 추가·제거할 수 있어요. 역할과 할당을 프로비저닝하기 전에 어떤 역할을 만들고 사용자·팀에 어떻게 할당할지 결정하세요.
참고: Grafana Enterprise와 Grafana Cloud에서 사용할 수 있어요.
출처: 문서
본문
계획 지침은 RBAC 롤아웃 전략 계획을 참고하세요.
시작하기 전에
- grafana/grafana Terraform provider 1.29.0 이상
- Grafana 9.2 이상
- provider 인증 방법 결정. 자체 관리 Grafana와 Grafana Cloud에는 서비스 계정 토큰을 권장
프로비저닝용 서비스 계정 토큰 만들기
서비스 계정은 세밀한 권한을 지원해 RBAC 인프라 프로비저닝에 필요한 최소 권한으로 쉽게 인증할 수 있어요.
- CI 파이프라인용 새 서비스 계정 생성
- 서비스 계정에 권한 할당: "Role reader", "Role writer" 및 프로비저닝할 권한 포함 역할 필요. 예: 사용자 생성 가능한 역할을 만들·할당하려면 사용자 생성 권한 필요. 대안으로 "Admin" 기본 역할 할당 가능
- Terraform용 새 서비스 계정 토큰 생성
대안으로 기본 인증을 사용할 수도 있어요. 지원 인증 형식은 provider 인증 문서 참고.
Terraform provider 구성
RBAC 지원은 Grafana Terraform provider의 일부입니다. 소스 코드에 토큰을 두지 않도록 GRAFANA_URL·GRAFANA_AUTH 환경 변수로 자격 증명을 설정하세요.
terraform {
required_providers {
grafana = {
source = "grafana/grafana"
version = ">= 1.29.0"
}
}
}
# Reads credentials from the GRAFANA_URL and GRAFANA_AUTH environment variables
provider "grafana" {}
Terraform 실행 전 환경 변수 내보내기:
export GRAFANA_URL="<GRAFANA_URL>"
export GRAFANA_AUTH="<SERVICE_ACCOUNT_TOKEN>"
<GRAFANA_URL>: Grafana 인스턴스 베이스 URL(예: Grafana Cloudhttps://<YOUR_STACK_NAME>.grafana.net, 로컬http://localhost:3000)<SERVICE_ACCOUNT_TOKEN>: 프로비저닝할 역할·할당을 관리할 권한이 있는 토큰(예:glsa_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx)
provider 블록에서 url·auth 속성을 직접 설정할 수도 있어요.
기본 역할 프로비저닝
기본 역할(None, Viewer, Editor, Admin, Grafana Admin)은 사용자·서비스 계정의 조직 역할에 해당합니다. 기본 역할의 권한은 조직 역할에서 파생되므로, RBAC 역할 할당을 만들지 않고 조직 역할을 설정해 기본 역할을 관리해요. grafana_role_assignment 리소스는 fixed·custom 역할만 할당합니다.
참고:
grafana_role_assignment로basic_admin같은 기본 역할을 할당하면this endpoint cannot be used to assign basic, managed or external services roles오류가 발생해요.
서비스 계정 조직 역할 설정: grafana_service_account 리소스의 role 속성 설정:
resource "grafana_service_account" "admin_sa" {
name = "terraform_admin_sa"
role = "Admin"
}
사용자 조직 역할 설정:
- 자체 관리 Grafana: grafana_organization 리소스로 조직 역할별 멤버 관리(기본 인증 필요, 권위적으로 조직 멤버십 관리):
resource "grafana_organization" "org" {
name = "my_org"
admins = ["[email protected]"]
editors = ["[email protected]"]
viewers = ["[email protected]"]
}
- Grafana Cloud:
grafana_organization을 지원하지 않으며 개별 사용자 조직 역할을 설정하는 Terraform 리소스가 없어요.PATCH /api/org/users/{user_id}Organization HTTP API로 관리하거나 SCIM/SAML/OIDC 역할 매핑으로 관리하세요.
팀에 fixed·custom 역할 할당:
resource "grafana_team" "writers_team" {
name = "terraform_writers_team"
}
# Assign a fixed role to a team
resource "grafana_role_assignment" "writers_team_fixed_role" {
role_uid = "fixed:dashboards:writer"
teams = [grafana_team.writers_team.id]
}
커스텀 역할 프로비저닝
resource "grafana_role" "my_new_role" {
name = "custom:users:manager"
description = "Manage organization users and teams"
uid = "customusersmanager"
version = 1
global = false
# Manage organization users
permissions {
action = "org.users:read"
scope = "users:*"
}
permissions {
action = "org.users:add"
scope = "users:*"
}
permissions {
action = "org.users:write"
scope = "users:*"
}
# Manage teams
permissions {
action = "teams:create"
}
permissions {
action = "teams:read"
scope = "teams:*"
}
permissions {
action = "teams:write"
scope = "teams:*"
}
}
커스텀 역할에 부여할 수 있는 액션·스코프 참조는 RBAC 액션과 스코프를 참고하세요. terraform apply 실행 후 Grafana UI에서 역할 선택기에 새 역할이 나타나는지 확인하세요.
역할 할당 프로비저닝
팀·사용자·서비스 계정을 프로비저닝하고 커스텀 역할을 할당하는 예시:
resource "grafana_team" "test_team" {
name = "terraform_test_team"
}
resource "grafana_user" "test_user" {
email = "[email protected]"
login = "terraform_test_user"
password = <TEST_PASSWORD>
}
resource "grafana_service_account" "test_sa" {
name = "terraform_test_sa"
role = "Viewer"
}
resource "grafana_role_assignment" "my_new_role_assignment" {
role_uid = grafana_role.my_new_role.uid
users = [grafana_user.test_user.id]
teams = [grafana_team.test_team.id]
service_accounts = [grafana_service_account.test_sa.id]
}
<TEST_PASSWORD>를 테스트 사용자 비밀번호로 치환하고 terraform apply를 실행하세요. 프로비저닝된 역할 대신 기존 fixed·custom 역할의 uid를 조회해 사용할 수도 있는데, 역할 나열 API로 조회할 수 있어요. 마찬가지로 사용자·팀·서비스 계정의 id도 조회해 사용할 수 있습니다.