laravelアプリケーションからPub/Subを経由し、BigQueryのテーブルにデータを入れるまでの実装に試行錯誤したため、備忘録として残します!!
概要
- 構成: Laravel (Publisher) -> Pub/Sub Topic -> Pub/Sub Subscription (BigQuery Write) -> BigQuery Table
- 目的: リアルタイムに近い速度でBQへデータを蓄積する。
1. BigQueryの設定
データの格納先となるデータセットおよびテーブルを作成し、Pub/Subからの書き込み権限を設定します。
1.1 データセット・テーブルの作成
以下のコンソールURLより、対象プロジェクトにてデータセットとテーブルを作成します。
- URL: BigQuery Console
データセット、テーブルの作成については割愛しますが、テーブル作成時はPub/Subから送信するデータのJSON構造に合わせたスキーマ定義が必要です。
1.2 Pub/Sub サービスアカウントへの権限付与
Pub/Subサービス自体がBigQueryへデータを書き込めるように、Google管理のサービスアカウント(Pub/Sub サービスエージェント)に対して権限を付与します。
- 作成したデータセットの「共有(権限)」設定を開く。
-
プリンシパルを追加 で以下のアドレスを入力する。
service-<<プロジェクト番号>>@gcp-sa-pubsub.iam.gserviceaccount.com- ※
<<プロジェクト番号>>はダッシュボード等で確認可能な数字のID
- 以下の2つのロールを付与する。
- BigQuery データ編集者 - データのインサート用
- BigQuery メタデータ閲覧者 - テーブルスキーマの読み取り用
2. アプリケーション用 Service Account (IAM) の作成
アプリケーションがPub/Subへメッセージを送信(Publish)するための権限を作成します。
2-1. IAMの有効化とSA作成
IAM管理画面より、Pub/Sub投稿用のサービスアカウントを作成します。
- URL: IAM サービスアカウント管理
-
手順:
- 「サービスアカウントを作成」をクリック。
- アカウント名を入力(例:
pubsub-publisher-sa)。 - ロールに Pub/Sub パブリッシャー (
roles/pubsub.publisher) を付与して保存。
2-2. 認証情報の管理 (Secret Manager)
セキュリティ上の理由から、発行したサービスアカウントキーは直接コード管理せず、AWSのSecret Managerを利用しました。
キーの管理方法は使用している環境に合わせて変更してください。
Note
Secret Managerを使用する場合の対応内容は下記
- 作成したSAのキー(JSON)を発行する。
- Secret Manager に、当該キーをシークレットとして登録する。
- アプリケーション(ECS/Fargate等)から参照可能な設定を行う。
3. Pub/Sub の設定
3-1. トピック (Topic) の作成
データの受け口となるトピックを作成します。
- URL: Pub/Sub トピック一覧
-
手順:
- 「トピックを作成」をクリック。
- トピックIDを入力(例:
sample-topic)。 - 「デフォルトのサブスクリプションを追加する」のチェックは外す。
3-2. サブスクリプション (Subscription) の作成
トピックに来たデータをBigQueryへ流すためのサブスクリプションを作成します。
- 作成したトピックの詳細画面へ移動し、「サブスクリプションを作成」をクリック。
- 以下の通り設定を行う。
-
サブスクリプションID: 任意のID(例:
sample-sub) -
配信タイプ: BigQuery への書き込み を選択
- プロジェクト、データセット、テーブル: 手順1.1で作成したテーブルを指定
-
スキーマ構成: テーブル スキーマを使用する にチェック
- ※これを選択することで、Pub/SubメッセージのJSONキーとBQカラム名が自動マッピングされます。
-
サブスクリプションID: 任意のID(例:
他は全てデフォルトのまま
他のブロパティについては公式リファレンスを参照いただければと思います。
4. 疎通確認
設定が完了したら、GCPコンソール上で疎通確認を行います。
- Pub/Sub トピック の画面を開く。
- 「メッセージ」タブを選択し「メッセージをパブリッシュ」を押す。
- テスト用のJSONデータを入力して「パブリッシュ」を実行。
{"user_id": 1, "name": "サンプル太郎", "created_at": "2025-12-12 10:00:00"}
実行後、BQの該当テーブルにレコードがinsertされていれば、GCP側での設定は終了です。
Laravelからメッセージをパブリッシュする編へ続く。


