Dataformを徹底解説

記事タイトルとURLをコピーする

G-gen 又吉です。Google Cloud (旧称 GCP) のデータ変換パイプラインツールである Dataform を解説します。

概要

Dataform とは

Dataform とは、BigQuery のためのフルマネージドなデータパイプライン管理ツールです。任意の SQL を実行し、テーブル間の依存関係を維持しながら テーブルやビューをテスト・開発・デプロイすることができます。

Dataform は ELT (Extract/Load/Transform) のうちの Transform を管理するためのツールである、と言えます。また、完全にサーバーレスであり、基盤の管理は必要ありません。また利用料金が無償であることも特徴です。

Dataform は 2022/08/25 に Preview 公開され、2023/05/04 に GA となりました。

ELT 処理の例

特徴とメリット

従来、BigQuery 上で SQL を組み合わせてデータ変換を実装しようとすると、複数の スケジュールされたクエリ (Scheduling queries) や ストアド・プロシージャでクエリを定義し、それらの依存関係を管理するための仕組みとして Cloud Workflows などのワークフローツールを使うか、dbt Cloud のような外部 SaaS ツールを使用するなどの工夫が必要でした。

Dataform は独自のスケジューラを有しています。また SQL ワークフローの開発に Dataform core というオープンソースのメタ言語を使用しており、このツールを使うことで、複数の SQL 間の依存関係を管理することができます。さらに、データの品質テストを行ったり、テーブルやフィールドの文書化を行うなどの機能も提供しています。これにより、BigQuery 上で行うデータ変換パイプラインが効率化され、開発スピードの向上と運用負荷の軽減に繋がります。

また Dataform は Git 統合されており、バージョン管理とチームによる SQL ワークフローの共同開発が可能です。

料金

Dataform の利用自体は無料です。

ただし、BigQuery でクエリを実行したり、データ変換パイプラインを構成するために Cloud Composer や Cloud Workflows を利用する際は、別途使用したリソースに対して課金されます。

Dataform のコンポーネント

コンポーネント構成

Dataform のコンポーネント全体像は、以下のように図示されます。

リポジトリと開発ワークスペースの関係性

リポジトリ

リポジトリとは

Dataform で SQL ワークフローを開発する際、まず リポジトリ を作成します。リポジトリとは SQL ワークフローを構成する SQLX ファイル および JavaScript ファイルや Dataform 設定ファイル、パッケージ定義ファイルが格納するためのファイルリポジトリであり、その実体は Dataform 側で管理されている Git リポジトリです。

リポジトリ内のファイル操作は 開発ワークスペース の中で行います。

各リポジトリは Dataform 内部の Git リポジトリと統合されており、バージョン管理されます。また Dataform リポジトリを GitHub または GitLab リポジトリに接続可能です。

ファイル構成

リポジトリは以下の種別のファイルで構成されています。

  • Config files : JSON またはSQLX ファイル。一般的な設定・実行スケジュール等
  • Definitions : SQLX および JavaScript ファイル。テーブル/ビュー定義・SQL オペレーションの定義
  • Includes : JavaScript ファイル。変数や関数の定義

SQLX とはオープンソースの、SQL の拡張言語です。Dataform ではメタ言語 Dataform core でワークフローを記述しますが、その記述は主に SQLX で記述されることに加え、再利用可能な関数を JavaScript で定義可能です。つまり Dataform core は SQLX と JavaScript で構成されている、と考えることができます。

開発ワークスペース

開発ワークスペースとは

開発ワークスペース とは、リポジトリ内のファイルを編集・開発するための開発環境の定義です。チームで共同開発を行う際、Git でブランチを切って開発を行うのと同じように、開発ワークスペースを分けてファイル編集を行い、変更を commit/push することができます。

Git ブランチと同様、ある開発スペースで行ったファイルへの変更は、他の開発ワークスペースに影響しません。

開発ワークスペースの初期化

リポジトリを作成すると、最初はファイルが一つも登録されておらず、また開発ワークスペースも存在しません。

最初の開発ワークスペースを作成し、初期化 (Initialize) を行うと、最小限の構成でファイルが生成されます。以後、これらのファイル群を編集してワークフローを開発していきます。

