LoginSignup
9
0

More than 1 year has passed since last update.

GCP BigQuery Subscriptionを試す

Last updated at Posted at 2022-12-13

概要

この記事はQualiArts Advent Calender 2022の13日目の記事になります。

はじめまして、23卒内定者バイトのやましーです。QualiArtsでは2ヶ月間バックエンドのタスクに取り組んでいました。

今回はゲームの行動ログのパイプラインとして、BigQuery Subscriptionを構築した際にインプットしたことをまとめてみました。初めての技術記事となりますのでお手柔らかにお願いします。

*BigQuery, Cloud Pub/Sub自体の詳しい話は書いてません

*Terraformのサンプルコードを載せていますが、IAMやサービスアカウントの構築については今回扱いません

前提

BigQuery SubscriptionとはCloud Pub/SubのSubscriptionの一つで、BigQueryに直接データを投入することができます。

BigQuery Subscription公式ドキュメント

余談ですが、BigQuery Subscription が出る以前は、 Cloud Pub/Sub から BigQueryへデータを投入するには、 Cloud Dataflow や Cloud Functions などの別サービスを経由する必要がありました。

今後はメッセージを変換せずにBigQueryに保存したい場合はBigQuery Subscription、変換したい場合はDataflowをかませる使い分けになると思います。

Dataflow ストリーミング テンプレート

事前準備

Subscription作成前に、BigQueryのテーブル作成とpub/subのサービスアカウントに必要な権限を付与しておくとスムーズです。

BigQueryのテーブル作成

テーブルのカラムはBigQuery Subscriptionのプロパティによって必要なものが変わります。

今回はトピックスキーマを使用しないメタデータを書き込むのプロパティを選択することを前提としています。

*以後、Terraformのコードは大部分が公式ドキュメントからのコピペになります。

一部、プロジェクトに寄せた書き方をしています。

Terraform Cloud pub/sub 公式ドキュメント

resource "google_bigquery_dataset" "test" {
  dataset_id = "example_dataset"
}

resource "google_bigquery_table" "test" {
  table_id   = "example_table"
  dataset_id = google_bigquery_dataset.test.dataset_id
  schema     = file("./schemas/subscription.json")

  deletion_protection = true

  time_partitioning {
    type                     = "DAY"
    field                    = "publish_time"
    require_partition_filter = true
  }
}

time_partitioningを設定し、検索期間の条件にバリデーションをかけることで、想定外のクエリコストを抑えることができます。

繰り返しになりますが、今回はSubscriptionのプロパティとしてトピックスキーマを使用しないメタデータを書き込むを選択しています。

[トピック スキーマを使用する] オプションを選択しない場合は、BigQuery テーブルに BYTES
STRING、または JSON 型の data という列があることを確認してください。Pub/Sub は、この BigQuery 列にメッセージを書き込みます。

[メタデータの書き込み] オプションを選択する場合は、BigQuery テーブルに次のテーブルに示すフィールドがあることを確認してください。

上記公式ドキュメントの引用にしたがって書いたテーブルのjsonスキーマが以下になります

[
  {
    "name": "subscription_name",
    "description": "サブスクリプションの名前",
    "type": "STRING",
    "mode": "NULLABLE"
  },
  {
    "name": "message_id",
    "description": "メッセージのID",
    "type": "STRING",
    "mode": "NULLABLE"
  },
  {
    "name": "publish_time",
    "description": "メッセージをパブリッシュした時刻",
    "type": "TIMESTAMP",
    "mode": "REQUIRED"
  },
  {
    "name": "data",
    "description": "メッセージの本文",
    "type": "STRING",
    "mode": "REQUIRED"
  },
  {
    "name": "attributes",
    "description": "すべてのメッセージ属性を含むJSONオブジェクト",
    "type": "STRING",
    "mode": "NULLABLE"
  }
]

pub/subサービスアカウント

次にCloud Pub/SubサービスアカウントにBigQueryへのデータ編集者(roles/bigquery.dataEditor)とメタデータ閲覧(roles/bigquery.metadataViewer)を割り当てます。

Pub/Sub サービス アカウントに BigQuery のロールを割り当てる

data "google_project" "project" {
}

resource "google_project_iam_member" "viewer" {
  project = data.google_project.project.project_id
  role   = "roles/bigquery.metadataViewer"
  member = "serviceAccount:service-${data.google_project.project.number}@gcp-sa-pubsub.iam.gserviceaccount.com"
}

resource "google_project_iam_member" "editor" {
  project = data.google_project.project.project_id
  role   = "roles/bigquery.dataEditor"
  member = "serviceAccount:service-${data.google_project.project.number}@gcp-sa-pubsub.iam.gserviceaccount.com"
}

一点注意としてはサービスアカウントの形式がservice-**project-number**@gcp-sa-pubsub.iam.gserviceaccount.comとなる点です。

一部の Google Cloud サービスには、サービスがリソースにアクセスできる Google Cloud 管理サービス アカウントがあります。これらのサービス アカウントは、サービス エージェントと呼ばれます。Pub/Sub は、プロジェクトごとにサービス アカウントを service-**project-number**@gcp-sa-pubsub.iam.gserviceaccount.com の形式で作成して維持します。

TopicとSubscription作成

ここまでくればTopicとSubscriptionをそれぞれ作成するだけです。

今回はメタデータを書き込みたいのでwrite_metadata = trueとします。

resource "google_pubsub_topic" "example" {
  name = "example-topic"
}

resource "google_pubsub_subscription" "example" {
  name  = "example-subscription"
  topic = google_pubsub_topic.example.name

  bigquery_config {
    table = "${google_bigquery_table.test.project}:${google_bigquery_table.test.dataset_id}.${google_bigquery_table.test.table_id}"
	write_metadata = true
  }
}

TopicとSubscriptionが作成できたら、コンソールなどでデータを投入してみましょう!

コスト

最後にコストについて触れておきます。

BigQuery Subscriptionでは$50/TiBのコストがかかり、追加の BigQuery データ取り込み料金はかかりません。

しかしこれはBigQuery Subscriptionの話で、BigQuery自体のストレージやデータ抽出などに関しては別途料金がかかります。

またBigQuery Subscriptionは他のSubscriptionと違い10 GiBの無料枠がないので注意が必要です。

The first 10 GiB of BigQuery subscription throughput is not free.

おわりに

この記事ではBigQuery Subscriptionを構築するにあたりインプットしたことをまとめてみました。

自分自身、インフラやパブリッククラウドの経験が乏しいので今後も勉強していきたいと思います。

誤りなどあればコメント頂けると幸いです。

9
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
0