Google Cloud Workflowのエミュレータを作り始めた。 標準関数などもだいたいひとまずの実装が終わってきて、ある程度動くようになっている。
Cloud Workflowを検証・導入する機会があって、便利な一方でエミュレータが提供されておらずローカルでの動作確認に困ったのもあり、いっそ自作してみるかという気分になった。 あと、一度は処理系っぽいものを作ってみたかったというのもあって、それもそこそこ大きなモチベーションだった。
Cloud WorkflowはYAMLかJSONで手続きを記述するとそれをクラウド上で動かせるというもので、 Cloud Functionなどとの違いとしては制約が多く複雑なことがやりづらい(できなくはない)のでオーケストレーター的な役割などに集中させやすいこと、 また冗長性とフォールトトレランスに力がいれられておりゾーン障害などが起きても実行の継続が保証されたりリトライが簡単に記述できるあたりが良いと思う。
詳しくはドキュメントを見るとよさそう:
どうつくったかというと、GoだとCIからバイナリを落としてくるだけで動く世界観になってインストールが楽そう && 慣れているのでGoで作ることにした。
Cloud Workflowの構文はYAMLとJSONで書けるのだが、お馴染みの github.com/goccy/go-yaml
が実は YAMLToJSON
というインターフェースが提供されており、さらに一定のパターンは持つものの決定的に構造が定まるわけではないので一部を json.RawMessage
にしてその親の構造に応じて遅延評価するような実装ができると楽そうだと踏んでそういう感じで実装していった。
JSONのデータ構造を解釈して、それの実行順序を組み、そのとおりに実行していく簡単なインタプリタを基本としている。
ほか、式や変数を扱えたり for
によってスコープが作れたり、関数呼び出しが式のなかでも行えたり、演算子に優先順位があったり動的型付けながら型の概念もあったりなど、諸々をうまく解決していく必要があってなかなか大変だったし勉強になった。このあたりは機会があればどこかで話したい。
というわけで、OAuth2を使って(Google Cloud APIではなくGoogle CalendarなどのAPIである)Google APIを叩けないなど一部困った問題はあるが、 おおまか動くっぽい感じになってきたので、Cloud Workflowを使っている皆様におかれましては、ぜひ試してみてほしいです。(まだまだテスト不足でバグってるところも多いかとは思いますが。。)