BigQuery Data Transfer Service のイベントドリブン転送を試してみた
データ事業本部のはんざわです。
2025 年 5 月 29 日のアップデートで、BigQuery Data Transfer Service の「Event-Driven Transfers」が正式にサポートされました。
You can now create event-driven transfers when transferring data from Cloud Storage to BigQuery. Event-driven transfers can automatically trigger transfer runs when data in your Cloud Storage bucket has been modified or added.
本記事では、さっそくこの新機能を試してみたいと思います。
Event-Driven Transfers とは?
Event-Driven Transfers は、BigQuery Data Transfer Service の機能のひとつで、Cloud Storage で発生したイベント通知をトリガーとして、データを自動的に BigQuery へロードすることができます。
Event-Driven Transfers では、各データ転送の間に最大で10分程度の遅延が発生することがあります。よりリアルタイムに BigQuery へデータをストリーミングしたい場合は、Storage Write API の利用をおすすめします。
コスト効率を重視し、数分程度の遅延を許容できる場合は、Event-Driven Transfers の利用が適しているでしょう。
試してみる
必要なリソースを作成する
まずはイベントを検知するための Cloud Storage バケットを作成します。
gcloud storage buckets create gs://cm-hanzawa-yuya-event-driven-transfers \
--location='asia-northeast1' \
--uniform-bucket-level-access
次に、バケットに通知設定を追加し、Pub/Sub のトピックを作成します。
gcloud storage buckets notifications create gs://cm-hanzawa-yuya-event-driven-transfers \
--topic=event-driven-transfers \
--event-types=OBJECT_FINALIZE
etag: '1'
event_types:
- OBJECT_FINALIZE
id: '1'
kind: storage#notification
payload_format: JSON_API_V1
selfLink: https://www.googleapis.com/storage/v1/b/cm-hanzawa-yuya-event-driven-transfers/notificationConfigs/1
topic: //pubsub.googleapis.com/projects/<PROJECT_ID>/topics/event-driven-transfers
設定が正しく反映されているか、以下のコマンドで確認します。
gcloud storage buckets notifications list gs://cm-hanzawa-yuya-event-driven-transfers
Bucket URL: gs://cm-hanzawa-yuya-event-driven-transfers/
Notification Configuration:
etag: '1'
event_types:
- OBJECT_FINALIZE
id: '1'
kind: storage#notification
payload_format: JSON_API_V1
selfLink: https://www.googleapis.com/storage/v1/b/cm-hanzawa-yuya-event-driven-transfers/notificationConfigs/1
topic: //pubsub.googleapis.com/projects/<PROJECT_ID>/topics/event-driven-transfers
問題なく設定できているようです。
続いて、Pub/Sub のサブスクリプションを作成します。
## サブスクリプションを作成
gcloud pubsub subscriptions create event-driven-transfers-sub \
--topic=event-driven-transfers
最後に、以下の SQL で BigQuery にデータをロードするためのデータセットとテーブルを作成します。
CREATE SCHEMA event_driven_transfers
OPTIONS (
location = 'asia-northeast1'
);
CREATE OR REPLACE TABLE event_driven_transfers.test
(
description STRING,
language STRING
);
必要な権限を割り当てる
BigQuery Data Transfer Service Agent のサービスアカウントに roles/pubsub.subscriber
権限を付与します。
BigQuery Data Transfer Service Agent は、Google Cloud が提供するデフォルトのサービスアカウントで、アカウント名は service-<project_number>@gcp-sa-bigquerydatatransfer.iam.gserviceaccount.com
という形式になっています。
gcloud projects add-iam-policy-binding <PROJECT_ID> \
--member serviceAccount:service-<PROJECT_NUMBER>@gcp-sa-bigquerydatatransfer.iam.gserviceaccount.com \
--role roles/pubsub.subscriber \
--condition None
イベントドリブンの BigQuery Data Transfer Service を作成する
最後に、BigQuery Data Transfer Service の転送ジョブをコンソールから作成します。
スケジュールオプションの「繰り返しの頻度」を イベントドリブン に設定し、先ほど作成した Pub/Sub サブスクリプションを指定します。
それ以外の項目については、転送先の BigQuery テーブル情報や、取り込むファイルのフォーマットに合わせてよしなに設定してください。
動かしてみる
トリガーの起動元バケットに、まずは 1 つのファイルをアップロードしてみます。
しばらくすると BigQuery Data Transfer Service のジョブが開始され、データのロードが完了しました。
この例では、14 時 54 分 52 秒にファイルがアップロードされ、14 時 57 分 34 秒にジョブが開始されたため、約 2 分半でロードジョブが開始されました。
続いて、3 つ同時にファイルをアップロードしてみます。
同様に、しばらく待つとジョブが開始され、データのロードが完了しました。
ログを確認すると、3 つのファイルが 1 つのジョブでまとめて処理されていることが分かります。
このように、ファイルのアップロードタイミングによっては、複数のファイルが 1 つのジョブとしてまとめて処理される場合があるようです。
この例では、15 時 04 分 20 秒にファイルがアップロードされ、15 時 09 分 23 秒にジョブが開始されたため、約 5 分後にロードジョブが開始されました。
まとめ
今回のブログでは、BigQuery Data Transfer Service のイベントドリブン転送を試してみました。
厳密なリアルタイム性が求められるワークロードには向きませんが、コスト効率を重視し、数分程度の遅延を許容できるケースでは非常に有用だと感じました。
是非試してみてください!