Dataform
SQLXをコンパイルして依存関係を確定し、BigQuery上でテーブル更新と品質検証を順序どおり実行するELT管理サービス。
- リポジトリのSQLXを依存DAGへコンパイルする。
- ワークフロー実行がBigQueryの更新順を制御する。
- アサーション失敗と増分処理の重複を運用で検知する。
解決する課題
- BigQuery の変換 SQL が手書きスクリプトに散らばり、依存関係や実行順序を人手で管理している
- データパイプラインの SQL にバージョン管理・コードレビュー・CI/CDを適用したい
- 中間テーブルの鮮度や整合性を検証したいが、品質チェックの仕組みがない
- ELT(抽出・ロード後に BigQuery 内で変換)を、ETL ツールを別途運用せずSQL 中心で回したい
主要概念と用語
- ELT: データを先にロードしてから、データウェアハウス内部で変換する方式。Dataform は BigQuery に取り込み済みのデータを SQL で変換する「T(変換)」を担当する
- リポジトリ / ワークスペース: 変換コードを格納する Git リポジトリと、開発者が編集・実行する作業領域。GitHub / GitLab などの外部リポジトリと接続できる
- SQLX: 標準 SQL を拡張した Dataform 独自のファイル形式。SELECT 文に加え、出力タイプや依存関係などの設定ブロックを記述する
- アクション / テーブル / ビュー / 増分テーブル: SQLX 1 ファイルが 1 アクションになり、
table(毎回再生成)、view(ビュー)、incremental(差分のみ追記する増分テーブル)などの出力タイプを選べる - 依存グラフ (DAG): アクション間の参照関係から自動構築される有向非巡環グラフ。Dataform はこの順序でアクションを実行する
- ref 関数: 他のテーブルを名前で参照する仕組み。文字列でテーブル名を直書きせず ref を使うことで、依存関係が自動登録され実行順序が解決される
- アサーション (assertion): データ品質テスト。一意性・非 NULL・条件違反などを SQL で表現し、違反行が見つかると失敗扱いになる
- コンパイル / 実行: SQLX を BigQuery が解釈できる SQL に変換するコンパイルと、生成された SQL を BigQuery 上で順に走らせる実行の二段階で動く
仕様・制限・クォータ
- Dataform は BigQuery 専用の変換オーケストレーションサービス。変換そのものの計算は BigQuery 側で実行され、Dataform はコンパイルとスケジューリングを担う
- コード形式は SQLX と JavaScript。JavaScript で繰り返し定義やマクロ的な共通化(インクルード)ができる
- 外部 Git プロバイダー(GitHub、GitLab、Azure DevOps、Bitbucket など)と連携でき、Dataform 内蔵の Git ホスティングも利用できる
- 出力タイプは テーブル / ビュー / 増分テーブル / マテリアライズドビュー などに対応。BigQuery のパーティショニングやクラスタリングも設定ブロックから指定できる
- Dataform 自体の利用に追加料金は基本かからず、コストは BigQuery のクエリ・ストレージ側で発生する(コストの節を参照)。具体的な上限値やクォータは変動するため、最新の公式ドキュメントで確認すること
- 2026年4月29日から厳格な代理実行モードが全体で必須。ワークフロー実行には、明示したカスタムサービスアカウントまたは利用者資格情報を使い、既定のサービスエージェントへ暗黙に委ねない
内部の仕組み
横にスクロール
Dataform はまずリポジトリ内のすべての SQLX / JavaScript を読み取り、コンパイル段階で各アクションを実行可能な BigQuery SQL に展開します。このとき ref 関数の参照を解決し、アクション間の依存関係から有向非巡環グラフ(DAG)を構築します。コンパイルはコードを静的に解析するだけなので、BigQuery のクエリ課金は発生しません。
次に実行段階で、DAG の順序に従って各アクションの SQL を BigQuery に投げます。テーブルは CREATE OR REPLACE TABLE、増分テーブルは既存テーブルへの差分マージ(または追記)に展開され、変換結果が宛先データセットに書き込まれます。アサーションは「違反行を返すクエリ」として実行され、結果が空でなければ失敗とみなされます。
実行はワークスペースからの手動トリガーのほか、リリース構成 / ワークフロー構成による定期実行で自動化できます。リリース構成はコンパイル対象の Git 参照を固定し、ワークフロー構成は実行対象、変数、スケジュールを定めます。前回の定期実行が完了していない場合は次の実行が開始されないため、処理時間が実行間隔を超えないか監視します。
テーブル名を文字列で直書きせず ref 関数で参照すると、依存関係が自動で DAG に登録され、実行順序が正しく解決されます。さらに開発・本番でデータセット名を切り替える際も参照側を書き換える必要がなく、環境分離が容易になります。
設計パターン / ベストプラクティス
- 取り込みは別サービス(Data Transfer Service、Dataflow、外部 ELT ツールなど)に任せ、BigQuery 内の変換だけを Dataform に集約する。これが ELT の基本構成
- テーブル参照は必ず ref 関数で行い、テーブル名のハードコードを避けて依存グラフを正確に保つ
- 大規模・追記中心のテーブルは 増分テーブルにして、毎回のフルスキャン再生成を避けコストと処理時間を抑える
- 重要テーブルにはアサーションを付け、一意キーや非 NULL、件数の妥当性を継続的に検証する
- 開発と本番を別データセット / 別環境に分け、ワークスペース(開発)で検証してからリリース構成(本番)に反映する
- 共通ロジックは JavaScript のインクルードにまとめ、SQL の重複を減らす
運用・監視
- ワークフロー実行ログで各アクションの成否・所要時間を確認し、失敗したアクションと原因を特定する
- 定期実行は リリース構成 + ワークフロー構成で設定し、Cloud Scheduler 連携などでスケジュール化する
- 変換の鮮度はアサーションで担保する。たとえば最新パーティションが存在するか、件数が想定範囲かをテストし、違反時に失敗させて気づけるようにする
- 実行は Cloud Logging に記録されるため、監査やアラート連携の基盤として利用できる
- 失敗時はまずコンパイルエラー(参照ミス・構文)か実行エラー(BigQuery 側のクエリ失敗)かを切り分ける
コスト
Dataform はオーケストレーション層であり、変換の実体は BigQuery のクエリとして走ります。したがって主なコストは BigQuery のクエリ(スキャン量またはスロット)とストレージで発生し、Dataform の利用自体には基本的に追加料金がかからない、という整理が重要です。
| コスト要素 | 発生する場所 | 抑え方 |
|---|---|---|
| 変換クエリの実行 | BigQuery のクエリ課金(スキャン量 or スロット) | 増分テーブルとパーティション/クラスタで読み取り量を削減 |
| 中間/出力テーブルの保持 | BigQuery のストレージ課金 | 不要な中間テーブルはビュー化し実体化を避ける |
| 定期実行のオーバーヘッド | 実行頻度に比例した BigQuery クエリ量 | 実行間隔を要件に合わせ、無駄な再生成を減らす |
| Dataform 本体 | 原則として追加料金なし | コンパイルは無料、課金は下流の BigQuery に集約される |
出力タイプを table のままにすると、実行のたびにテーブル全体が再構築され BigQuery のスキャン量が膨らみます。追記主体の大規模テーブルは増分テーブルへ切り替え、差分だけを処理するのが定石です。
セキュリティ
- Dataform の実行は、カスタムサービスアカウントまたは利用者資格情報で BigQuery にアクセスする。実行主体に対象データセットへの最小権限を付与し、代理実行権限も必要な主体だけに限定する
- IAM でリポジトリの編集権限と実行権限を分離し、開発者・運用者の役割に応じて付与する
- 外部 Git プロバイダー接続の認証トークンは Secret Manager に保管し、コードや設定への直書きを避ける
- 変換先データセットは Google 管理鍵で既定暗号化され、要件に応じ CMEK(顧客管理鍵, Cloud KMS) を BigQuery 側に適用できる
- データ流出対策として VPC Service Controls を BigQuery と組み合わせ、境界外への持ち出しを制限する
本番データセットに対する書き込み権限を全開発者へ無制限に付与するのは NG。開発はワークスペースと開発用データセットに閉じ、本番反映はリリース構成と限定された権限の経路に限定して、誤った変換が本番テーブルを破壊しないようにします。
Well-Architected の観点
- 運用上の優秀性 (operational): SQL 変換を Git でバージョン管理し、コードレビューと CI/CD、依存解決、データ品質テストを標準化できる。手書きスクリプトの属人化を排し、変更を安全に反映できる点が最大の価値
- コスト最適化: 変換ロジックを増分化・ビュー化することで、下流の BigQuery コストを直接コントロールできる
- 信頼性: アサーションで不正データの混入を早期に検知し、依存グラフにより実行順序の取り違えを防ぐ
試験で問われるポイント
- Dataform は BigQuery 上の SQL 変換(ELT の T) を担う。取り込みやストリーミング処理は対象外で、それらは Data Transfer Service / Dataflow / Pub/Sub の役割
- dbt と同系統の SQL ベース変換ツールであり、Git によるバージョン管理・依存解決・テスト(アサーション)が特徴
- ref 関数でテーブルを参照すると依存関係が自動登録され、実行順序(DAG)が解決される
- 変換コストは BigQuery 側のクエリ・ストレージで発生し、Dataform 本体は原則追加料金なし
- 大規模な追記テーブルは 増分テーブルにしてスキャン量を抑えるのがコスト最適解
- 「SQL の変換をマネージドでバージョン管理したい」という要件文が出たら Dataform を選ぶ
関連サービス・比較
| 観点 | GCP(Dataform) | AWS(相当する選択肢) |
|---|---|---|
| 役割 | BigQuery 上の SQL 変換(ELT の T)を管理 | dbt Cloud / Glue でデータ変換を管理 |
| 変換の実行基盤 | BigQuery(クエリとして実行) | Redshift / Athena などのウェアハウス or Glue(Spark) |
| バージョン管理 | Git 連携が標準(外部プロバイダー可) | dbt も Git 連携、Glue は別途リポジトリ管理 |
| 品質テスト | アサーションを SQL で記述 | dbt のテスト機能に相当 |
| 主なコスト発生源 | 下流の BigQuery クエリ・ストレージ | ウェアハウスや Glue ジョブの実行課金 |
| 位置づけ | BigQuery ネイティブの変換オーケストレーション | dbt は中立、Glue は ETL 寄りの汎用処理 |
ハンズオン / CLI例
# 1) Dataform リポジトリを作成
gcloud dataform repositories create my-repo \
--region=asia-northeast1
# 2) リポジトリ一覧で確認
gcloud dataform repositories list \
--region=asia-northeast1
# 3) 開発用ワークスペースを作成(ここで SQLX を編集する)
gcloud dataform workspaces create dev \
--repository=my-repo \
--region=asia-northeast1
# 4) ワークスペース一覧を確認
gcloud dataform workspaces list \
--repository=my-repo \
--region=asia-northeast1
Google Cloud Service
Dataformを実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
分析
比較で見る軸
クラウド: Google Cloud / カテゴリ: 分析 / 難易度: basic
導入後に効く点
ワークフロー実行がBigQueryの更新順を制御する。
先に潰すリスク
サービス単体ではなく、権限、ネットワーク、監視、課金、バックアップを含めて設計する必要がある。
- クラウド
- Google Cloud
- カテゴリ
- 分析
- 難易度
- basic
- 関連資格
- —
- 設計柱
- operational
判断チェックリスト
- 自社の用途が「分析 / operational」に近いか確認する。
- 強みである「リポジトリのSQLXを依存DAGへコンパイルする。」が本当に評価軸になるか確認する。
- 注意点の「サービス単体ではなく、権限、ネットワーク、監視、課金、バックアップを含めて設計する必要がある。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。