grants 리소스 구성

grants 리소스 구성 (Resource configs: grants)

이 문서는 dbt의 grants 리소스 구성을 설명해요. dbt로 만들고 있는 데이터셋에 대한 접근 권한을 모델, 시드, 스냅샷 수준에서 어떻게 부여(및 회수)하는지 강사 목소리로 살펴볼게요. 권한(privilege)과 수혜자(grantee)의 개념, 구성 구문, 상속과 병합 동작, 조건부 grants, 그리고 데이터베이스별 요구사항까지 차근차근 익힐 수 있습니다.

출처: 문서

본문

grants를 사용해 dbt로 만들고 있는 데이터셋에 대한 접근을 관리할 수 있어요. 이 권한을 구현하려면 각 모델, 시드 또는 스냅샷에 리소스 구성으로 grants를 정의하세요. 프로젝트 전체에 적용할 기본 grants는 dbt_project.yml에, 모델별 grants는 각 모델의 SQL 또는 YAML 속성 파일에 정의합니다.

grant 리소스 구성은 빌드 시점에 특정 수혜자 집합과 모델, 시드, 스냅샷에 권한을 적용할 수 있게 해줍니다. 모델, 시드 또는 스냅샷이 빌드를 마치면 dbt는 그 뷰나 테이블의 grants가 구성한 grants와 정확히 일치하는지 확인합니다.

dbt는 grants를 업데이트할 때 가장 효율적인 방식을 사용하는 것을 목표로 하며, 이는 사용 중인 어댑터와 dbt가 이미 존재하는 객체를 교체하는지 업데이트하는지에 따라 달라집니다. dbt가 실행하는 전체 grant 및 revoke 문 집합은 항상 디버그 로그에서 확인할 수 있어요.

가능하면 grants를 리소스 구성으로 정의해야 하지만, 때로는 grants 문을 수동으로 작성해 hooks로 실행해야 할 수도 있습니다. 예를 들어 hooks가 적합한 경우는 다음과 같습니다.

  • 뷰와 테이블 외의 다른 데이터베이스 객체에 grants를 적용하려는 경우
  • 더 세밀한 행·컬럼 수준 접근을 만들거나, 마스킹 정책을 사용하거나, future grants를 적용하려는 경우
  • dbt가 리소스 구성으로 기본 지원하지 않는 데이터 플랫폼의 더 고급 권한 기능을 활용하려는 경우
  • 내장 grants 기능이 제공하는 것 이상으로 더 복잡하거나 커스텀한 방식으로 grants를 적용하려는 경우

hooks에 대한 자세한 내용은 Hooks & operations를 참고하세요.

정의

grants 필드를 사용해 리소스에 대한 권한 또는 grants를 설정할 수 있어요. 모델을 run하거나 시드 데이터를 seed하거나 데이터셋을 snapshot할 때, dbt는 데이터베이스 객체의 권한이 리소스에 구성한 grants와 일치하도록 grant 및/또는 revoke 문을 실행합니다.

다른 모든 구성과 마찬가지로 grantsthe manifest artifact를 포함한 dbt 프로젝트 메타데이터에 포함됩니다.

공통 구문

Grants는 두 가지 핵심 구성 요소를 가집니다.

  • 권한(Privilege): 테이블에서 데이터를 선택하는 것처럼 데이터베이스의 객체에 대해 특정 작업 또는 작업 집합을 수행할 권리.
  • 수혜자(Grantees): 부여된 권리를 받는 한 명 이상의 수혜자. 일부 플랫폼에서는 이를 "주체(principals)"라고도 부릅니다. 예를 들어 수혜자는 사용자, 사용자 그룹, 한 명 이상의 사용자가 보유한 역할(Snowflake), 또는 서비스 계정(BigQuery/GCP)일 수 있습니다.

grants 구성하기

grantsdbt_project.yml에 구성해 많은 리소스에 한 번에 적용할 수 있어요 — 프로젝트의 모든 모델, 패키지, 하위 폴더 — 그리고 특정 리소스에 대해 YAML config: 블록이나 해당 .sql 파일 안에서 하나씩 구성할 수도 있습니다.

모델

models/schema.yml:

models:
  - name: specific_model
    config:
      grants:
        select: ['reporter', 'bi']

grants 구성은 다음에도 정의할 수 있습니다.

  • 프로젝트 파일(dbt_project.yml)의 models 구성 아래
  • 모델 SQL 파일 내의 config() Jinja 매크로

자세한 내용은 configs and properties를 참고하세요.

시드

seeds/schema.yml:

seeds:
  - name: seed_name
    config:
      grants:
        select: ['reporter', 'bi']

