🙆

サービスアカウントでLooker Studio(旧データポータル)からBigQueryに接続する

2022/12/11に公開

Looker Studio(旧データポータル)からBigQueryなどのデータソースに接続する場合の認証について主に次の3種類に区分されます。

  1. オーナーの認証情報
  2. 閲覧者の認証情報
  3. サービスアカウント

1はLooker Studioでレポートを作成したオーナーの認証情報をつかったアクセスです。2はレポートを閲覧したユーザーアカウントの認証情報をつかったアクセスです。3はユーザーではなく、共通のアカウントとなるサービスアカウントによるアクセスです。

ユーザーアカウントによる認証情報ではなく、サービスアカウントを利用することのメリットは以下のとおりです。

  • (オーナーの認証情報を使用している場合)退職やアカウント停止による影響をうけない
  • (閲覧者の認証情報を使用している場合)閲覧者一人ひとりに対してアクセス権限を付与する必要がない

Looker Studioからサービスアカウントを使用する方法については、次のドキュメントを読んでいただくのが手っ取り早いですが、本記事では図を用いて説明します。また、Terraformによる設定方法について紹介します。

Set up a Google Cloud service account for Looker Studio - Looker Studio Help

構成

Looker Studioからサービスアカウントによってデータソースにアクセスする流れについて、次の図を見ながら説明します。

looker-studio-to-biquery-by-sa

  1. サービスアカウント(図ではService Account)を作成し、データソース(図ではBigQuery)に対してクエリ実行するためBigQueryユーザーのロール(roles/bigquery.user)を付与する
  2. サービスアカウントトークン作成者ロール(roles/iam.serviceAccountTokenCreator)をLooker Studioサービスエージェント(図ではService Agent)に付与する。これによってサービスアカウントの権限を借用できるようになり、サービスアカウント経由でデータへのアクセスが可能になる
  3. データソースを作成または編集するため、ユーザーアカウントに対してサービスアカウントユーザーのロール(roles/iam.serviceAccountUser)を付与する
  4. Looker StudioからアクセスするBigQueryのテーブルまたはデータセットを特定し、サービスアカウントに対してBigQueryデータ閲覧者ロール(roles/bigquery.dataViewer)を付与する
  5. ダッシュボード閲覧者はサービスアカウントの権限によってデータソースにアクセスされている

Terraformによる設定方法

Looker StudioドキュメントにマネジメントコンソールとCloud Shell(コマンドラインツール)を使用した設定方法が記載されているため、本記事ではTerraformで設定する方法について紹介します。次にTerraformサンプルコードを載せます。ドキュメントではLooker Studioに関する変数名がdatastudioになっているため合わせました。また、パラメータ漏れ等があって動かない可能性があるため、あらかじめご了承ください。

variable "project_id" {
  default     = "xxxxxxxx"
  description = "GCPプロジェクトID"
}

variable "dataset_id" {
  default     = "foo-dataset"
  description = "データセット名"
}

variable "user_account" {
  default     = "ohsawa-example@jicoman.info"
  description = "データソースを作成・編集するユーザーアカウント"
}

# Looker Studioサービスエージェント。ヘルプページから取得して置き換える
# https://datastudio.google.com/u/0/serviceAgentHelp
# Looker Studioサービスエージェントを取得するには、WorkspaceまたはCloud Identityのユーザーである必要がある
variable "datastudio_service_agent" {
  default     = "service-org-xxxxxxxxx@gcp-sa-datastudio.iam.gserviceaccount.com"
  description = "Looker Studioサービスエージェント"
}

# サービスアカウントの作成
resource "google_service_account" "datastudio_sa" {
  project      = var.project_id
  account_id   = "datastudio_service_account"
  display_name = "Looker Studio用サービスアカウント"
}

# BigQueryにクエリ実行するための権限をサービスアカウントに付与
resource "google_project_iam_member" "datastudio_sa_bigquery_jobuser" {
  project = var.project_id
  role    = "roles/bigquery.jobUser"
  member  = "serviceAccount:${google_service_account.datastudio_sa.email}"
}

# BigQueryのデータセットにおけるデータ閲覧権限をサービスアカウントに付与
resource "google_bigquery_dataset_iam_member" "datastudio_sa_data_viewer" {
  project    = var.project_id
  dataset_id = var.dataset_id
  role       = "roles/bigquery.dataViewer"
  member     = "serviceAccount:${google_service_account.datastudio_sa.email}"
}

# サービスアカウントに対して、サービスアカウントトークン作成者の権限をLooker Studioサービスエージェントに付与
resource "google_service_account_iam_member" "datastudio_sa_token_creator" {
  service_account_id = google_service_account.datastudio_sa.name
  role               = "roles/iam.serviceAccountTokenCreator"
  member             = "serviceAccount:${var.datastudio_service_agent}"
}

# サービスアカウントに対して、サービスアカウントユーザーの権限をユーザーに付与
# サービスアカウントを通じてデータソースの追加・編集をするために必要
resource "google_service_account_iam_member" "datastudio_sa_user" {
  service_account_id = google_service_account.datastudio_sa.name
  role               = "roles/iam.serviceAccountUser"
  member             = "user:${var.user_account}"
}

Discussion