🍵

承認済みデータセットを使ったBigQueryデータセットのアクセス制限

2025/02/01に公開

これはなに?

データ基盤でアクセス制御を実装するにあたり、承認済みデータセットを使ったので、その方法をまとめておく。

背景・課題

弊社のデータ基盤では4つのスキーマを構成しています。

  • raw:ローデータ(セキュアな情報も含む)
  • staging:データの前処理層
  • warehouse:中間テーブル
  • mart:ユーザー向けに整理されたデータマート

特にrawスキーマにはセンシティブな情報が含まれるため、エンドユーザーに直接見せることができません。しかし、分析やレポートに使用するビューはローデータに依存している場合が多く、rawデータそのものではなく、そこから生成されるビューにはアクセスできるようにしたいというニーズがあります。

そのため、ローデータ自体にアクセス権限を与えず、下流のビューにはクエリを実行できるようにするために、承認済みデータセットの機能を活用しました。

※前提データ量がまだそこまで多くなく、フルスキャンしても大したコストにならないということで上記のような実装にしている。

承認済みデータセットとは?

承認済みデータセットとは、Google BigQueryの機能の一つで、特定のデータセットに直接アクセスさせず、そのデータセットを参照するビューや他のデータセットに対してのみアクセスを許可するための仕組みです。これにより、セキュアなデータの直接の漏洩を防ぎつつ、必要な分析データを提供することが可能になります。

https://cloud.google.com/bigquery/docs/authorized-datasets?hl=ja

なにをしたか

Terraformを使ってBigQueryのデータセットとアクセス制御の設定を行いました。以下にその具体的な設定内容を示します。

environments/production/main.tf
# ローデータを格納するデータセット
module "bigquery_raw_datasets" {
  source   = "../../modules/bigquery"
  for_each = toset(var.raw_dataset_ids)

  project_id = var.project_id
  dataset_id = each.key
  location   = var.location
  access     = []
  authorized_datasets = [
    for ds in local.authorized_dataset_ids : {
      project_id = var.project_id
      dataset_id = ds
    }
  ]
}

# データ分析用のデータセット
# 企画者に対してデータ分析用データセットの閲覧権限を付与。
module "bigquery_analysis_datasets" {
  source   = "../../modules/bigquery"
  for_each = toset(var.analysis_dataset_ids)

  project_id = var.project_id
  dataset_id = each.key
  location   = var.location

  access = [
    {
      role           = "roles/bigquery.dataViewer"
      group_by_email = var.business_user_group
    }
  ]
  authorized_datasets = []
}
modules/bigquery/main.tf
resource "google_bigquery_dataset" "dataset" {
  dataset_id                 = var.dataset_id
  project                    = var.project_id
  location                   = var.location
}

resource "google_bigquery_dataset_access" "access" {
  for_each = {
    for acc in var.access :
    "${google_bigquery_dataset.dataset.dataset_id}-${coalesce(acc.group_by_email, acc.user_by_email)}-${acc.role}" => acc
  }

  dataset_id     = google_bigquery_dataset.dataset.dataset_id
  role           = each.value.role
  group_by_email = each.value.group_by_email != "" ? each.value.group_by_email : null
  user_by_email  = each.value.user_by_email != "" ? each.value.user_by_email : null
}

resource "google_bigquery_dataset_access" "authorized_dataset_access" {
  for_each = {
    for ds in var.authorized_datasets :
    "${google_bigquery_dataset.dataset.dataset_id}-${ds.project_id}-${ds.dataset_id}" => ds
  }

  dataset_id = google_bigquery_dataset.dataset.dataset_id

  dataset {
    dataset {
      project_id = each.value.project_id
      dataset_id = each.value.dataset_id
    }
    target_types = ["VIEWS"]
  }
}

これにより、ローデータにアクセス権を持たせることなく、stagingやwarehouse、martスキーマにあるビューに対してクエリを実行することが可能になりました。

まとめ

承認済みデータセットを活用することで、セキュアなデータを直接公開せずに、分析やレポートに必要なビューには柔軟にアクセス権を付与することができました。Terraformを使った自動化により、アクセス制御の一貫性も保ちながら、必要に応じた設定変更も容易に行えます。

今後データ量が増えて、stagingや中間テーブルもすべて物理テーブル化したら、タグベースのIAM管理するなどに移行しそう。

https://cloud.google.com/bigquery/docs/tags?hl=ja

Discussion