grants 구성은 프로젝트 파일(dbt_project.yml)의 seeds 구성 아래에도 정의할 수 있습니다. 자세한 내용은 configs and properties를 참고하세요.

스냅샷

snapshots/schema.yml:

snapshots:
  - name: snapshot_name
    config:  
      grants:
        select: ['reporter', 'bi']

grants 구성은 다음에 정의할 수 있습니다.

  • 속성 파일(snapshots/schema.yml)의 snapshots 구성 아래
  • 프로젝트 파일(dbt_project.yml)의 snapshots 구성 아래
  • 스냅샷의 SQL 파일 config() Jinja 매크로에서

자세한 내용은 configs and properties를 참고하세요.

grant 구성 상속

같은 모델에 대해 여러 곳(예: dbt_project.yml과 더 구체적인 .sql 또는 .yml 파일)에서 grants를 설정하면, dbt의 기본 동작은 덜 구체적인 수혜자 집합을 더 구체적인 수혜자 집합으로 교체하는 것입니다. 이 "병합 후 덮어쓰기(merge and clobber)" 동작은 dbt가 프로젝트를 파싱할 때 각 권한을 업데이트합니다.

예를 들어: dbt_project.yml:

models:
  +grants:  # 이 경우 +는 선택이 아닙니다. 프로젝트가 파싱되려면 반드시 포함해야 합니다.
    select: ['user_a', 'user_b']

models/specific_model.sql:

{{ config(grants = {'select': ['user_c']}) }}

이 구성의 결과로 specific_modelselect 권한을 user_c에게 부여하도록 구성됩니다. specific_model을 실행하면 그것이 데이터베이스에서 보게 되는 유일한 부여된 권한이며, dbt 로그에서 찾을 수 있는 유일한 grant 문입니다.

user_cspecific_model에 대한 select 권한을 받는 기존 수혜자 목록에 추가하려면(전체 목록을 교체하는 대신), 권한 이름 앞에 +("addition") 기호를 붙여 사용할 수 있어요.

models/specific_model.sql:

{{ config(grants = {'+select': ['user_c']}) }}

이제 모델은 user_a, user_b, 그리고 user_c에게 select를 부여합니다!

참고 사항:

  • 이는 + 접두사가 포함된 권한에만 적용됩니다. 각 권한은 그 동작을 별도로 제어합니다. select 외에 다른 권한을 부여하고 그 권한 이름에 + 접두사가 없다면, 계속 새 수혜자를 "추가"하지 않고 "덮어쓰기(clobber)"합니다.
  • 덮어쓰기 vs. 추가 병합 동작을 제어하는 +의 이 사용은 사전 값을 가진 config를 정의하기 위해 dbt_project.yml에서 +를 사용하는 것(위 예시 참고)과 구별됩니다. 자세한 내용은 the plus prefix를 참고하세요.
  • grants는 config 병합 동작을 제어하는 + 접두사를 지원하는 첫 번째 config입니다. 현재는 유일합니다. 유용하다고 판단되면 향후 새 config와 기존 config에 이 기능을 확장할 수도 있습니다.

조건부 grants

다른 config와 마찬가지로 Jinja를 사용해 서로 다른 컨텍스트에서 grants를 다르게 할 수 있어요. 예를 들어 prod와 dev에서 다른 권한을 부여할 수 있습니다.

dbt_project.yml:

models:
  +grants:
    select: "{{ ['user_a', 'user_b'] if target.name == 'prod' else ['user_c'] }}"

grants 회수하기

dbt는 grants 구성이 해당 노드에 연결되어 있을 때만 노드의 grants(회수 포함)를 수정합니다. 예를 들어 원래 dbt_project.yml에 다음 grants를 지정했다고 생각해 보세요.

dbt_project.yml:

models:
  +grants:
    select: ['user_a', 'user_b']

전체 +grants 섹션을 삭제하면 dbt는 더 이상 grants를 관리하기를 원하지 않는 것으로 간주하고 아무것도 변경하지 않습니다. dbt가 노드의 모든 기존 grants를 회수하도록 하려면 빈 수혜자 목록을 제공하세요.

  • 한 사용자에게서 회수:
models:
  +grants:
    select: ['user_b']
  • 모든 사용자에게서 회수:
models:
  +grants:
    select: []
  • dbt가 grants를 관리하지 않도록 중지:
models:
  # 이 섹션은 의도적으로 비워 둠

일반 예시

각 권한을 단일 수혜자 또는 여러 수혜자 집합에 부여할 수 있어요. 이 예시에서는 select를 이 모델에서 bi_user에게만 부여해 비즈니스 인텔리전스(BI) 도구에서 조회할 수 있게 합니다.

