ワークフローの記述法について

ワークフローの記述法について

2024/07/09 更新

概要

Earkのワークフローは Google Cloud Workflows を採用しております。

Workflowsでの記述法はEarkのワークフローでそのまま使用可能ですが、以下の制約がございます。

  • Yamlの本文は必ず以下のように main:steps: から始めること。
main:
  steps:

これは後でご説明するEark独自の記述を変換するために必要となります。 このルールを無視した場合は正しく動作しない場合があります。

下記は、ワークフローの基本的な記述になります。

main:
  steps:
    - sample_step1:
       # なんらかの処理1(例。S3のデータをGCSにコピー)
    - sample_step2:
       # なんらかの処理2(例。GCSのデータをBigQueryにロード)
    - sample_step3:
       # なんらかの処理3(例。BigQueryのデータのレコードを確認)

基本的に steps: 以下の各stepが1つの処理のイメージになります。 上記の例ですと全部で3stepあり、それぞれ上から順に実行され、途中で何かのエラーがある場合はそこで処理が止まります。

yamlの記述法次第では分岐やgotoのようなことも可能です。 詳しくは公式ドキュメントをご参考ください。

Google Cloud Platform内であれば公式のコネクターも用意されていますので、使う用途に応じて使用してください。

公式のコネクター一覧

Earkの独自記述法について

Eark内で定義したコネクター(Embulk)やスクリプト(Python)をワークフローで回す場合は通常の Google Cloud Workflows の記述法とは異なるEarkの独自の記述法に従い作成する必要があります。 コネクターやスクリプトの実行する場合の例は以下をご参考ください。

コネクターの実行

Eark内にコネクターを作成していることを前提とします。 作成したコネクターの名前をここでは sample_connector_1 とします。

以下、sample_connector_1 をワークフローで実行する例となります。

main:
  steps:
    # "CONNECTOR_"はこれからコネクターを回すとの約束語です。"CONNECTOR_"以降は自由に命名してください
    - CONNECTOR_test1:
        # nameは実行するコネクター名をいれてください
        name: "sample_connector_1"
        # completeは "CONNECTOR_test1" のstepが完了した後、どのstepと繋ぐかの設定になります。
        # completeは必ず必要ですので1つのコネクターを回す場合は最低でもstep数を2個以上にしてください。
        # 今のcomplete設定ですと、"sample_connector_1" が完了した後は "hogehoge2" のstepに飛ばします。(この場合、hogehoge1のstepは無視されます。)
        complete: "hogehoge2"
    - hogehoge1:
        call: sys.log
        args:
          text: "hogehoge1のstepです。"
    - hogehoge2:
        call: sys.log
        args:
          text: "hogehoge2のstepです。"

説明をなくしてYamlだけ記載しますと以下のようになります。

main:
  steps:
    - CONNECTOR_test1:
        name: "sample_connector_1"
        complete: "hogehoge2"
    - hogehoge1:
        call: sys.log
        args:
          text: "hogehoge1のstepです。"
    - hogehoge2:
        call: sys.log
        args:
          text: "hogehoge2のstepです。"

スクリプトの実行

コネクターの実行と同様にEark内にコネクターを作成していることを前提とします。 作成したコネクターの名前をここでは sample_script_1 とします。

以下、sample_script_1 をワークフローで実行する例となります。

main:
  steps:
    # "PYTHON_"はこれからスクリプト(python)を回すとの約束語です。"PYTHON_"以降は自由に命名してください
    - PYTHON_test1:
        # nameは実行するコネクター名をいれてください
        name: "sample_script_1"
        # completeは "PYTHON_test1" のstepが完了した後、どのstepと繋ぐかの設定になります。
        # completeは必ず必要ですので1つのコネクターを回す場合は最低でもstep数を2個以上にしてください。
        # 今のcomplete設定ですと、"sample_script_1" が完了した後は "hogehoge2" のstepに飛ばします。(この場合、hogehoge1のstepは無視されます。)
        complete: "hogehoge2"
    - hogehoge1:
        call: sys.log
        args:
          text: "hogehoge1のstepです。"
    - hogehoge2:
        call: sys.log
        args:
          text: "hogehoge2のstepです。"

説明をなくしてYamlだけ記載しますと以下のようになります。

main:
  steps:
    - PYTHON_test1:
        name: "sample_script_1"
        complete: "hogehoge2"
    - hogehoge1:
        call: sys.log
        args:
          text: "hogehoge1のstepです。"
    - hogehoge2:
        call: sys.log
        args:
          text: "hogehoge2のstepです。"

コネクターとスクリプトを一つのワークフローで実行する場合

一つのワークフロー内にコネクターやスクリプトを両方実行する場合もあります。 その場合は以下のような記述になります。

  • 例1)
main:
  steps:
    - CONNECTOR_test1:
        name: "sample_connector_1"
        complete: "PYTHON_test1" # <---処理完了後、"PYTHON_test1"のstepを実行します
    - PYTHON_test1:
        name: "sample_script_1"
        complete: "hogehoge1" # <---処理完了後、"hogehoge1"のstepを実行します
    - hogehoge1:
        call: sys.log
        args:
          text: "hogehoge1のstepです。"
  • 例2)
main:
  steps:
    - CONNECTOR_test1:
        name: "sample_connector_1"
        complete: "CONNECTOR_test2" # <---処理完了後、"CONNECTOR_test2"のstepを実行します
    - CONNECTOR_test2:
        name: "sample_connector_2"
        complete: "hogehoge1" # <---処理完了後、"hogehoge1"のstepを実行します
    - hogehoge1:
        call: sys.log
        args:
          text: "hogehoge1のstepです。"
    - PYTHON_test1:
        name: "sample_script_1"
        complete: "hogehoge2" # <---処理完了後、"hogehoge2"のstepを実行します
    - hogehoge2:
        call: sys.log
        args:
          text: "hogehog2のstepです。"