Cloud Workflowsでlistの関数を使ってリストを操作してみる

2023.03.10

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

はじめに

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

GoogleCloudのWorkflowsでリストを操作するprepend関数が追加されていたのでこの挙動を確かめつつ、Workflowsでのリスト操作を行ってみたのでまとめます。

Workflowsで使えるList操作の関数

Workflowsでは公式ドキュメント(Function: list.concat  |  Workflows  |  Google Cloud )によると以下の2つの関数が使えます。

  • list.concat : リストの最後に値を追加する
  • list.prepend : リストの先頭に値を追加する

2つとも既存のlist型の値に対して新しい値を追加する関数になります。戻り値はどちらともlist型になります。

では実際にWorkflowを作って試してみたいと思います。Workflowsではyaml定義を使ってWorkflowを作成できるので以下のyamlを使います。

wf-operate_list.yaml

main:
  steps:
    - assign_value:
        assign:
          - list_val: [ "apple","orange","banana" ]
    - logging:
        call: sys.log
        args:
          text: ${list.concat(list_val, "melon")}
          severity: INFO
    - logging_2:
        call: sys.log
        args:
          text: ${list.prepend(list_val, "grape")}
          severity: INFO
    - logging_3:
        call: sys.log
        args:
          text: ${list.concat(list_val, ["kiwi","peach","lime"])}
          severity: INFO

ステップで行っていることを簡単に説明します。

  • assign_valueステップ
    • list型の変数を定義する
  • loggingステップ
    • assign_valueステップで定義したリストにlist.concatで値を最後に追加する
  • logging_2ステップ
    • assign_valueステップで定義したリストにlist.prependで値を先頭に追加する
  • logging_3ステップ
    • assign_valueステップで定義したリストにlist.concatで値(list型)を最後に追加する

ではこのyamlを使ってWorkflowを作成して実行結果を確認してみます。

$ gcloud workflows deploy wf-operate_list --source=wf-operate_list.yml --service-account 11111111111-compute@developer.gserviceaccount.com --location asia-northeast1
$ gcloud workflows run wf-operate_list --location asia-northeast1

実行結果をCloud Loggingで確認してみます。

2023-02-27 11:44:11.849 JST
  ["apple","orange","banana","melon"]
2023-02-27 11:44:12.085 JST
 ["grape","apple","orange","banana"]
2023-02-27 11:44:12.325 JST
 ["apple","orange","banana",["kiwi","peach","lime"]]

loggingステップではconcat関数でリストの最後に値が追加され、logging_2ステップではprepend関数でリストの先頭に値が追加されています。

logging_3ステップについてはリストの最後にリストが追加されてリストが内包された状態になっています。concat関数の挙動としてはあくまでリストの最後に値を追加する関数なので当然の結果となります。では、リストを結合するにはどうすればいいかというとIterationでリストの反復処理を行う方法を使います。

wf-operate_list2.yaml

main:
  steps:
    - assign_value:
        assign:
          - list_val: [ "apple","orange","banana" ]
    - loop_list:
        for:
          value: fruit_name
          in: ["kiwi","peach","lime"]
          steps:
            - add_list:
                assign:
                  - list_val: ${list.concat(list_val,fruit_name)}
    - logging_list:
        call: sys.log
        args:
          text: ${list_val}
          severity: INFO

ステップで行っていることを簡単に説明します。

  • assign_valueステップ
    • list型の変数を定義する
  • loop_listステップ
    • 結合したいリストをforを使って反復処理する
  • add_listステップ
    • loop_listステップで反復された要素をassign_valueステップで定義したリストにlist.concatで最後に追加する

このyamlを使ってWorkflowsを作成して実行結果を確認してみます。

2023-02-27 11:45:12.551 JST
  ["apple","orange","banana","kiwi","peach","lime"]

期待した通り[ "apple","orange","banana" ]["kiwi","peach","lime"]が結合されたリストが取得できました。

まとめ

GoogleCloudのWorkflowsでリストを操作する関数を使ってみました。リストに要素を追加するのには便利に使えます。一方、リスト同士の結合に関してはIterationを使って地道に結合するしかありません。これらのリスト操作の使い道としては、任意のstepからの返り値をリストに追加して後続の処理でそのリストを使うといったことが考えられるかと思います。

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