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

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

다음 작업을 수행할 수도 있습니다.

개요

데이터 세트 수준의 권한은 특정 데이터 세트에 있는 테이블, 뷰, 테이블 데이터에 액세스할 수 있는 사용자, 그룹, 서비스 계정을 결정합니다. 예를 들어 사용자에게 특정 데이터 세트에 대한 bigquery.dataOwner IAM 역할을 부여하면 사용자는 해당 데이터 세트에 있는 테이블과 뷰를 생성, 업데이트, 삭제할 수 있습니다.

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

Cloud Console 또는 bq 명령줄 도구에서 데이터 세트를 만드는 동안에는 액세스 제어를 적용할 수 없습니다.

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

  • Cloud Console 사용
  • bq 명령줄 도구에서 bq update 명령어 사용
  • datasets.patch API 메서드 호출
  • 클라이언트 라이브러리 사용

필수 권한

데이터세트 액세스 제어를 할당하거나 업데이트하려면 최소한 bigquery.datasets.updatebigquery.datasets.get 권한을 부여받아야 합니다.

Console에서 데이터 세트 액세스 제어를 할당하거나 업데이트하려면 bigquery.datasets.updatebigquery.datasets.get 권한 외에 bigquery.datasets.getIamPolicybigquery.datasets.setIamPolicy 권한도 필요합니다.

다음과 같은 사전 정의된 IAM 역할에는 bigquery.datasets.update, bigquery.datasets.get, bigquery.datasets.getIamPolicy, bigquery.datasets.setIamPolicy 권한이 포함되어 있습니다.

  • bigquery.dataOwner
  • bigquery.admin

또한 bigquery.datasets.create 권한이 있는 사용자는 데이터 세트를 만들 때 해당 데이터 세트에 대한 bigquery.dataOwner 액세스 권한을 부여받으며 데이터 세트의 권한을 자동으로 업데이트할 수 있는 기능이 포함됩니다.

BigQuery의 IAM 역할과 권한에 대한 자세한 내용은 사전 정의된 역할 및 권한을 참조하세요.

데이터 세트에 대한 액세스 권한 부여

데이터 세트에 대한 액세스 권한을 부여하려면 다음 안내를 따르세요.

Console

  1. 탐색기 패널에서 프로젝트를 확장하고 데이터 세트를 선택합니다.

  2. 세부정보 패널에서 데이터 세트 공유를 클릭합니다.

  3. 데이터 세트 공유 패널의 데이터 세트 권한 탭에서 구성원 추가 필드에 추가할 항목을 입력합니다. 다음 항목을 추가할 수 있습니다.

    • Google 계정 이메일: 개별 Google 계정에 데이터 세트에 대한 액세스 권한을 부여합니다.
    • Google 그룹: Google 그룹의 모든 구성원에게 데이터 세트에 대한 액세스 권한을 부여합니다.
    • Google 앱 도메인: Google 도메인의 모든 사용자와 그룹에 데이터 세트 액세스 권한을 부여합니다.
    • 서비스 계정: 서비스 계정에 데이터 세트에 대한 액세스 권한을 부여합니다.
    • 모든 사람: 일반 대중에게 액세스 권한을 부여하려면 allUsers를 입력합니다.
    • 모든 Google 계정: Google 계정에 로그인한 모든 사용자에게 액세스 권한을 부여하려면 allAuthenticatedUsers를 입력합니다.
  4. 역할 선택에서 BigQuery를 선택하고 새 구성원에게 적절한 사전 정의된 IAM 역할을 선택합니다. 사전 정의된 각 BigQuery 역할에 할당된 권한에 대한 자세한 내용은 액세스 제어 페이지의 역할 섹션을 참조하세요.

  5. 완료를 클릭합니다.

bq

  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를 호출하고 Dataset 리소스의 access 속성을 사용하여 액세스 제어를 업데이트합니다.

datasets.update 메서드는 전체 데이터세트 리소스를 바꾸기 때문에 datasets.patch를 사용하여 액세스 제어를 업데이트하는 것이 좋습니다.

Go

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

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

import (
	"context"
	"fmt"

	"cloud.google.com/go/bigquery"
)

// updateDatasetAccessControl demonstrates how the access control policy of a dataset
// can be amended by adding an additional entry corresponding to a specific user identity.
func updateDatasetAccessControl(projectID, datasetID string) error {
	// projectID := "my-project-id"
	// datasetID := "mydataset"
	ctx := context.Background()
	client, err := bigquery.NewClient(ctx, projectID)
	if err != nil {
		return fmt.Errorf("bigquery.NewClient: %v", err)
	}
	defer client.Close()

	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
	}
	return nil
}

자바

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

import com.google.cloud.bigquery.Acl;
import com.google.cloud.bigquery.Acl.Role;
import com.google.cloud.bigquery.Acl.User;
import com.google.cloud.bigquery.BigQuery;
import com.google.cloud.bigquery.BigQueryException;
import com.google.cloud.bigquery.BigQueryOptions;
import com.google.cloud.bigquery.Dataset;
import java.util.ArrayList;

public class UpdateDatasetAccess {

  public static void main(String[] args) {
    // TODO(developer): Replace these variables before running the sample.
    String datasetName = "MY_DATASET_NAME";
    // Create a new ACL granting the READER role to "sample.bigquery.dev@gmail.com"
    // For more information on the types of ACLs available see:
    // https://cloud.google.com/storage/docs/access-control/lists
    Acl newEntry = Acl.of(new User("sample.bigquery.dev@gmail.com"), Role.READER);

    updateDatasetAccess(datasetName, newEntry);
  }

  public static void updateDatasetAccess(String datasetName, Acl newEntry) {
    try {
      // Initialize client that will be used to send requests. This client only needs to be created
      // once, and can be reused for multiple requests.
      BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();

      Dataset dataset = bigquery.getDataset(datasetName);

      // Get a copy of the ACLs list from the dataset and append the new entry
      ArrayList<Acl> acls = new ArrayList<>(dataset.getAcl());
      acls.add(newEntry);

      bigquery.update(dataset.toBuilder().setAcl(acls).build());
      System.out.println("Dataset Access Control updated successfully");
    } catch (BigQueryException e) {
      System.out.println("Dataset Access control was not updated \n" + e.toString());
    }
  }
}

Python

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

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

# 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)  # Make an API request.

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"])  # Make an API request.

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

데이터 세트에 대한 액세스 권한 취소

데이터 세트에 대한 액세스 권한을 취소하려면 다음 안내를 따르세요.

Console

  1. 탐색기 패널에서 프로젝트를 확장하고 데이터 세트를 선택합니다.

  2. 세부정보 패널에서 데이터 세트 공유를 클릭합니다.

  3. 데이터 세트 공유 패널의 데이터 세트 권한 탭에서 멤버십을 변경할 역할을 펼칩니다.

  4. 삭제할 사용자 계정에서 삭제를 클릭합니다.

  5. 구성원을 삭제하시겠어요? 대화상자에서 삭제를 클릭합니다.

  6. 완료를 클릭합니다.

bq

  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.patch를 호출하고 Dataset 리소스의 access 속성을 사용하여 액세스 제어를 업데이트합니다.

datasets.update 메서드는 전체 데이터세트 리소스를 바꾸기 때문에 datasets.patch를 사용하여 액세스 제어를 업데이트하는 것이 좋습니다.

다음 단계