.
├── definitions/
├── includes/
├── dataform.json
└── package.json
No ディレクトリ or フォルダ 概要
1 definitions/ アセットを定義する SQLX もしくは JavaScript ファイルを格納するディレクトリ
2 includes/ リポジトリ全体で再利用可能なスクリプトと変数を格納するディレクトリ
3 dataform.json アセットをデプロイするプロジェクト ID と BigQuery スキーマを含むデフォルトの Config file
4 package.json デフォルトの依存関係ファイル

開発手法

開発ワークスペースではバックエンドで Git が利用されていることから、開発フローは Git でのそれと同じです。

開発ワークスペース上でファイルを編集したうえで、ワークスペースのローカルブランチに コミット を行うことで変更を確定できます。後から過去にコミットしたリビジョンへ巻き戻すことも可能です。

またワークスペースにコミットを行うと デフォルトブランチ (GitHub 等外部リポジトリと連携している場合はトラック対象リポジトリ) との差分が発生します。このデフォルトブランチは一般的な Git での main ブランチに相当します。デフォルトブランチへ push を行うことができ、逆にデフォルトブランチから開発ワークスペースに pull を行うことも可能です。

リリース設定 (release configuration)

リリース設定 (release configuration) は SQL ワークフローのコンパイル作業を定義する設定です。

Dataform は、Dataform core (SQLX ファイル) で定義されたワークフローを実行する際に、コンパイルし SQL 化して BigQuery に投入します。コンパイル結果は compilation result というオブジェクトとなります。

デフォルトでは dataform.json に記載したプロジェクト ID や BigQuery のスキーマ情報等のパラメータが自動的に適用されますが、リリース設定ではこれをカスタマイズすることができます。リリース設定の作成はオプショナルであり、必須ではありません。

リリース設定の利用シーンとしては、同一の SQLX ファイルから複数環境向けに複数パターンの SQL を生成したい時が挙げられます。例えば、環境毎 (prod, dev) のパラメータをリリース設定のコンパイル変数に設定することで、Dataform 設定ファイルのパラメータをオーバーライドして SQL がコンパイルされ、環境別に異なるパラメータの SQL が生成されます。

アクセス制御

Dataform のアクセス制御

Dataform 自体のアクセス制御は Cloud IAM で行われます。

Google Cloud により事前定義ロールが用意されており、開発者の Google アカウントにプロジェクトレベルで適切なロールを付与することで、Dataform へのアクセス制御が可能です。

ロール名 ロール ID 説明
Dataform 管理者 roles/dataform.admin Dataform リソースへのフルアクセス権限
Dataform 編集者 roles/dataform.editor リポジトリの読み取りとワークスペースへの編集権限
Dataform 閲覧者 roles/dataform.viewer Dataform リソースへの読み取り権限

Dataform から BigQuery へのアクセス制御

次に、Dataform 自体ではなく、Dataform から BigQuery へのアクセス制御について説明します。

Dataform が BigQuery に対してワークフローを実行するには、必要な権限を Dataform サービスアカウントに対し 付与する必要があります。

Dataform サービスアカウントは Dataform がバックエンドで用いるサービスアカウントであり サービスエージェント の一種です。最初の Dataform リポジトリを作成すると、以下の名称で自動的に作成されます。

service-${プロジェクト番号}@gcp-sa-dataform.iam.gserviceaccount.com

例えばある Dataform から、あるプロジェクトの BigQuery の全テーブルに対し読み書きを許可したい場合は、プロジェクトレベルで BigQuery データ編集者 (roles/bigquery.dataEditor) と BigQuery ジョブユーザー (roles/bigquery.jobUser) のロールを付与します。

より権限範囲を絞るため、特定のデータセットまたはテーブルに対して BigQuery IAM 権限を付与することも可能です。

BigQuery のアクセス制御と権限設計については以下の記事で詳細に解説されています。

blog.g-gen.co.jp

Dataform core と SQL

Dataform core / SQLX とは

Dataform core はオープンソースのメタ言語であり、Dataform での SQL ワークフロー開発に利用されます。

Dataform core は主に SQLX で記述されます。SQLX はオープンソースの、SQL の拡張言語です。Dataform core を構成するファイルを SQLX ファイル と呼びます。

また JavaScript ブロックを SQLX ファイルの中に記述することで、再利用可能な関数を定義可能です。

