WorkflowsからDataformを起動してみた

WorkflowsからDataformを起動してみた

WorkflowsからDataformの起動方法を検証してみました。Dataformタグ指定、コンパイル変数のWorkflowsからの上書きができるか、もあわせて検証してみました。
Clock Icon2024.05.04

データアナリティクス事業本部の根本です。WorkflowsからDataformを起動してみました。とっても便利なDataformですが、WorkflowsからDataformが起動できるとDataformの活用の幅が一段と広がると思います。
さらに活用の幅を広げるためにいくつか検証してみました!

この記事の対象者

  • DataformをWorkflowsから起動したいひと

前提条件

  • Dataform、Workflowsが使用できること。
  • Dataformワークスペース、リポジトリが作成済みであること

検証の全体像

  • DataformのワークフローをWorkflowsから起動できるかどうか
  • Dataformのワークフローをタグ指定で起動できるかどうか
  • Dataformのワークフローをコンパイル変数をWorkflowsで上書きして起動できるか

上記の3点を検証していきます。

やってみる

まずはDataformの準備をします。実行するSQLXとdataform.jsonファイルを作成します。

config { 
    type: "view",
    tags: ["dataform_tag_test"]
}
SELECT ${dataform.projectConfig.vars.compile_val} AS compile_col

上記SQLXファイル(workflows_call_test.sqlx)は、実行するとBig Queryのデータセット内にworkflows_call_testという名前でViewを作成します。

{
  "defaultSchema": "データセット名",
  "assertionSchema": "dataform_assertions",
  "warehouse": "bigquery",
  "defaultDatabase": "プロジェクトID",
  "defaultLocation": "asia-northeast1",
  "vars": {"compile_val":"'workflows_test'"}
}

dataform.jsonファイルでは、コンパイル変数で変数名compile_valとしてworkflows_testという文字列をデフォルト値に設定しています。
注意点として、コンパイル変数の値として文字列を設定するときはダブルクォーテーションで囲んだ後にシングルクォーテーション囲む必要があります。
dataform.jsonファイル内で、コンパイル変数に設定する値をダブルクォーテーションのみで文字列を囲み値を設定してしまうと、SQLXファイルの実行に失敗します。

"vars": {"compile_val":"workflows_test"}

Unrecognized name: workflows_test at [2:8]

SQLX中でコンパイル変数を使用するときはSQLX内で、JavaScriptの変数として使用するのですがコンパイル変数の宣言時に"workflows_test"で初期化をするとSQLX実行時には以下の状態となります。

SELECT workflows_test AS compile_col

workflwos_testという変数として扱われてしまうため、認識できない名前です、というようなエラーメッセージが出力されて実行に失敗します。
変数として解釈されないように文字列にしたいので、コンパイル変数の宣言時に"'workflows_test'"というようにシングルクォーテーションで囲み初期化をすると

SELECT 'workflows_test' AS compile_col

文字列'workflows_test'として解釈されるため、SQLXの実行に成功します。
ちょっとした詰まりポイントかなと、個人的には思います。

Dataformワークフローをそのまま実行してみる

準備が整ったので検証を開始します。
まずはDataformをブランチ名指定で呼び出して実行します。
以下がWorkflowsのファイル内容です(公式リファレンス)をもとに作成しています)。DataformのAPI実行の流れが不明な場合はこちらをご参照ください。

