はじめに BigQueryは完全マネージドな、ペタバイトスケールかつコスパのよいデータウェアハウスとして知られております。そのため、ほぼリアルタイムで膨大な量のデータを解析することを可能としております。
便利なツールである一方、BigQueryで取り扱うデータには個人情報が含まれていることもあり、適切なアクセス制御が望まれます。 本記事では、Resource Managerのタグ機能を利用して、Terraformによるアクセス制御の実装を紹介したいと思います。
Resource Managerのタグとは Google Cloudのリソースに対して、key-valueペアでタグを付与してIAMの条件に含めることができる機能です。
例えばBigQueryのデータセットであれば、Key:environment
に対してValue:dev
, stg
, prd
を用意したり、Key:dataset_type
に対してValue:non-pii
, pii
(個人情報を含むか否か)を用意したりなど、データの種類に応じてタグを付与して、より詳細な条件でIAMを管理できます。
タグの作成と管理 - Google Cloud
KeyとValueを作ってみる 早速Terraformを書いていきます。
タグはOrganization配下での管理となります。まずはKeyを作ります。
tags_tag_key.tf resource "google_tags_tag_key" "env_key" { parent = "organizations/${local.organization.id} " short_name = "environment" description = "Environment key" }
このKeyに対してValueを作ります。
tags_tag_value.tf resource "google_tags_tag_value" "dev_tag" { parent = "tagKeys/${google_tags_tag_key.env_key.name} " short_name = "dev" description = "Development tag" } resource "google_tags_tag_value" "stg_tag" { parent = "tagKeys/${google_tags_tag_key.env_key.name} " short_name = "stg" description = "Staging tag" } resource "google_tags_tag_value" "prd_tag" { parent = "tagKeys/${google_tags_tag_key.env_key.name} " short_name = "prd" description = "Production tag" }
適用後、コンソールを見てみましょう。
environment
に対して、dev
, stg
, prd
というkey-valueペアが生成されました。
BigQueryのDatasetにタグを付与する 今回生成したタグをBigQueryのDatasetに付与していきましょう。 まずは以下のデータセットを用意します。
bigquery.tf resource "google_bigquery_dataset" "dataset_dev" { project = google_project.project.project_id dataset_id = "dataset_dev" location = "asia-northeast1" } resource "google_bigquery_dataset" "dataset_stg" { project = google_project.project.project_id dataset_id = "dataset_stg" location = "asia-northeast1" } resource "google_bigquery_dataset" "dataset_prd" { project = google_project.project.project_id dataset_id = "dataset_prd" location = "asia-northeast1" }
データセットへタグを付与する方法ですが、
Terraform
gcloudコマンド
Google Cloudコンソール
の3つの方法が存在します。
Terraformでは、google_tags_location_tag_binding
を利用してタグを付与します。 ※本リソースは、現時点(2023/10/15)ではGoogle Betaとなっております。
Terraform公式 - google_tags_location_tag_binding
tags_location_tag_binding.tf data "google_tags_tag_key" "env_key" { parent = "organizations/${local.organization.id} " short_name = "environment" } data "google_tags_tag_value" "dev_tag" { parent = "tagKeys/${data.google_tags_tag_key.env_key.name} " short_name = "dev" } data "google_tags_tag_value" "stg_tag" { parent = "tagKeys/${data.google_tags_tag_key.env_key.name} " short_name = "stg" } data "google_tags_tag_value" "prd_tag" { parent = "tagKeys/${data.google_tags_tag_key.env_key.name} " short_name = "prd" } resource "google_tags_location_tag_binding" "dev" { provider = google-beta parent = "//bigquery.googleapis.com/projects/${google_project.project_one.project_id} /datasets/${google_bigquery_dataset.dataset_dev.dataset_id} " tag_value = data.google_tags_tag_value.dev_tag.id location = "asia-northeast1" } resource "google_tags_location_tag_binding" "stg" { provider = google-beta parent = "//bigquery.googleapis.com/projects/${google_project.project_one.project_id} /datasets/${google_bigquery_dataset.dataset_stg.dataset_id} " tag_value = data.google_tags_tag_value.stg_tag.id location = "asia-northeast1" } resource "google_tags_location_tag_binding" "prd" { provider = google-beta parent = "//bigquery.googleapis.com/projects/${google_project.project_one.project_id} /datasets/${google_bigquery_dataset.dataset_prd.dataset_id} " tag_value = data.google_tags_tag_value.prd_tag.id location = "asia-northeast1" }
gcloudコマンドでタグを付与する 以下のコマンドで付与できます。
terminal gcloud alpha resource-manager tags bindings create \ --tag-value=<ORGANIZATION_ID>/environment/dev \ --parent=//bigquery.googleapis.com/projects/my_project/datasets/dataset_dev \ --location=asia-northeast1
権限が不足している場合は、Organizationにて以下の権限が必要になります。
roles/resourcemanager.tagUser
コンソールでタグを付与する BigQueryのページから、データセットをクリックすると以下のようなデータセット情報が表示されます。 この画面から詳細を編集に移動して下さい。
タグを追加を押すことで、所望のタグを付与できます。
付与されたタグは「タグ」の箇所に記載されるようになります。
IAMを付与する データセットにタグも付与できたので、最後にIAMを付与しましょう。 IAM条件も記載し、dev
タグが一致するデータセットのみを閲覧許可します。
project_iam_member.tf resource "google_project_iam_member" "test_user" { project = google_project.project.project_id role = "roles/bigquery.dataViewer" member = "user:test@xxx.com" condition { title = "only-dev" expression = "resource.matchTag(\"${local.organization.id} /environment\", \"dev\")" description = "Only view the dataset with tag of dev." } }
適用後、BigQueryを見てみるとちゃんとdevのデータセットのみが見えていることがわかります。
まとめ 本記事ではタグを利用したBigQueryデータセットのアクセス権限制御について紹介しました。
データセット1つ1つのアクセス制御を行うには、各データセットに対してIAM(roles/bigquery.dataViewerなど)を割り当てる必要があったのですが、データセットに付与されたタグでまとめてIAMを管理できると適切な粒度でアクセス制御ができ、タグで閲覧可能な範囲がまとめられるので管理も楽できるなーと思いました。
データのセキュリティを強固にするには、内部のメンバーに対してのデータアクセス制御も非常に重要となります。ぜひタグベースのIAM制御を試してみてはいかがでしょうか?