데이터세트에 대한 액세스 제어

이 문서에서는 BigQuery에서 데이터세트에 대한 액세스를 제어하는 방법을 설명합니다.

datasets.insert API 메소드를 호출하여 데이터세트를 만드는 동안에 액세스 제어를 적용할 수 있습니다.

GCP Console, 기본 BigQuery 웹 UI 또는 명령줄 도구를 사용하여 데이터세트를 만드는 동안에는 액세스 제어를 적용할 수 없습니다.

데이터세트가 생성된 후에 다음 방법으로 데이터세트에 액세스 제어를 적용할 수 있습니다.

  • 기본 BigQuery 웹 UI 사용

    • 현재 GCP Console을 사용하여 액세스 제어를 할당할 수 없습니다.
  • bq update CLI 명령어 사용

  • datasets.patch API 메소드 호출

개요

프로젝트 수준의 IAM 역할 및 데이터세트 수준의 액세스 제어를 사용하여 BigQuery 테이블 및 보기에 대한 액세스 권한을 공유할 수 있습니다. 현재는 테이블 또는 보기에 직접 액세스 제어를 적용할 수 없습니다.

프로젝트 수준의 액세스 제어는 프로젝트 내에서 모든 데이터세트, 테이블, 보기, 테이블 데이터에 액세스할 수 있는 사용자, 그룹, 서비스 계정을 결정합니다. 데이터세트 수준의 액세스 제어는 특정 데이터세트에 있는 테이블, 보기, 테이블 데이터에 액세스할 수 있는 사용자, 그룹, 서비스 계정을 결정합니다.

예를 들어 프로젝트 수준에서 특정 사용자에게 bigquery.dataOwner 역할을 할당하면, 사용자가 모든 프로젝트 데이터세트에서 테이블 및 보기를 만들고, 업데이트하고, 삭제할 수 있습니다. 데이터세트 수준에서 OWNER 역할을 할당하면, 사용자가 해당 데이터세트에서만 테이블 및 보기를 만들고, 업데이트하고, 삭제할 수 있습니다. 데이터세트 수준의 OWNER 기본 역할은 데이터세트에 bigquery.dataOwner 역할을 부여하는 것과 동일합니다.

프로젝트 수준에서 보다 제한적인 역할에 사용자 또는 그룹을 할당할 경우, 개별 데이터세트에 대한 액세스 권한을 부여해야 합니다. 예를 들어 프로젝트 수준에서 사용자 또는 그룹에 bigquery.user 역할을 부여하면, 사용자가 데이터세트를 만들고, 이러한 데이터세트에 있는 테이블에 쿼리 작업을 실행할 수 있습니다. 사용자가 자신이 만들지 않은 데이터세트의 테이블을 쿼리할 수 있도록 하려면 사용자가 쿼리해야 하는 데이터세트마다 적어도 데이터세트 수준의 READER 액세스 권한을 할당해야 합니다. 데이터세트 수준 READER 기본 역할은 데이터세트에 bigquery.dataViewer 역할 부여와 동일합니다.

사전 정의된 프로젝트 수준 IAM 역할과 데이터세트 수준 액세스 제어에 대한 자세한 내용은 액세스 제어를 참조하세요.

필수 권한

데이터세트 액세스 제어를 할당하거나 업데이트하려면 데이터세트 수준의 OWNER 액세스 권한을 가지고 있거나 bigquery.datasets.update 권한이 포함된 프로젝트 수준 IAM 역할을 할당받아야 합니다. 다음과 같은 사전 정의된 프로젝트 수준 IAM 역할에는 bigquery.datasets.update 권한이 포함되어 있습니다.

또한 bigquery.user 역할에는 bigquery.datasets.create 권한이 있으므로 bigquery.user 역할에 할당된 사용자는 만드는 모든 데이터세트를 업데이트할 수 있습니다. bigquery.user 역할이 할당된 사용자가 데이터세트를 만들면 이 사용자에게 데이터세트에 대한 OWNER 액세스 권한이 부여됩니다. 데이터세트에 대한 OWNER 액세스 권한은 사용자에게 전체 제어 권한을 부여합니다.

BigQuery의 IAM 역할 및 권한에 대한 자세한 내용은 액세스 제어를 참조하세요. 데이터세트 수준 역할에 대한 자세한 내용은 데이터세트의 기본 역할을 참조하세요.

데이터세트에 대한 액세스 제어

데이터세트에 액세스 제어를 할당하려면 다음 안내를 따르세요.

Console

  1. 리소스에서 데이터세트를 선택한 후 창 오른쪽에 있는 데이터세트 공유를 클릭합니다.

    데이터세트에 사용자 추가

  2. 데이터세트 공유 패널의 데이터세트 권한 탭에서 구성원 추가를 클릭합니다.

  3. 구성원 추가 패널에서 새 구성원 텍스트 상자에 추가할 사용자 또는 그룹의 이메일 주소를 입력합니다.

  4. 역할 선택에서 BigQuery를 선택하고 새 구성원에 적절한 사전 정의된 IAM 역할을 선택합니다. 사전 정의된 각 BigQuery 역할에 할당된 권한에 대한 자세한 내용은 액세스 제어 페이지의 역할 섹션을 참조하세요.

  5. 저장을 클릭한 후 완료를 클릭합니다.