main:
    steps:
    - init:
        assign:
        - repository: projects/*プロジェクトID*/locations/asia-northeast1/repositories/*リポジトリ名*
    - createCompilationResult:
        call: http.post
        args:
            url: ${"https://dataform.googleapis.com/v1beta1/" + repository + "/compilationResults"}
            auth:
                type: OAuth2
            body:
                gitCommitish: "main"
        result: compilationResult
    - createWorkflowInvocation:
        call: http.post
        args:
            url: ${"https://dataform.googleapis.com/v1beta1/" + repository + "/workflowInvocations"}
            auth:
                type: OAuth2
            body:
                compilationResult: ${compilationResult.body.name}

gitCommitish: "main"にて、mainブランチを指定してコンパイルを行っています。
Workflowsを実行して成功していたので、Big Queryのコンソールから確認してみます。

View名:workflows_call_test
列の値:workflows_test
となっておりました。workflows_testはdataform.jsonで宣言したコンパイル変数の値なので期待通りの結果でした!

タグ指定してDataformワークフローを起動してみる

通常の起動が成功したので、続いてタグ指定でDataformワークフローを起動してみます。

main:
    steps:
    - init:
        assign:
        - repository: projects/*プロジェクトID*/locations/asia-northeast1/repositories/*リポジトリ名*
    - createCompilationResult:
        call: http.post
        args:
            url: ${"https://dataform.googleapis.com/v1beta1/" + repository + "/compilationResults"}
            auth:
                type: OAuth2
            body:
                gitCommitish: "main"
        result: compilationResult
    - createWorkflowInvocation:
        call: http.post
        args:
            url: ${"https://dataform.googleapis.com/v1beta1/" + repository + "/workflowInvocations"}
            auth:
                type: OAuth2
            body:
                compilationResult: ${compilationResult.body.name}
                invocationConfig:
                        includedTags:
                        - "dataform_tag_test"

Dataformワークフロー呼び出し時の設定を追加しました。具体的には以下の箇所です。

invocationConfig:
        includedTags:
        - "dataform_tag_test"

invocationConfigにて呼び出し時の設定でタグdataform_tag_testを指定しています。   Workflowsを実行して成功していたので、実際にタグ指定で起動できたのかDataformの実行結果画面から確認してみます(今回の実装だと実行結果は同じViewが作成されるだけなので)。 実行結果画面にてタグ: dataform_tag_testとしてワークフローが起動されていることが確認できました。期待通りの結果です。

コンパイル変数の値を上書きしてDataformワークフローを実行してみる

最後に、Workflows側でコンパイル変数の値を上書きしてDataformワークフローを起動してみます。

main:
    steps:
    - init:
        assign:
        - repository: projects/*プロジェクトID*/locations/asia-northeast1/repositories/*リポジトリ名*
    - createCompilationResult:
        call: http.post
        args:
            url: ${"https://dataform.googleapis.com/v1beta1/" + repository + "/compilationResults"}
            auth:
                type: OAuth2
            body:
                gitCommitish: "main"
                codeCompilationConfig: {
                    vars: {
                        compile_val:"'dataform_test'"
                    }
                }
        result: compilationResult
    - createWorkflowInvocation:
        call: http.post
        args:
            url: ${"https://dataform.googleapis.com/v1beta1/" + repository + "/workflowInvocations"}
            auth:
                type: OAuth2
            body:
                compilationResult: ${compilationResult.body.name}

コンパイル時に、コンパイル変数を設定する処理を追加しました。具体的には以下の箇所です。

codeCompilationConfig: {
    vars: {
        compile_val:"'dataform_test'"
    }
}

dataform_testという値を、コンパイル変数(compile_val)に設定しています。compile_valの初期値はworkflows_testを設定していましたが、今回のWorkflows実行時にはdataform_testを設定して上書きをしています。
Workflowsを実行して成功していたので、Big QueryのViewを確認してみます。

dataform_testが値に設定されていることが確認できました。この値はWorkflowsの処理でコンパイル変数へ設定していた値です。
よってコンパイル変数をWorkflows実行時に上書きしてDataformワークフローを実行できることが無事確認できました!

おわりに

今回のWorkflowsからのDataform検証を通して、以下のことが確認できました。

  • WorkflowsからDataformワークフローを起動できる
  • WorkflowsからDataformワークフローをタグ指定で起動できる
  • WorkflowsからDataformワークフローのコンパイル変数を上書きして起動できる

Dataformを用いて処理を行う場合に、Workflowsから扱うことができ、且つコンパイル変数を上書きして使うことができる、タグ指定で実行できるというのはとても心強い機能だと思います。今後Dataform、Workflowsを活用していく上で活かしていきたいと思います。
この記事が誰かのお役に立てば幸いです。それではまた。

参考

Workflowsリファレンス
カスタム コンパイル変数を作成する
コンパイル実行APIのリファレンス
Dataformワークフロー実行APIのリファレンス

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.