本記事は、以下 @kousuke-tachibana さんの記事とのコラボとなります。
上記記事では、BigQuery に連携された YouTube 視聴データをどのように分析・活用できるかが紹介されています。
本記事ではその前段として、YouTube → BigQuery 連携の具体的なジョブ設計を中心にまとめます。
YouTube の視聴データを BigQuery に連携する方法
YouTube の視聴データを BigQuery に連携する代表的な方法は、以下の3つです。
- YouTube Data API を自前で叩く
- YouTube Reporting API を自前で叩く
- BigQuery Data Transfer Service(YouTube Channel / Content Owner コネクタ)を使う
今回は下記理由から BigQuery Data Transfer Service を利用しました。
- 定期実行・再実行(Backfill)をサービス側に任せられる
- スキーマやテーブル作成を意識しなくてよい
- 分析用途として十分な粒度のデータが提供されている
BigQuery Data Transfer Service(YouTube)の2つの転送方式
BigQuery Data Transfer Service には、YouTube のデータを取り込むための転送として以下の2種類が用意されています。
YouTube Channel Transfer
YouTube Content Owner Transfer
どちらも YouTube Reporting API を利用していますが、対象とする権限モデルと用途が異なります。
YouTube Channel Transfer と Content Owner Transfer の比較
| 観点 | YouTube Channel Transfer | YouTube Content Owner Transfer |
|---|---|---|
| 対象 | 単一チャンネル | 複数チャンネル(Content Owner 配下) |
| 必要な権限 | チャンネル所有者 | コンテンツ所有者 |
| OAuth 認証 | チャンネル所有者の Google アカウント | Content Owner アカウント |
| 主な用途 | 単一チャンネルの分析 | 複数チャンネル横断分析 |
| 導入のしやすさ | 比較的容易 | 権限・契約面のハードルあり |
今回のユースケースでは、
- 単一チャンネルの視聴データ分析が目的
- Content Owner 権限は不要
- 権限構成をできるだけシンプルに保ちたかった
という背景があり、YouTube Channel Transfer を選択しました。
認証・認可の設計
YouTube Channel Transfer では、OAuth 認証が必須となるため、認証に関わるアカウントと、転送ジョブを管理するアカウントを分けて考える必要があります。
今回は、以下の3つのアカウントに役割を分離して運用しています。
| 役割 | 種別 | 用途 |
|---|---|---|
| YouTube チャンネルの所有者 | Google アカウント | YouTube 側の OAuth 認証 |
| データ基盤運用担当者 | GCP ユーザアカウント | 初回の転送ジョブ手動作成 |
| Terraform 実行用 | GCP サービスアカウント | Terraform への import 後の転送設定管理 (※後述) |
転送ジョブ作成から運用までの流れ
各アカウントの詳細説明の前に、ざっくりと全体の流れを整理すると、以下のようになります。
- データ基盤運用担当者が GCP コンソールから転送ジョブを手動作成
- 転送ジョブ作成時に YouTube チャンネル所有者の Google アカウントで OAuth 認証を実施
- 作成済みの転送ジョブを Terraform の import 機能で Terraform 管理下に取り込む
- 以降の設定変更は Terraform 実行用サービスアカウントのみが実施
各アカウントの責務と使い分け
YouTube チャンネルの所有者(Google アカウント)
- YouTube チャンネルの所有権を持つ Google アカウント
- BigQuery Data Transfer Service の YouTube Channel Transfer では、このアカウントによる OAuth 認証が必須
- 転送ジョブ作成時に、YouTube Reporting API 側でレポートジョブが作成される
このアカウントは OAuth 認証専用として扱い、GCP 上の権限は一時的な付与のみとし、恒久付与しない運用としています。
データ基盤運用担当者(GCP ユーザアカウント)
- GCP プロジェクトに対する管理権限を持つ人のアカウント
- YouTube チャンネル所有者としてログインし、BigQuery Data Transfer Service の転送ジョブを最初に手動で作成
転送ジョブ作成後は、このアカウントから転送設定を直接操作することはありません。
Terraform 実行用サービスアカウント(GCP サービスアカウント)
- Terraform を実行するための GCP サービスアカウント
- Terraform の import 機能で、手動作成した転送ジョブを管理下に取り込む
- 以降の運用では、このサービスアカウントのみが転送設定の変更を行う
Terraform により管理する対象は以下に代表される転送設定の諸々です。
- 転送ジョブの有効 / 無効
- スケジュール
- 宛先データセット
- 転送設定の削除
これにより、
- 人が GCP コンソールから直接設定を変更する
- 特定の個人に強い権限を持たせ続ける
といった運用を避けています。
転送ジョブの手動作成
YouTube Channel Transfer は、ジョブ作成時に OAuth 認証が必要なため、転送ジョブの初回作成は手動で行っています。
最初にデータ基盤運用担当者が BigQuery Data Transfer Service の転送設定を手動作成します。
まず、BigQuery のコンソールにアクセスし、「データ転送」を選択します。
画面上部の「転送を作成」をポチります。
ソースタイプで「YouTube Channel」を選びます。
あとは、Set up a YouTube Channel transfer の内容に沿って設定をしていくだけです。
最後に「保存」を押すと、OAuth 認証画面が出てきます。
ここで、YouTube チャンネルの所有者アカウントとして認証してください。
すると YouTube チャンネルの所有者アカウントが所有者となっている YouTubu チャンネルのレポートデータを BigQuery に連携するジョブが作成されます。
Terraform による IaC 化
手動作成後の転送設定については、Terraform の import 機能で Terraform 管理下に取り込み、IaC として運用しています。
具体的には Terraform の import ブロック を用いて取り込んでおり、.tf ファイルに以下 import ブロックを記載して Apply しました。
import {
id = "projects/${PROJECT_NUMBER}/locations/us/transferConfigs/${JOB_ID}"
to = google_bigquery_data_transfer_config.youtube_channel_transfer
}
# 取り込み先リソース
resource "google_bigquery_data_transfer_config" "youtube_channel_transfer" {
project = "${PROJECT_ID}"
location = "${LOCATION}"
display_name = "youtube_channel_transfer"
data_source_id = "youtube_channel"
schedule = "every day 16:00" # UTC なので注意
destination_dataset_id = "${DATASET_ID}"
params = {
"configure_jobs" = "true"
"table_suffix" = "${テーブルのサフィックス}"
}
}
※ 取り込み先リソースの設定内容は手動作成したジョブの転送設定と合わせておくと余計な差分が発生せず楽です
※ 取り込み先リソースの設定内容と手動作成したジョブの転送設定が乖離しすぎるとリソースの replace (destroy/add) が走ってしまうためご注意ください
Backfill(過去データ取得)について
BigQuery Data Transfer Service の YouTube Channel Transfer には、過去データを再取得するための Backfill 機能があります。
ただし、この Backfill は「任意の過去日付まで自由に遡れる」ものではないため注意が必要で、重要なポイントは以下です。
- 転送ジョブを初めて作成した日が基準日となる
- 基準日から見て過去30日分の履歴レポートのみが生成される
- 30日より前のデータは YouTube 側に存在しない
- Backfill は「存在する履歴レポート」を再取得しているだけ
要するに「転送ジョブを作成してから30日までしか遡って過去データを取得できない」ということです。
YouTube Channel Transfer は YouTube Reporting API を利用してデータを取得しているのですが、YouTube Reporting API の仕様 として、以下が明記されています。
When you schedule a new reporting job, YouTube generates historical reports from that day forward, and generates reports covering the 30-day period prior to the time that you created the job.
また、GCP 側のドキュメントの Backfill について言及している箇所 でも取得可能範囲について説明されています。
YouTube reports containing historical data are available for 30 days from the time that they are generated.
最後に
以上、YouTube の視聴データを BigQuery に連携する方法について紹介しました!めでたし!



