🐧

Dataform さわってみた

2022/10/27に公開

はじめに

こんにちは、クラウドエースの松浦です。
今回は、パブリックプレビューとなった Dataform をさわってみたいと思います。
その上で、より肝になる機能についてピックアップできればと思います。

Dataform について(個人の感想)

Dataform を実際にさわる前に、
Dataform って何? という個人の感想と公式ドキュメントを案内したいと思います。

個人の感想は「SQLXという記載方式を使って、ウェブブラウザ上のUIからBigQueryでのデータ変換に関して色々管理できるサービス」となります。
さわってみた結果変わるかもしれないですが、大雑把には上記の認識でさわってみたいと思います。

公式ドキュメントは下記です。

https://cloud.google.com/dataform

どれをさわってみるか

どれをさわってみるかを考えた所、無難な
クイックスタートの内容(SQL ワークフローを作成して実行する)と、
Git リポジトリに接続する部分について進めていきます。

まとめ

それらを行ったまとめを先に記載します。

ワークフローを実行した際に、
依存関係の指定がないアクション(sqlx ファイルの内容)が同時に実行されるため
基本的に全てのアクションに何らかの形(ref・dependencies等)で依存関係を設定すべきと考えられます。

サードパーティの Git リポジトリ(GitHub)への接続では、
開発ワークスペース名(ワークスペースID)が、リモートブランチ名になるので
それも考慮して開発ワークスペース名を決定してもよいかなと思いました。

以下、実際の作業内容やエラーになった内容に続きます。

SQL ワークフローを作成して実行する

Dataform をさわるプロジェクト(課金が有効)を選択して、まず利用するAPIを有効にします。

  • BigQuery API
  • Dataform API

APIを有効

クイックスタートで必要なロールは、下記の2つになります。

  • roles/dataform.admin
  • roles/dataform.editor

Dataform リポジトリを作成する

Dataformページに移動して、「リポジトリを作成」を選択します。

リポジトリを作成1
リポジトリを作成2


  • リポジトリID:quickstart-repository
  • リージョン:europe-west4

で作成します。リージョンは、プレビュー時点だと europe-west4us-central1 が選択できました。
ここで作成したリポジトリを、後でサードパーティの Git リポジトリに接続します。

開発ワークスペースを作成して初期化する

作成した「quickstart-repository」のリポジトリを選択し、「開発ワークスペースを作成」を選択します。

  • ワークスペースID:quickstart-workspace

で作成します。

開発ワークスペースを作成1
開発ワークスペースを作成2



作成した「quickstart-workspace」のワークスペースを選択し、「ワークスペースを初期化」を選択します。

開発ワークスペースを初期化1

ビューを作成する

「definitions」のディレクトリを選択、 から「ファイルを作成」。

  • ファイルパス:definitions/quickstart-source.sqlx

でファイルを作成します。コードスニペットはクイックスタートのものと同じものを使います。

ビューを作成1
ビューを作成2

テーブルを定義する

「definitions」のディレクトリを選択、 から「ファイルを作成」。

  • ファイルパス:definitions/quickstart-table.sqlx

でファイルを作成します。コードスニペットはクイックスタートのものと同じものを使います。

テーブルを定義1

Dataformサービスアカウント に BigQuery へのアクセスを許可する

BigQueryでワークフローを実行するために、下記のDataformサービスアカウントに

  • 名前:Dataform Service Account
  • プリンシパル:service-{プロジェクト番号}@gcp-sa-dataform.iam.gserviceaccount.com

下記の3つのロールを割り当てます。

  • BigQuery ジョブユーザー(roles/bigquery.jobUser)
  • BigQuery データ編集者(roles/bigquery.dataEditor)
  • BigQuery データ閲覧者(roles/bigquery.dataViewer)

サービスアカウントにロール割り当て1

ワークフローを実行する

「quickstart-workspace」のワークスペースを選択し、
「実行を開始 > すべてのアクション > 実行を開始」を選択します。

ワークフローを実行1
ワークフローを実行2



Dataform はワークフローを実行することで、
BigQuery に dataform というデータセットを作成し、そこにコンテンツ(今回はView・Table)を作成します。

実行ログを表示する

下記のどちらかで確認します。

  • 「quickstart-workspace」のワークスペースを選択し、「実行ページに移動」
  • 「quickstart-repository」のリポジトリを選択し、「WORKFLOW EXECUTION LOGS」