つまり Dataform core は SQLX と JavaScript で構成されており、SQLX ファイルに記述するものである、と言うことができます。

Dataform core の機能

Dataform core では、以下のような定義が可能です。

  • BigQuery で実行される SQL の依存関係を管理
  • データの条件を予め定義し、条件に違反したデータが入力された場合に検知
  • テーブルと列の説明を記述
  • 異なるクエリ間で関数や変数を再利用

このような特徴を活かし、ガバナンスを効かせたデータ変換パイプラインを構築することができます。

SQLX ファイル

ファイル構成

SQLX ファイルはテキストファイルです。大きく config ブロックと body ブロックに分かれています。

SQLX ファイルの例

config ブロック

config ブロックでは、出力テーブルタイプやラベルなどの構成メタデータを記述します。config ブロックで定義できる主要なオプションを以下に記載します。

No オプション 概要 備考
1 type 出力テーブル タイプを指定 テーブル (table)、増分テーブル (incremental) 、ビュー (view) 、マテリアライズド ビュー (materialized) をサポートしています
2 schema スキーマを指定 スキーマとは、BigQuery データセットを示します
3 tags ユーザー定義タグのリスト 例えば、"daily"のタグが付いたアクションのみをワークフローとして実行したい場合などのユースケースで利用できます
4 description テーブルの説明 -
5 columns テーブル内の各列の説明 -
6 bigquery BigQuery 固有のウェアハウス オプションを指定 例えば、テーブルの パーティショニングやクラスタリング を定義できます
7 assertions 指定された 1 つ以上のルールに違反する行が検出可能 一意性、null 値、またはカスタム条件を定義し、違反した行を検知できます
8 dependencies config ブロックで依存関係を定義 body ブロックの SQL 内で依存関係が定義されてない場合でも依存関係を定義できます

body ブロック

body ブロックでは、主に SQL を定義します。Dataform core の組み込み関数等が利用可能です。body ブロックで実行できる主要なアクションを以下に記載します。

No アクション 概要 備考
1 依存関係の定義 ref 関数 を用いて Dataform で定義されたテーブルが参照可能 ref 関数を用いたクエリは、ref 関数で指定したテーブル作成後に実行されるため依存関係が確立されます
2 追加の SQL 操作を定義 クエリ前またはクエリ後に 1 つ以上の SQL を実行可能 (例) 先程の SQLX ファイルの例 44〜46 行目では、クエリ後のデータセットに対して閲覧者権限を付与する GRANT 文を記述しています
3 Java Script で SQL を生成 Java Scrept を用いて再利用可能な関数が定義可能 (カプセル化) 例えば、複数の SQLX ファイルで実行される SQL をカプセル化することで、SQL に修正が発生してもカプセル化したソースのみを修正するだけで済みます (保守性の向上)

データソースの宣言

Dataform では、BigQuery テーブルをデータソースとして宣言できます。SQLX ファイルでは、以下のように記述します。

config {
  type: "declaration",
  database: ${PROJECT_ID},  
  schema: ${DATASET_NAME},
  name: ${TABLE_NAME},
}
No オプション名 概要
1 type declaration を記述
2 database BigQuery が属するプロジェクト ID
3 schema データソースが存在する BigQuery データセットを入力
4 name データ ソースとして使用するテーブルまたはビューの名前を入力

ワークフローの実行

実行契機 (トリガ)

Dataform の SQL ワークフローは以下をトリガにして実行することが可能です。

  • 自動
  • 手動
    • Google Cloud コンソール
    • Dataform CLI
    • Dataform クライアントライブラリ
    • REST API

定期実行 (workflow configurations)

Dataform 内で定期実行を行いたい場合に一番シンプルなのは workflow configurations を用いたスケジュールによる定期的な実行です。

workflow configurations は Dataform に組み込みのスケジューラです。workflow configurations 作成時は リリース設定 (release configuration) と実行対象の SQL ワークフローを選択し、スケジュールを設定します。

workflow configurations による定期実行の例

定期実行 (他のワークフローツール)

より大きなデータパイプラインが存在し、Dataform はその中での一要素である場合、他のワークフロー管理ツールから API 経由で Dataform ワークフローを実行することも検討します。

以下は、Cloud Workflows から Dataform のワークフローを呼び出す例です。Google Cloud サービスの中では他に Cloud Composer なども考えられます。

