Step Functions開発の「うーむ…」にVSCodeとAWS ToolKitで挑んでみる話

Step Functionsの開発におけるうーむ..を解決する方法を考えてみました。
2021.05.10

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

こんにちは。AWS事業本部のKyoです。

Step Functions便利そう。でもなんかちょっとハードル高いな。特にAmazon States Language (ASL)というやつが...。

感じているハードル

感じているハードルをもう少し具体的にしてみましょう。

  • ASL = 長いJSON を人力で書くのがうーむ...
  • Step Functions以外では使わないASLについて調べて書くのがうーむ...
  • デバッグやりにくそうなのがうーむ...

これらはVisual Studio Code (VSCode)とAWS ToolKitを使うと解決できそうです。

上記のエントリでVSCodeとAWS ToolKitを使えば、VSCodeから以下が可能になることが述べられています。

  • ステートマシン定義
  • ステートマシン可視化(プレビュー)
  • ステートマシン実行

VSCodeから定義、可視化、実行が可能なので「デバッグやりにくそうなのがうーむ...」はこの時点である程度クリアですね。

本エントリでは上記のエントリで触れられてない機能をもとに、残り2つのうーむ...に迫ります。

環境

  • Mac: 10.15.7
  • Visual Studio Code: 1.56.0
  • AWS Toolkit Version: 1.24.0

ASL = 長いJSON を人力で書くのがうーむ...

実は最近のアップデートでVSCode + AWS ToolKit を使えばYAMLでステートマシンを定義できるようになっていました。

サンプルコードもYAMLとして生成できます。コマンドパレットから以下の手順を実行します。

サンプルコードの一部。

Comment: >-
  A Hello World example demonstrating various state types of the Amazon States
  Language
StartAt: Pass
States:
  Pass:
    Comment: >-
      A Pass state passes its input to its output, without performing work. Pass
      states are useful when constructing and debugging state machines.
    Type: Pass
    Next: Hello World example?

これで長いJSONを書かなくても済みます。ぐっと気持ちが楽になりました(自分の観測範囲内において、CloudFormationテンプレートをJSONで書いてる人をほとんど見ないことからも長いJSONは人類にとってツラい代物なんだと思います)。

ハマりどころ

生成したサンプルコードを.ymlの拡張子で保存したところ、プレビュー機能が使えませんでした。JSONじゃないとダメなのか..と思ったのですが、公式ドキュメントを探してみると以下の文言があります。

グラフ可視化を使用すると、ステートマシンの外観をグラフ形式で確認できます。グラフ可視化を作成すると、別のタブが開き、ステートマシン JSON または YAML の可視化が表示されます。

もうちょっとだけ調べて見つけたのが以下のissue。ファイルの拡張子が.asl.ymlもしくは.asl.yamlでないとプレビューできないということですね。

拡張子を変更することで無事にプレビューに対応できました。

このプレビュー、左下のボックスでシンタックスエラーがあるかどうかも教えてくれるのがいいところです (ホットリロードなのもうれしい)。また、詳細はコードの方でも指摘してもらえます (マウスオーバーで詳細も出ます)。これらは「デバッグやりにくそうなのがうーむ...」にも効きますね。

正常時

異常時

なお、YAMLとJSONは変換可能なので、以下のようなプラグインを入れておくと、既存のステートマシンの定義をダウンロードしYAMLに変換して編集するといったことも可能です。本題とは少し違う話ですが、CloudFormationテンプレートを書くときにIAMポリシーのJSONをYAMLに使えるので入れておくと便利です。

Step Functions以外では使わないASLについて調べて書くのがうーむ...

スニペット機能があります。ASLに慣れている人は多くないと思うので、これもあるのとないのでは開発速度が大きく異なりそうな機能です。

Statesの中でCtrl + Space押すとスニペットの使用が可能です。

試しにBatch Task Stateを選ぶとこんな感じのスニペットが挿入されます。これがあれば最低限必要なパラメータは埋められるのでグッと楽になるのではないでしょうか。

Manage Batch task:
    Type: Task
    Resource: arn:aws:states:::batch:submitJob.sync
    Parameters:
      JobDefinition: arn:aws:batch:REGION:ACCOUNT_ID:job-definition/testJobDefinition
      JobName: myJobName
      JobQueue: arn:aws:batch:REGION:ACCOUNT_ID:job-queue/testQueue
    Next: NextState

ハマりどころ

Macで日本語キーボードを利用しているとCtrl + Spaceには言語の選択のショートカットが割り当てられています。これが原因でスニペットが呼び出せない状態でした (他のIDEでも発生する問題のようです)。私としては普段使わないショートカットなので、オフにしてしまいました。

おわりに

今回は個人的にStep Functions入門のハードルに感じるもの (主にASL)対策としてVSCodeとAWS ToolKitに触れてみました。YAML対応とスニペットのおかげでだいぶやっていけそうな気がしています。

Step FunctionsからはLambdaを呼び出すイメージが強いと思いますが、ECSやBatchといったコンテナ系サービスをはじめかなり多くのサービスとも統合されています。重い処理を行いたいときにはぜひコンテナの活用もご検討ください。