😎

BigQuery データセット IAM ロールを管理を楽にする Terraform Module を作りました

2024/06/29に公開

概要

Google Cloud の BigQuery は、大規模なデータ分析を行うための強力なツールです。
しかし、複雑な IAM ポリシーを管理するのは骨の折れる作業です。
Terraform を使うことでコードとして管理することができますが、プロジェクトを新しく立ち上げるたびに設定し直すのが地味に面倒です。

そこで BigQuery データセットに対して IAM ロールを比較的簡単に管理できる Terraform モジュールを作ったので紹介します。
このモジュールを使い回すことで複数データセットに対して IAM メンバーを追加できます。

bigquery-dataset-member の紹介

https://registry.terraform.io/modules/hiracky16/bigquery-dataset-member/google/latest

この module では BigQuery データセットに対する IAM ロールを包括的に管理することができます。

複数のデータセットに対して複数の IAM ロールとメンバーを一括で設定できます。
ロールは 3 種類で、roles/bigquery.dataViewer, roles/bigquery.dataEditor, roles/bigquery.dataOwner のどれかです。

また書くデータセットに指定されたメンバーにはデフォルトでプロジェクトに対する roles/bigquery.user が付与されるため、BigQuery をすぐに実行できる状態になります。

使用例

入力には Google Cloud のプロジェクト名とデータセットとそれに対するメンバーを json リストで記述します。
ロールには上記で紹介した 3 つ以外が入力されると validation で落とす仕組みになっています。
memberuser: などから始まっていないと plan で失敗します。)

module "bigquery_dataset_member" {
  source  = "hiracky16/bigquery-dataset-member/google"
  project = "projectA"
  datasets = [
    {
      id : "datasetA",
      members : [
        {
          member : "user:user-test@gmail.com",
          role : "roles/bigquery.dataEditor"
        },
        {
          member : "group:group-test@gmail.com",
          role : "roles/bigquery.dataOwner"
        }
      ]
    },
    {
      id : "datasetB",
      members : [
        {
          member : "serviceAccount:sa-test@projectA.iam.gserviceaccount.com",
          role : "roles/bigquery.dataViewer"
        }
      ]
    }
  ]
}

地味に Terraform で二重ループを実現させるのが難しかったです。
モジュールの入力にあった datasets(データセット x メンバー、ロールとなっているリスト)を flatten してループを回しました。
イメージこんな感じです。

locals {
  flatten_dataset_members = flatten([
    for dataset in var.datasets : [
      for member in dataset.members : {
        dataset_id : dataset.id,
        member : member.member,
        role : member.role
      }
    ]
  ])
}

resource "google_bigquery_dataset_iam_member" "bigquery_dataset_members" {
  for_each   = { for d in local.flatten_dataset_members : "${d.dataset_id}-${d.member}-${d.role}" => d }
  dataset_id = data.google_bigquery_dataset.datasets[each.value.dataset_id].dataset_id
  role       = each.value.role
  member     = each.value.member
}

まとめ

このモジュールを使うことで、データセットに対するメンバーを json のリストで管理することができ、個人的に視認性に優れていると考えています。
データ基盤管理者からするとひと目で誰がどのデータセットに対してアクセスできるのか確認できることは重要です。

さらに詳しい情報や最新のバージョンについては GitHub リポジトリでも参照することができます。
コメントやフィードバックをお待ちしています!

https://github.com/hiracky16/terraform-google-bigquery-dataset-member

Discussion