기본 UI

  1. 데이터세트 오른쪽에 있는 드롭다운 화살표를 클릭하고 데이터세트 공유를 선택합니다.

  2. 데이터세트 공유 대화상자의 사용자 추가에서 필드 왼쪽에 있는 드롭다운을 클릭하고 적절한 옵션을 선택합니다. 기본 웹 UI를 사용하여 데이터세트에 액세스 제어를 적용하면 다음 사용자와 그룹에 액세스 권한을 부여할 수 있습니다.

    • 이메일별 사용자 - 개별 Google 계정에 데이터세트에 대한 액세스 권한을 부여합니다.
    • 이메일별 그룹 - Google 그룹의 모든 회원에게 데이터세트에 대한 액세스 권한을 부여합니다.
    • 도메인 - Google 도메인의 모든 사용자와 그룹에 데이터세트에 대한 액세스 권한을 부여합니다.
    • 모든 인증된 사용자 - 모든 Google 계정 소유자에게 데이터세트에 대한 액세스 권한을 부여합니다(데이터세트를 공개로 설정).
    • 프로젝트 소유자 - 모든 프로젝트 소유자에게 데이터세트에 대한 액세스 권한을 부여합니다.
    • 프로젝트 뷰어 - 모든 프로젝트 뷰어에게 데이터세트에 대한 액세스 권한을 부여합니다.
    • 프로젝트 편집자 - 모든 프로젝트 편집자에게 데이터세트에 대한 액세스 권한을 부여합니다.
    • 승인된 뷰 - 뷰에 데이터세트에 대한 액세스 권한을 부여합니다.

  3. 텍스트 상자에 값을 입력합니다. 예를 들어 이메일별 사용자 또는 이메일별 그룹을 선택한 경우 사용자 또는 그룹의 이메일 주소를 입력합니다.

  4. 사용자 추가 필드 오른쪽에서 보기 가능을 클릭하고 목록에서 적합한 역할을 선택합니다.

    데이터세트에 사용자 추가

    • '보기 가능'(READER)은 데이터세트에 대한 bigquery.dataViewer 액세스 권한을 부여합니다.
    • '수정 가능'(WRITER)은 데이터세트에 대한 bigquery.dataEditor 액세스 권한을 부여합니다.
    • '소유자임'(OWNER)은 데이터세트에 대한 bigquery.dataOwner 액세스 권한을 부여합니다.

      이러한 데이터세트 역할에 대한 자세한 내용은 데이터세트의 기본 역할을 참조하세요.

  5. 추가를 클릭한 후 변경사항 저장을 클릭합니다.

명령줄

  1. show 명령어를 사용하여 JSON 파일에 기존 데이터세트 정보(액세스 제어 포함)를 기록합니다. 데이터세트가 기본 프로젝트가 아닌 다른 프로젝트에 있는 경우, 데이터세트 이름에 프로젝트 ID를 추가합니다(형식: [PROJECT_ID]:[DATASET]).

    bq show --format=prettyjson [PROJECT_ID]:[DATASET] > [PATH_TO_FILE]
    

    각 항목의 의미는 다음과 같습니다.

    • [PROJECT_ID]는 프로젝트 ID입니다.
    • [DATASET]는 데이터세트 이름입니다.
    • [PATH_TO_FILE]은 로컬 머신의 JSON 파일 경로입니다.

      예:

      다음 명령어를 입력하면 mydataset에 대한 액세스 제어를 JSON 파일에 기록할 수 있습니다. mydataset는 사용자의 기본 프로젝트에 있습니다.

      bq show --format=prettyjson mydataset > /tmp/mydataset.json

      다음 명령어를 입력하면 mydataset에 대한 액세스 제어를 JSON 파일에 기록할 수 있습니다. mydatasetmyotherproject에 있습니다.

      bq show --format=prettyjson myotherproject:mydataset > /tmp/mydataset.json

  2. JSON 파일의 "access" 섹션을 변경합니다. specialGroup 항목(projectOwners, projectWriters, projectReaders, allAuthenticatedUsers)을 추가하거나 삭제할 수 있습니다. 또한 userByEmail, groupByEmail, domain을 추가, 삭제 또는 수정할 수 있습니다.

    예를 들어 데이터세트 JSON 파일의 액세스 섹션은 다음과 같을 수 있습니다.

    {
     "access": [
      {
       "role": "READER",
       "specialGroup": "projectReaders"
      },
      {
       "role": "WRITER",
       "specialGroup": "projectWriters"
      },
      {
       "role": "OWNER",
       "specialGroup": "projectOwners"
      },
      {
       "role": "READER",
       "specialGroup": "allAuthenticatedUsers"
      },
      {
       "role": "READER",
       "domain": "[DOMAIN_NAME]"
      },
      {
       "role": "WRITER",
       "userByEmail": "[USER_EMAIL]"
      },
      {
       "role": "READER",
       "groupByEmail": "[GROUP_EMAIL]"
      }
     ],
     ...
    }
    

  3. 편집이 완료되면 update 명령어를 사용하고 --source 플래그를 사용하여 JSON 파일을 포함시킵니다. 데이터세트가 기본 프로젝트가 아닌 다른 프로젝트에 있는 경우, 데이터세트 이름에 프로젝트 ID를 추가합니다(형식: [PROJECT_ID]:[DATASET]).

    bq update --source [PATH_TO_FILE] [PROJECT_ID]:[DATASET]
    

    각 항목의 의미는 다음과 같습니다.

    • [PATH_TO_FILE]은 로컬 머신의 JSON 파일 경로입니다.
    • [PROJECT_ID]는 프로젝트 ID입니다.
    • [DATASET]는 데이터세트 이름입니다.

      예:

      다음 명령어를 입력하면 mydataset에 대한 액세스 제어를 업데이트할 수 있습니다. mydataset는 기본 프로젝트에 있습니다.

      bq update --source /tmp/mydataset.json mydataset

      다음 명령어를 입력하면 mydataset에 대한 액세스 제어를 업데이트할 수 있습니다. mydatasetmyotherproject에 있습니다.

      bq update --source /tmp/mydataset.json myotherproject:mydataset

  4. 액세스 제어 변경사항을 확인하려면 파일에 정보를 기록하지 않고 show 명령어를 다시 입력합니다.

    bq show --format=prettyjson [DATASET]

    또는

    bq show --format=prettyjson [PROJECT_ID]:[DATASET]

