前提
- 今回はBigQueryのScheduled Queryのリソースを例に説明します
ServiceAccountとは
サービス アカウントは、ユーザーではなく、アプリケーションや Compute Engine インスタンスなどのコンピューティング ワークロードで通常使用される特別なアカウントです。サービス アカウントは、アカウント固有のメールアドレスで識別されます。
簡単にいうとリソースごとに実行するためのアカウントを使用する仕組みです
Google Cloudの各サービス用のAPIが提供されており、サービスごとのAPIを実行するには対象のAPIの呼び出しをユーザのアカウントではなく、サービスアカウント経由で使用することで
- API キーを使わずにIAMを通じて安全に権限管理できる
- 必要なリソースへの最小のアクセス権限のみ付与できるようになる
などのメリットがあります
AWSでいうIAM Roleに該当するかと思います
ServiceAccountと必要なIAMメンバーの作成方法
Scheduled Queryを実行するためのサービスアカウントと必要な権限が付与されたIAMメンバーを作成します
今回は
- BigQuery Data Transfer Service エージェントのロールをもつIAMメンバー
- BigQuery Data TransferのAPIを有効化するため
- BigQuery 管理者のロールをもつIAMメンバー
- Scheduled Queryの実行、更新権限が付与されている
を作成します
resource "google_service_account" resource "google_service_account" "scheduled_query_service_account" {
account_id = "scheduled-query-sa"
display_name = "Scheduled Query Service Account"
}
resource "google_project_iam_member" "bq_admin" {
project = var.project
role = "roles/bigquery.admin"
member = "serviceAccount:${google_service_account.scheduled_query_service_account.email}"
}
resource "google_project_iam_member" "bq_transfer" {
project = var.project
role = "roles/bigquerydatatransfer.serviceAgent"
member = "serviceAccount:${google_service_account.scheduled_query_service_account.email}"
}
以下のように
- BigQuery Data Transfer Service エージェント
- BigQuery 管理者
のロールが付与された状態でService Accountが作成されていたら成功です
サービスアカウントの付与
作成したサービスアカウントをScheduled Queryに設定します
serviec_account_nameへService Accountのメールを紐づけることで実現できます
resource "google_bigquery_data_transfer_config" "insert_coupon_usage_query" {
data_refresh_window_days = 0
data_source_id = "scheduled_query"
destination_dataset_id = null
disabled = true
display_name = "insert_coupon_usage"
location = "us"
notification_pubsub_topic = null
params = {
query = templatefile("${path.module}/query/insert_coupon_usage.sql", {
dataset = var.dataset
})
}
project = var.project
schedule = "every 15 minutes synchronized"
service_account_name = google_service_account.scheduled_query_service_account.email
}
以下のようにScheduled Queryを実行できれば成功です
必要なロールの確認方法
サービス名 IAM
などと調べることで権限の一覧が記載されている公式ドキュメントを閲覧できます
今後自身でサービスに必要な権限を調べる際は公式ドキュメントを熟読することを推奨しm
カスタムロールの作成方法
今回はroles/bigquery.adminのロールを使用したので実行に成功しましたがScheduled Query実行時に不要なBigQueryの権限も付与されているので権限が大きすぎます
そのため、Scheduled Queryの権限とBigQueryのテーブルへの参照、更新のみ付与されたカスタムロールを作成するのも手です
google_project_iam_custom_roleを作成し、permissions内に必要な権限を記載していきます
resource "google_service_account" "scheduled_query_service_account" {
account_id = "scheduled-query-sa"
display_name = "Scheduled Query Service Account"
}
resource "google_project_iam_member" "bq_transfer" {
project = var.project
role = "roles/bigquerydatatransfer.serviceAgent"
member = "serviceAccount:${google_service_account.scheduled_query_service_account.email}"
}
resource "google_project_iam_member" "custom_bq_transfer" {
project = var.project
role = google_project_iam_custom_role.custom_bigquery_transfer_role.name
member = "serviceAccount:${google_service_account.scheduled_query_service_account.email}"
}
resource "google_project_iam_custom_role" "custom_bigquery_transfer_role" {
project = var.project
role_id = "customBigQueryTransferRole"
title = "Custom BigQuery Transfer Role"
description = "Custom role with BigQuery Transfer permissions"
permissions = [
"bigquery.tables.getData",
"bigquery.tables.updateData",
"bigquery.transfers.get",
"bigquery.transfers.update",
]
}
以下のように
- BigQuery Data Transfer Service エージェント
- BigQuery カスタムロール
のロールが付与された状態でService Accountが作成されていたら成功です
以下のようにScheduled Queryを実行できれば成功です
参考