LoginSignup
0

stepfunctions 組み込み関数の予約文字を文字列として扱う方法

Posted at

はじめに

AWS stepfunctionsでは、Amazon States Languageという言語でステートマシンが定義され、そのAmazon States Languageには「組み込み関数」と呼ばれる便利関数がいくつか用意されている。
この組み込み関数には、予約文字と呼ばれる、関数内で使用のために予約されている文字があり、その予約文字の扱いで少しハマったので、備忘録としてこの記事を残す。

参考資料

予約文字について

組み込み関数には、 '}{\ の4文字が予約文字として使用されている。これらの文字を組み込み関数内で、文字列として使用する場合には、\ を用いてエスケープする必要がある。

具体例

例えば、Username という変数に対して、I'm {Username} と返すステートマシンを組み込み関数を使って作成してみる。ここで注意すべきなのは、I'm'は予約文字なので、これをエスケープしなければならない点である。

{
  "Comment": "A description of my state machine",
  "StartAt": "Pass",
  "States": {
    "Pass": {
      "Type": "Pass",
      "Parameters": {
        "Message.$": "States.Format('I\\'m {}', $.Username)"
      },
      "End": true
    }
  }
}

image.png

このステートマシンの以下のインプットで実行した結果は以下の通りになる。

image.png

image.png

意図通り、I'm Junと出力することができた。

詳しい解説(というか考察)

States.Format('I\\'m {}', $.Username) のエスケープ部分を少し考察してみる。

まず、ドキュメントには

\キャラクターの場合エスケープ文字として機能せずに値の一部として表示する必要があれば、バックスラッシュでエスケープする必要があります。組み込み関数では、次のエスケープ文字シーケンスが使用されます。
リテラル文字列 \' は ' を表します。
リテラル文字列 \{ は { を表します。
リテラル文字列 \} は } を表します。
リテラル文字列 \\ は \ を表します

と記載されている。つまり、組み込み関数内で、I'mと表示させたい場合は、I\'mとなる必要があり、さらに、この\もエスケープ文字の\として扱うためには\\としないといけないことから、I\\'mと表記する必要があるということになりそう。

まとめ

今回はstepfunctiosの組み込み関数内で予約文字を扱う具体的な方法について検証してみた。ドキュメントの文章を理解するのにだいぶ時間がかかってしまい、だいぶややこしかったが、結論は意外とシンプルなので、ハマっている方のお役に立てればと思う。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
0