API

정의된 데이터세트 리소스와 함께 datasets.insert를 호출하면 데이터세트가 생성될 때 액세스 제어를 적용할 수 있습니다. datasets.patch를 호출하고 데이터세트 리소스에서 access 속성을 사용하여 액세스 제어를 업데이트합니다.

datasets.update 메소드는 전체 데이터세트 리소스를 대체하므로 datasets.patch 메소드를 사용하여 액세스 제어를 업데이트하는 것이 좋습니다.

자세한 내용은 데이터세트를 참조하세요.

Go

데이터세트에 대한 액세스 제어를 사용해서 dataset.access_entries 속성을 설정합니다. 그런 다음 client.update_dataset() 함수를 호출하여 속성을 업데이트합니다.

// To run this sample, you will need to create (or reuse) a context and
// an instance of the bigquery client.  For example:
// import "cloud.google.com/go/bigquery"
// ctx := context.Background()
// client, err := bigquery.NewClient(ctx, "your-project-id")
ds := client.Dataset(datasetID)
meta, err := ds.Metadata(ctx)
if err != nil {
	return err
}
// Append a new access control entry to the existing access list.
update := bigquery.DatasetMetadataToUpdate{
	Access: append(meta.Access, &bigquery.AccessEntry{
		Role:       bigquery.ReaderRole,
		EntityType: bigquery.UserEmailEntity,
		Entity:     "sample.bigquery.dev@gmail.com"},
	),
}

// Leverage the ETag for the update to assert there's been no modifications to the
// dataset since the metadata was originally read.
if _, err := ds.Update(ctx, update, meta.ETag); err != nil {
	return err
}

Python

이 샘플을 시도해 보기 전에 BigQuery 빠른 시작: 클라이언트 라이브러리 사용의 Python 설정 안내를 따르세요. 자세한 내용은 BigQuery Python API 참조 문서를 확인하세요.

데이터세트에 대한 액세스 제어를 사용하여 dataset.access_entries 속성을 설정합니다. 그런 다음 client.update_dataset() 함수를 호출하여 속성을 업데이트합니다.
from google.cloud import bigquery

# TODO(developer): Construct a BigQuery client object.
# client = bigquery.Client()

# TODO(developer): Set dataset_id to the ID of the dataset to fetch.
# dataset_id = 'your-project.your_dataset'

dataset = client.get_dataset(dataset_id)

entry = bigquery.AccessEntry(
    role="READER",
    entity_type="userByEmail",
    entity_id="sample.bigquery.dev@gmail.com",
)

entries = list(dataset.access_entries)
entries.append(entry)
dataset.access_entries = entries

dataset = client.update_dataset(dataset, ["access_entries"])  # API request

full_dataset_id = "{}.{}".format(dataset.project, dataset.dataset_id)
print(
    "Updated dataset '{}' with modified user permissions.".format(full_dataset_id)
)

다음 단계

이 페이지가 도움이 되었나요? 평가를 부탁드립니다.

다음에 대한 의견 보내기...

도움이 필요하시나요? 지원 페이지를 방문하세요.