BigQuery Data Transfer Service のイベントドリブン転送を試してみた

BigQuery Data Transfer Service のイベントドリブン転送を試してみた

Clock Icon2025.05.30

データ事業本部のはんざわです。

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.

May 29, 2025

本記事では、さっそくこの新機能を試してみたいと思います。

Event-Driven Transfers とは?

https://cloud.google.com/bigquery/docs/event-driven-transfer

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 サブスクリプションを指定します。

スクリーンショット 2025-05-30 11.16.26

それ以外の項目については、転送先の BigQuery テーブル情報や、取り込むファイルのフォーマットに合わせてよしなに設定してください。

動かしてみる

トリガーの起動元バケットに、まずは 1 つのファイルをアップロードしてみます。

スクリーンショット 2025-05-30 14.58.38

しばらくすると BigQuery Data Transfer Service のジョブが開始され、データのロードが完了しました。

スクリーンショット 2025-05-30 14.59.45

スクリーンショット 2025-05-30 14.59.17

この例では、14 時 54 分 52 秒にファイルがアップロードされ、14 時 57 分 34 秒にジョブが開始されたため、約 2 分半でロードジョブが開始されました。

続いて、3 つ同時にファイルをアップロードしてみます。

スクリーンショット 2025-05-30 15.05.49

同様に、しばらく待つとジョブが開始され、データのロードが完了しました。
ログを確認すると、3 つのファイルが 1 つのジョブでまとめて処理されていることが分かります。
このように、ファイルのアップロードタイミングによっては、複数のファイルが 1 つのジョブとしてまとめて処理される場合があるようです。

スクリーンショット 2025-05-30 15.35.44

この例では、15 時 04 分 20 秒にファイルがアップロードされ、15 時 09 分 23 秒にジョブが開始されたため、約 5 分後にロードジョブが開始されました。

まとめ

今回のブログでは、BigQuery Data Transfer Service のイベントドリブン転送を試してみました。
厳密なリアルタイム性が求められるワークロードには向きませんが、コスト効率を重視し、数分程度の遅延を許容できるケースでは非常に有用だと感じました。

是非試してみてください!

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.