実行ログを表示1
実行ログを表示2



開始時間から最新の実行ログを表示します。
ここでクイックスタート通りにやった場合、ほぼ必ず失敗することを確認しました。
dataform データセットを8回作成して、8回削除して確認

実行ログを表示3
実行ログを表示4



エラーメッセージ(失敗の理由)としては、Already Exists: Dataset です。
初期化で自動で作成される first_viewquickstart-source
同時に実行(作成)しようとしてデータセット作成の競合がでたと考えられます。

その対応として、definitions/first_view.sqlx のconfig部分に依存関係の下記1文を追加しました。
dependencies: [ "quickstart-source" ],

依存関係を追加1



これで quickstart-source の後に、first_view を作成するように指定できました。
追加後にデータセットを削除して、再度ワークフロー実行した所下記のように全て成功となりました。

ワークフローを実行3
ワークフローを実行4

サードパーティの Git リポジトリに接続する

次に、サードパーティのGitリポジトリに接続します。
下記のどちらかを選択できますが、今回は GitHub を選択します。

  • GitHub
  • GitLab

Secret Manager でシークレットを作成する

Dataform からリモートリポジトリへの接続(リンク)を作成するために
Secret Manager で Secret を作成する必要があります。

まずは GitHub で、Personal access tokenを生成(generate)します。
生成した personal access token はコピーしておきます。

Secret Managerから、下記情報でシークレットを作成します。

  • 名前:Dataform_secret
  • シークレットの値:コピーしてある personal access token

シークレットを作成1



作成したシークレットにアクセスできるように、Dataform サービスアカウントに下記ロールを割り当てます。

  • 名前:Dataform Service Account
  • プリンシパル:service-{プロジェクト番号}@gcp-sa-dataform.iam.gserviceaccount.com
  • ロール:Secret Manager のシークレット アクセサー(roles/secretmanager.secretAccessor)

シークレットを作成2

Dataform リポジトリを接続する

接続(リンク)するリモートリポジトリ(今回は GitHub)を、作成しておきます。
作成したリポジトリの https 接続のURLをコピーしておきます。

クイックスタートで作成してある
Dataform リポジトリ(quickstart-repository)を選択して「GITと接続」をし
下記情報で、「リンク」します。

  • リモートの Git リポジトリの URL:コピーしておいた https 接続のURL
  • デフォルトのブランチ名:main
  • シークレット:Dataform_secret

リポジトリを接続1
リポジトリを接続2



接続(リンク)が完了したら、ワークスペース quickstart-workspace を選択し、
COMMIT を実行します。(commit メッセージを指定)
リモートブランチ(quickstart-workspace)とデフォルトブランチ(main)にも push を実行します。
これで、ワークスペースが最新の状態となりました。

リポジトリを接続3
リポジトリを接続3

おまけ(Dataform SQL ワークフローのスケジュール実行)

おまけとして、下記を参考に Dataform SQL ワークフローのスケジュール実行を設定します。

ワークフロー(Workflows) と Cloud Scheduler を使用して、スケジュール実行する

ワークフロー(Workflows)Cloud Scheduler の認証に使用するサービスアカウント(workflow-exec)を作成し、下記ロールを割り当てます。

  • Dataform 編集者(roles/dataform.editor)
  • サービス アカウント ユーザー(roles/iam.serviceAccountUser)
  • ログ書き込み(roles/logging.logWriter)
  • ワークフロー起動元(roles/workflows.invoker)

スケジュール実行1



ワークフローを下記のように設定し、トリガーで Cloud Scheduler を利用する形で作成します。
今回の設定では、毎時00分(1時間に1回)の実行にしました。

スケジュール実行2



ワークフローの定義は、ドキュメントベースで設定します。
リポジトリやリポジトリの場所は、クイックスタートで作成した quickstart-repository を使いました。
実行する Git ブランチは main を指定し、デプロイをしました。

スケジュール実行3



デプロイ後にトリガーでの実行を待った結果、正常にスケジュール実行されたことを確認しました。

スケジュール実行4
スケジュール実行5
スケジュール実行6

参考ドキュメント

  • Google Cloud の Dataform ガイド(Guides)

https://cloud.google.com/dataform/docs/overview

Discussion