models/table_model.sql:

{{ config(materialized = 'table', grants = {
    'select': 'bi_user'
}) }}

dbt가 이 모델을 처음 실행하면 테이블을 만든 다음 다음과 같은 코드를 실행합니다.

grant select on schema_name.table_model to bi_user;

이 경우 점진적 모델을 만들고 select 권한을 bi_userreporter 두 수혜자에게 부여합니다.

models/incremental_model.sql:

{{ config(materialized = 'incremental', grants = {
    'select': ['bi_user', 'reporter']
}) }}

dbt가 이 모델을 처음 실행하면 테이블을 만든 다음 다음과 같은 코드를 실행합니다.

grant select on schema_name.incremental_model to bi_user, reporter;

이후 실행에서는 dbt가 데이터베이스별 SQL을 사용해 incremental_model에 이미 있는 grants를 보여주고, 필요한 revoke 또는 grant 문이 있는지 결정합니다.

데이터베이스별 요구사항과 참고 사항

서로 다른 기능을 설명하기 위해 사용하는 용어를 표준화하려 하지만, 서로 다른 데이터베이스에는 항상 미묘한 차이가 있습니다. 이 절에서는 그런 데이터베이스별 요구사항과 참고 사항 중 일부를 설명합니다.

위와 아래 예시에서 select라는 권한과 another_user라는 수혜자를 언급하는 것을 볼 수 있어요. 많은 데이터베이스가 이 용어 또는 유사한 용어를 사용합니다. 데이터베이스가 권한과 수혜자에 대해 다른 구문을 요구할 수 있다는 점을 인지하세요. dbt에서 grants를 둘 다에 적절한 이름으로 구성해야 합니다.

BigQuery

BigQuery에서는 "privileges"가 "roles"라고 불리며 roles/service.roleName 형식을 취합니다. 예를 들어 모델에서 select를 부여하는 대신 roles/bigquery.dataViewer를 부여합니다. 수혜자는 사용자, 그룹, 서비스 계정, 도메인이 될 수 있으며, 각각 접두사로 명확히 표시해야 합니다. 예를 들어 모델에 대한 접근을 [email protected]에게 부여하려면 user:[email protected]으로 지정해야 합니다. 더 많은 맥락은 Google 문서를 읽어 보세요.

참고: grants 구성과 grant_access_to 구성은 서로 다릅니다.

  • grant_access_to: 승인된 뷰를 설정할 수 있게 해줍니다. 구성되면 dbt는 다른 데이터셋의 일부 정보를 보여줄 수 있는 승인된 뷰 접근을 제공하되, 최종 사용자에게 그 기본 데이터셋 전체 접근은 부여하지 않습니다. 자세한 내용은 "BigQuery configurations: Authorized views"를 참고하세요.
  • grants: dbt로 만들고 있는 데이터셋에 대한 접근을 관리하기 위해 사용자, 그룹 또는 서비스 계정에 특정 권한을 제공합니다. 자세한 내용은 "Resource configs: grants"를 참고하세요.
  • 두 기능을 함께 사용할 수 있어요: grants_access_to 구성으로 뷰 모델을 "승인(authorize)"하고 그 뷰 모델에 grants를 추가해 조회 결과(그리고 오직 조회 결과만)를 다른 사용자, 그룹 또는 서비스 계정과 공유할 수 있습니다.

BigQuery 예시:

SQL과 BigQuery로 권한 부여:

{{ config(grants = {'roles/bigquery.dataViewer': ['user:[email protected]']}) }}

BigQuery로 모델 스키마에서 권한 부여 (models/schema.yml):

models:
  - name: specific_model
    config:
      grants:
        roles/bigquery.dataViewer: ['user:[email protected]']

Databricks

Redshift

Redshift는 사용자, 그룹, 역할에 부여를 지원합니다. 그룹이나 역할에 부여하려면 수혜자 이름에 group: 또는 role: 접두사를 사용하세요. 접두사가 없는 이름은 사용자로 취급됩니다.

models:
  +grants:
    select: ["user1", "user:user2", "group:analysts", "role:reporter"]

Snowflake

더 알아보기 (Learn more)

grants는 dbt 리소스 구성 중 권한 관리를 담당하는 핵심 기능이에요. hooks와 operations, plus prefix(+)를 통한 config 병합, 그리고 각 어댑터(BigQuery, Snowflake, Redshift, Databricks)의 grants 지원 차이를 함께 학습하면 멀티 어댑터 환경에서도 일관된 접근 제어를 설계할 수 있습니다.