Cloud Workflowsでランタイム引数のデフォルト値を設定する

2022.07.07

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

データアナリティクス事業本部のkobayashiです。

GoogleCloudのWorkflowsを引数を与えて実行するような場面はよくあるかと思いますが、その際に引数を与えなかった場合のデフォルト値の与え方を調べて見たのでまとめます。

Workflowsを実行する際のランタイム引数

Workflowsを実行する際に以下のようなリクエストでランタイム引数を与えることでWorkflows内でその値を使用することができます。

gcloud workflows run ワークフロー名 --location asia-northeast1 --data='{"title":"hogehoge","date":"2022-07-07"}'

設定した引数をWorkflows内で使用するには以下のようにparamsフィールドで引数を受け取り、args.引数名でWorkflows中で使用します。

main:
  params: [ args ]
  steps:
    - assign_value:
        assign:
          - title: args.title
          - date: args.date
    - logging:
        call: sys.log
        args:
          text: ${"title:" + title + ", date:" + date }
          severity: INFO

ランタイム引数でデフォルト値を設定する

ランタイム引数は上記のようにWorkflowsを実行する際の--dataフラグで与えますが--dataで引数を与えなかった場合にデフォルト値を使いたい場面もあるかと思います。例えば、上記の例で言えば引数でdateを与えなければ実行日を使う場面が想定されます。

その際にはWorkflowsの組み込み関数であるdefault(val, defaultVal)map.get(map, keys)を使用します。

この2つの関数を組み合わせるとmapに該当キーがない場合はdefaultValを取得できるのでこれを使ってランタイム引数がない場合のデフォルト値を設定することができます。

では以下のようなランタイム引数がないWorkflowsのリクエストを行った際にデフォルト値を設定するWorkflowsのyamlを記述してみます。

gcloud workflows run ワークフロー名 --location asia-northeast1 --data='{}'

titleにはデフォルト値でfugafugadateには実行日を設定しています。

main:
  params: [ args ]
  steps:
    - assign_value:
        assign:
          - title: ${default( map.get(args,"title"), "fugafuga")}
          - now: ${time.format(sys.now(), "Asia/Tokyo")}
          - today: ${text.split(time.format(sys.now(), "Asia/Tokyo"), "T")[0]}
          - date: ${default( map.get(args,"title"), today)}
    - logging:
        call: sys.log
        args:
          text: ${"title:" + title + ", date:" + date }
          severity: INFO

titleの変数は単純にdefault( map.get(args,キー名), デフォルト値)の形式で記述していますが、dateに関してはこちらも組み込み関数のsys.now()をJSTで取得した値が2022-07-07T06:53:18.335196+09:00の形式なので更にtext.split(source,separator)で日付部分のみを抽出しています。

以上が引数無しでWorkflowsを実行した際のデフォルト値の設定方法となります。

まとめ

GoogleCloudのWorkflowsを実行する場合の引数を与えなかった場合のデフォルト値の与え方をまとめました。Workflowsを柔軟に使う際にはよく使うテクニックだと思います。自分が作成するWorkflowsでも大体実装していますので是非使ってみてください。

最後まで読んで頂いてありがとうございました。