Cloud Workflows と Cloud Scheduler を使用した定期実行の例

ロギング

実行ログ

Dataform は Cloud Logging と統合されています。

ワークフローの実行ログは自動的に Cloud Logging に出力されます。タイムスタンプ、レポジトリ ID、終了コードなどが記録されます。

ログ監視・通知

ログ監視によりワークフローの異常終了時にメールや Slack へ通知することも可能です。Cloud Logging の「ログベースの指標 + アラートポリシー」か「ログベースのアラート」機能で、ログ監視と通知を実装できます。

監査ログ

Dataform では監査ログも自動的に取得されます。Cloud Audit Logs の機能により監査ログが取得され、Cloud Logging に保存されます。

リポジトリや開発ワークスペースに対する作成、削除などの更新系操作はデフォルトで記録されます。

Git に関するコミット操作やファイル関連の操作はデータアクセス監査ログと呼ばれ、明示的に有効化する必要があります。

開発体験

コードの編集

開発ワークスペース Web UI の CODE タブでは、リポジトリ内の SQL ワークフローの開発ができます。

CODE の画面例

また、開発中の SQL ワークフローを手動でコンパイルし実行することも可能です。その際、すべてもしくは一部のアクションのみを選択して実行したり、タグを指定して実行することもできます。

DAG の表示

Web UI の COMPILED GRAPH タブでは、開発ワークスペースで定義された SQL ワークフローを directed acyclic graph (DAG) として表示できます。

DAG で可視化することで SQL の依存関係が一目でわかります。

DAG の例

実行ログの表示

実行された SQL ワークフローの実行ログは、Cloud Logging のログエクスプローラで確認できるほか、開発ワークスペース画面でも表示できます。

SQL ワークフローの詳細からは、各アクションのステータスや実行したクエリが確認でき、特定のアクションでエラーが発生した場合はそのエラーの理由を表示してくれます。

Dataform CLI

ここまで紹介した Google Cloud の Dataform は、もともとオープンソースであった Dataform のフルマネージドサービスです。一方で、オープンソース版の Dataform CLI も引き続き存在します。

オープンソース版 Dataform CLI を利用すると、Google Cloud 環境外で Dataform を利用することができます。オープンソース版は、以下のようなデータベースに対応しています。

  • BigQuery
  • Snowflake
  • Redshift
  • Azure SQL Data Warehouse
  • PostgreSQL

Dataform CLI の使用方法については、以下のドキュメントをご参照ください。

注意点と Tips

CMEK は非対応

2023年5月現在、Dataform は顧客管理の暗号鍵 (CMEK) で暗号化された BigQuery データセット・テーブルに対応していません。

VPC Service Controls は非対応

2023年5月現在、Dataform は VPC Service Controls の境界 (perimeter) で保護されたプロジェクト内の BigQuery に対応していません。

Dataform を使用するには、BigQuery リソースを含むプロジェクトを VPC Service Controls 境界から除外するか、Dataform CLI を用いてユーザー管理の環境から SQL ワークフローを実行する必要があります。

リポジトリ構成の考えかた

小規模の開発であれば SQL ワークフロー単位で一つのリポジトリを作成することが推奨されます。

しかし、リポジトリサイズが大きくなり、開発メンバーが増えるにつれ、以下のようなデメリットが生まれます。

  • マージ時のコンフリクト
  • 可読性の低下
  • パフォーマンスの低下
  • クォータ制限に当たりやすくなる

このような場合は、リポジトリの分割を検討します。しかし、リポジトリ分割には依存関係が分かりづらくなったり、ワークフロー実行スケジューリングの管理オーバヘッドの増加などデメリットもあるため、メリット / デメリットを把握してリポジトリ構成を設計する必要があります。

公式のサンプルコード

様々なユースケースに応じたサンプルコードが公式に用意されていますのでご参照ください。

参考 : Sample Dataform scripts

又吉 佑樹(記事一覧)

クラウドソリューション部

はいさい、沖縄出身のクラウドエンジニア!

セールスからエンジニアへ転身。Google Cloud 全 11 資格保有。Google Cloud Champion Innovator (AI/ML)。Google Cloud Partner Top Engineer 2024。Google Cloud 公式ユーザー会 Jagu'e'r でエバンジェリストとして活動中。好きな分野は AI/ML。