BigQuery サブスクリプションについて調べてみた

## はじめに

こんにちは、京セラコミュニケーションシステム 森田 (@kccs_kai-morita）です。
GoogleCloudPlatform - Pub/SubからBigQueryにデータをInsertするためにこれまではGoogleCloudPlatform - DataFlowを使うのがGoogleCloudのオススメでしたが、単に生データをそのまま使うユースケースでは過剰になり高額な費用がかかりました。ところが最近Pub/SubからGoogleCloudPlatform - BigQueryに直登録できるBigqueryサブスクリプションがリリースされたという記事が公開されましたので詳しく調べてみました。

### この記事の対象者
* BiqQueryおよびCloud Pub/Subについて基本的な知識を持っている人

## Bigqueryサブスクリプションの作成

[Bigqueryサブスクリプションのドキュメント](https://cloud.google.com/pubsub/docs/bigquery)によると３つアドバンテージがあり、そのうちの１つは以下の通りです。

> **Simple deployment.**
>You can set up a BigQuery subscription through a single workflow in the
>console, Google Cloud CLI, client library, or Pub/Sub API.

要はコンソール、GoogleCloud CLI、クライアント ライブラリ、または Pub/Sub API で簡単にBigQuery サブスクリプションをセットアップできますよ、ということが書かれています。

さっそくコンソールから構築します。

Pub/Sub\>サブスクリプション\>「CREATE SUBSCRIPTION」を選択します。

![Pub/Subサブスクリプション作成画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780555/c861dd27-3f90-0984-a21e-b84ab9404e6d.png "Pub/Subサブスクリプション作成画面")_Pub/Subサブスクリプション作成画面_

Subscriptionを作成する前にBigqueryテーブルを作成する必要があると記載があるとおり、テーブルは事前に作成する必要があるようです。一方でサブスクリプション作成のページからデータセットの作成はできました(テーブルの作成はこのページからはできませんでした・・・)。

既存のテーブルを使うにはPub/Subトピックのスキーマとの互換性があるか確認する必要があります。
今回は新規でデータセットとテーブルを作成しました。

次にオプションを見ていきます。
以下のオプションを選択できるようで、それぞれの説明はコンソール上に記載されているのでやさしいですね。

* トピックスキーマを使用する

[Pub/Subトピックのスキーマを](https://cloud.google.com/pubsub/docs/admin#schemas)Pub/Subで使用できるようです。

* メタデータを書き込む

メタデータをBigqueryテーブルの追加の列に書き込めるみたいです。便利ですね。

* 不明な項目を削除する

トピックスキーマには存在するがBigQueryスキーマには存在しないフィールドをドロップできます。


一旦オプションは選択せずに早速作成！と作成ボタンをクリックすると、アクセスが拒否されたという一文とともにエラーがでました。

:::note alert
サービスアカウントserviece-\*\*\*\*\*\*@gcp-sa-pubsub.iam.gserviceaccount.comに、BigQueryの書き込み権限があるかどうかを判断できません。テーブルが存在し、権限が構成されていることを確認してください。
:::

サービスアカウントに権限を付与する必要があるとのことが記載されています。

そこでIAMと管理からPub/Subサービスアカウント（<project名>@gcp-sa-pubsub.iam.gserviceaccount.com）にBigQueryデータ編集者( roles/bigquery.dataEditor)の役割と BigQueryメタデータ閲覧者(roles/bigquery.metadataViewer )の役割を付与します。

![IAMと管理画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780555/f3a1c7de-3c14-4021-41af-6d1567cba7f3.png "IAMと管理画面")_IAMと管理画面_

作成ボタンをクリックすると次は下記のエラーが発生しました。

:::note alert
BiqQuery tableスキーマにフィールドdataが見つかりません。「トピックスキーマを使用する」オプションが選択されていない場合、BigQueryテーブルには「data」というフィールドが必要です。
:::

つまりトピックスキーマを使用しないものは、メッセージをBigQueryの「data」というフィールドに書き込まれるようですので、「data」フィールドを作成する必要があるようです。
BigQueryのページに移動し、先程作成したテーブルを開き、新たにスキーマを追加します。

![BigQueryスキーマ画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780555/1f52d3e4-d458-7923-f53d-dcdf5388298b.png "BigQueryスキーマ画面")
_BigQueryで作成したテーブルのスキーマタブ_

「サブスクリプションが正常に作成されました。」と出て作成完了を確認できました。

以上により簡単にBigQueryサブスクリプションを作成できました。
オプションをみたところ追加で処理を実施できるような項目は確認できませんでしたので、その場合はDataflowを使用した方が良さそうですね。

### メッセージを公開してBigQueryにデータが入っているか確認する

Pub/Subコンソールにてさきほど作成したトピックに移動して、メッセージをパブリッシュします。

![Pub/Subコンソール画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780555/88c3cf08-01f6-5920-fee4-463fa5c81809.png "Pub/Subコンソール画面")
_Pub/Subコンソール画面_

スキーマを使用していないため、data列に書き込まれるはずです。

SELECT \* でQuery発行して確認します。

![BigQueryコンソール画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780555/722af19e-ca98-061f-27d1-b04114b4bd82.png "BigQueryコンソール画面")
_BigQueryコンソール画面_

data列にデータが入っていることを確認できました。

## 費用について
[Bigqueryサブスクリプションのドキュメント](https://cloud.google.com/pubsub/docs/bigquery)に記載されているアドバンテージには次のものがあります。
>**Offers low costs.**
>Removes the additional cost and latency of similar Pub/Sub pipelines
>that include Dataflow jobs. This cost optimization is useful for
>messaging systems that do not require additional processing before
>storage.

"Dataflow ジョブを含む同様の Pub/Sub パイプラインの追加コストとレイテンシを取り除きます。このコストの最適化は、保存前に追加の処理を必要としないメッセージングシステムに役立ちます。"ということで、つまり費用を抑えているということですので利用費用について調べてみました。

Dataflow構成時はDataflowジョブやBigQueryのデータの取り込みについて課金されますが、この手法ではこれらの費用はかからないようでした。BigQueryサブスクリプションは、**サブスクリプションからの読み取り (サブスクライブスループット)** と **BigQuery への書き込み**に対して、すべてのGoogleCloudPlatform リージョンでTiB あたり50ドルかかります。追加の BigQueryデータ取り込み料金はないみたいですが、ストレージやデータ抽出など他のタイプのBigQuery 料金が適用されるようです。MessageDelivery Basic SKUとして識別されるスループットは最初の10GiBに対して無料枠があるのですが、BigQueryサブスクリプション スループットは無料ではないようです。

## Dataflow vs BigQueryサブスクリプション
[Bigqueryサブスクリプションのドキュメント](https://cloud.google.com/pubsub/docs/bigquery)に記載されている３つ目のアドバンテージには次のとおり記載されていました。
>**Minimizes monitoring.**
>BigQuery subscriptions are part of the multi-tenant Pub/Sub service and
>do not require you to run separate monitoring jobs.

要は監視についても個別に設定することが不要であるという点でBigQueryサブスクリプションに利点があるということです。Dataflow構成との違いについてまとめます。

※Dataflow構成とは公式にPub/Sub サブスクリプション to BigQueryとしてテンプレートが用意されているようにPub/Subでメッセージを公開してDataflow経由でBigQueryにデータが入る構成を指すこととします。

参考：<https://cloud.google.com/dataflow/docs/guides/templates/provided-streaming#cloudpubsubsubscriptiontobigquery>

### Dataflowを利用するケース

メッセージをBigQueryテーブルへ保存する前に、前処理を施す必要がある場合はDataflowを使用します。

### BigQueryサブスクリプションを利用するケース

メッセージをBigQueryテーブルへ保存する前にメッセージを変換しない場合は、Pub/Subを使用します。

### 費用比較
利用費用について比較しました。
※2022/08時点の費用となります。
  |                            |        Dataflow構成         | BigQueryサブスクリプション |
  | :------------------------- | :-------------------------- | :------------------------- |
  | Pub/Subスループットコスト  | \$40/TiB(10GiBまで無料アリ) | \$50/TiB                   |
  | Dataflowコスト             | あり                        | なし                       |
  | BigQueryデータ取り込み料金 | \$0.012/200MB               | なし                       |


※その他のPub/SubおよびBigQueryの料金は両者共通であると思われるため省略します。

参考：[Pub/Sub pricing](https://cloud.google.com/pubsub/pricing#pubsub)

### 料金比較例

1月に1TiBのデータを前処理なしでそのままBigQueryへ流すケースを想定したものとなります。
  
  |                            |                Dataflow構成                | BigQueryサブスクリプション |
  | :------------------------- | :----------------------------------------- | :------------------------- |
  | Pub/Subスループットコスト  | \$40                                       | \$50                       |
  | Dataflowコスト             | \$12（データ流すだけなので最小構成を想定） | \$0                        |
  | BigQueryデータ取り込み料金 | \$60                                       | \$0                        |
  | 合計                       | \$112                                      | \$50                       |

従来と比較して半分以上にコストを抑えられることがわかりました。

## 終わりに

従来と比較すると簡単にBigQueryサブスクリプションを構築でき、さらにコストも半分以下に抑えることを可能であることがわかりました。しかし、前処理する機能はなくそのまま流すだけであるため、何らかの処理をデータに施したい場合は従来どおりDataflowを使用すると良いと思います。

## 参考
[BigQuery subscriptions](https://cloud.google.com/pubsub/docs/bigquery)

[No pipelines needed. Stream data with Pub/Sub direct to BigQuery](https://cloud.google.com/blog/products/data-analytics/pub-sub-launches-direct-path-to-bigquery-for-streaming-analytics)

以下は一部日本語ページには存在しないセクションや文がありますが言語を英語に変更すると表示されます。（2022年08月時点）\
[Create and use subscriptions](https://cloud.google.com/pubsub/docs/create-subscription#create_a_subscription)

[Assign BigQuery roles to the Pub/Sub service account](https://cloud.google.com/pubsub/docs/create-subscription#subscription)