Dataform さわってみた
はじめに
こんにちは、クラウドエースの松浦です。
今回は、パブリックプレビューとなった Dataform をさわってみたいと思います。
その上で、より肝になる機能についてピックアップできればと思います。
Dataform について(個人の感想)
Dataform を実際にさわる前に、
Dataform って何? という個人の感想と公式ドキュメントを案内したいと思います。
個人の感想は「SQLXという記載方式を使って、ウェブブラウザ上のUIからBigQueryでのデータ変換に関して色々管理できるサービス」となります。
さわってみた結果変わるかもしれないですが、大雑把には上記の認識でさわってみたいと思います。
公式ドキュメントは下記です。
どれをさわってみるか
どれをさわってみるかを考えた所、無難な
クイックスタートの内容(SQL ワークフローを作成して実行する)と、
Git リポジトリに接続する部分について進めていきます。
まとめ
それらを行ったまとめを先に記載します。
ワークフローを実行した際に、
依存関係の指定がないアクション(sqlx ファイルの内容)が同時に実行されるため
基本的に全てのアクションに何らかの形(ref・dependencies等)で依存関係を設定すべきと考えられます。
サードパーティの Git リポジトリ(GitHub)への接続では、
開発ワークスペース名(ワークスペースID)が、リモートブランチ名になるので
それも考慮して開発ワークスペース名を決定してもよいかなと思いました。
以下、実際の作業内容やエラーになった内容に続きます。
SQL ワークフローを作成して実行する
Dataform をさわるプロジェクト(課金が有効)を選択して、まず利用するAPIを有効にします。
- BigQuery API
- Dataform API
クイックスタートで必要なロールは、下記の2つになります。
- roles/dataform.admin
- roles/dataform.editor
Dataform リポジトリを作成する
Dataformページに移動して、「リポジトリを作成」を選択します。
- リポジトリID:
quickstart-repository
- リージョン:
europe-west4
で作成します。リージョンは、プレビュー時点だと europe-west4
と us-central1
が選択できました。
ここで作成したリポジトリを、後でサードパーティの Git リポジトリに接続します。
開発ワークスペースを作成して初期化する
作成した「quickstart-repository」のリポジトリを選択し、「開発ワークスペースを作成」を選択します。
- ワークスペースID:
quickstart-workspace
で作成します。
作成した「quickstart-workspace」のワークスペースを選択し、「ワークスペースを初期化」を選択します。
ビューを作成する
「definitions」のディレクトリを選択、︙
から「ファイルを作成」。
- ファイルパス:
definitions/quickstart-source.sqlx
でファイルを作成します。コードスニペットはクイックスタートのものと同じものを使います。
テーブルを定義する
「definitions」のディレクトリを選択、︙
から「ファイルを作成」。
- ファイルパス:
definitions/quickstart-table.sqlx
でファイルを作成します。コードスニペットはクイックスタートのものと同じものを使います。
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)
ワークフローを実行する
「quickstart-workspace」のワークスペースを選択し、
「実行を開始 > すべてのアクション > 実行を開始」を選択します。
Dataform はワークフローを実行することで、
BigQuery に dataform
というデータセットを作成し、そこにコンテンツ(今回はView・Table)を作成します。
実行ログを表示する
下記のどちらかで確認します。
- 「quickstart-workspace」のワークスペースを選択し、「実行ページに移動」
- 「quickstart-repository」のリポジトリを選択し、「WORKFLOW EXECUTION LOGS」
開始時間から最新の実行ログを表示します。
ここでクイックスタート通りにやった場合、ほぼ必ず失敗することを確認しました。
※dataform
データセットを8回作成して、8回削除して確認
エラーメッセージ(失敗の理由)としては、Already Exists: Dataset
です。
初期化で自動で作成される first_view
と quickstart-source
が
同時に実行(作成)しようとしてデータセット作成の競合がでたと考えられます。
その対応として、definitions/first_view.sqlx
のconfig部分に依存関係の下記1文を追加しました。
dependencies: [ "quickstart-source" ],
これで quickstart-source
の後に、first_view
を作成するように指定できました。
追加後にデータセットを削除して、再度ワークフロー実行した所下記のように全て成功となりました。
サードパーティの 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
作成したシークレットにアクセスできるように、Dataform サービスアカウントに下記ロールを割り当てます。
- 名前:
Dataform Service Account
- プリンシパル:
service-{プロジェクト番号}@gcp-sa-dataform.iam.gserviceaccount.com
- ロール:
Secret Manager のシークレット アクセサー(roles/secretmanager.secretAccessor)
Dataform リポジトリを接続する
接続(リンク)するリモートリポジトリ(今回は GitHub
)を、作成しておきます。
作成したリポジトリの https 接続のURLをコピーしておきます。
クイックスタートで作成してある
Dataform リポジトリ(quickstart-repository
)を選択して「GITと接続」をし
下記情報で、「リンク」します。
- リモートの Git リポジトリの URL:
コピーしておいた https 接続のURL
- デフォルトのブランチ名:
main
- シークレット:
Dataform_secret
接続(リンク)が完了したら、ワークスペース quickstart-workspace
を選択し、
COMMIT を実行します。(commit メッセージを指定)
リモートブランチ(quickstart-workspace
)とデフォルトブランチ(main
)にも push を実行します。
これで、ワークスペースが最新の状態となりました。
おまけ(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)
ワークフローを下記のように設定し、トリガーで Cloud Scheduler を利用する形で作成します。
今回の設定では、毎時00分(1時間に1回)の実行にしました。
ワークフローの定義は、ドキュメントベースで設定します。
リポジトリやリポジトリの場所は、クイックスタートで作成した quickstart-repository
を使いました。
実行する Git ブランチは main
を指定し、デプロイをしました。
デプロイ後にトリガーでの実行を待った結果、正常にスケジュール実行されたことを確認しました。
参考ドキュメント
- Google Cloud の Dataform ガイド(Guides)
Discussion