はじめに
こんにちは、 みなさんはGCPのサービスの一つである、Workflowsはご存知ですか?
Workflowsは、Googleが提供するサーバレスのワークフローサービスです。2021年に一般提供が開始されました。
https://www.infoq.com/jp/news/2021/02/google-cloud-workflows/
Workflowsは、CloudFunctionや外部APIなどあらゆるサービスを呼び出して、それらを繋ぎ合わせることができるサービスです。
フローの定義にはFOR文やSWITCH文といった制御文を記載でき、サービスの戻り値を元に次にどのサービスをどのように呼び出すかを定義することができます。
また、簡単な文字列加工や関数による変数の操作が可能です。Workflowsは、まさにデータ加工のパイプラインを構築するにはもってこいのサービスのように思えます。
そこで、私はかねてから考えていた構想の実現のためにWorkflowsを使ってみることにしたのですが、そこで思わぬ落とし穴にハマってしまいました。
結論
Workflowsに「処理」を期待するな。
すみません、ミスリーディングなタイトルをつけました。この場でお詫びします。Workflowsは素晴らしいツールです。でもWorkflows単体での「処理」能力に期待するのはやめましょうというのが記事の主張になります。
Wokflowsでは、Pythonなどのプログラミング言語のように、自由に文字列やファイルの加工するといった「処理」をすることはできません。 一部できるのですが、制約が非常に多いのでやめたほうが賢明です。
Workflowsにはワークフローとしての役割だけを求めるようにしましょう。
当たり前のことのように思えますが、実際にワークフローを記述していくと「ここで直接この処理をかけたらめちゃくちゃ便利なのにな…」と思う場面に何度も出会しました。
この記事では、なぜ処理を書くことができないのか、書いてはいけないのかを例を用いて紹介します。
Workflowsについて補足
Workflowsってよくわからない人向けに補足します。
こんな感じでワークフローの定義をYAMLで記述すると、フロー図として可視化されます。
実行する時は、JSONで引数隣るデータを渡してあげると、定義したフローが実行されます。
Workflowsでできないこと
Workflowでは512kBしか変数にデータを持つことができない
とあるWeb APIからJSONを受け取って、結果をループで回して特定の値を抽出する処理を実現したいとします。
これはすべてWorkflows上で実現することができます。Workflowだけで書けて嬉しいですね。 ただし、大きな落とし穴があります。これが正常に動作するのはJSONのデータが512KB以下に限ります。
正確には、「すべての変数に使えるメモリの最大量」が512KBであるので、ひとつの変数で扱えるデータは512KBよりももっと少ないです。
Workflows上での回避方法は残念ながらありません。
CloudFunctionで処理するように書き換えしましょう。
発生するエラー:
{"message":"ResourceLimitError: Memory usage limit exceeded","tags":["ResourceLimitError"]}
Workflowsではスクリプトの実行はできない
いわずもがなですが、Workflowsのyamlの中に直接JSやPyhthonなどを書いて処理を実行することはできません。あくまでWorkflowsが用意している非常に限られた関数のみ理由できます。
Workflowsでは日付の加工はできない(むずしい)
Workflowsで使える日付の関数はformat
とparse
のみです。
https://cloud.google.com/workflows/docs/reference/stdlib/time/format
しかも、format
で出力できる日付の形式はISO 8601 format
のみです。
日付の操作を行う関数が準備されていないので、日付の操作を行うのは複雑なコードになってしまうか、そもそも実現できません。
この限られた関数と文字列操作を組み合わせて日付の操作を実現している方がいらっしゃるので、もしやりたい方はご参考になさってください。
難しい処理はCloud Functionで書きましょう
WorkflowsではZipの解凍はできない
ダウンロードしたZIPの中から文字列を取得したい!
結論、できません。
Cloud Functionでやりましょう。
まとめ
この記事では、Google Cloud Workflows上で複雑な処理を期待せず、あくまでサービス間の連携、処理の流れを制御する役割として認識する必要があるということを述べました。
Workflowsでは、文字列の加工やループといった処理かけるので、Workflows上で複雑な処理を実現したくなりますが、関数が限られていたり、変数の最大容量が512kBだったりと処理の実装には制約が非常に大きいです。
Workflowsはワークフローの定義には非常にシンプルで強力なツールです。複雑な処理はCloud Functionに任せて、Workflowsでは、あくまでワークフローの定義に専念しましょう。