はじめに
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
}
}
}
このステートマシンの以下のインプットで実行した結果は以下の通りになる。
意図通り、I'm Jun
と出力することができた。
詳しい解説(というか考察)
States.Format('I\\'m {}', $.Username)
のエスケープ部分を少し考察してみる。
まず、ドキュメントには
\キャラクターの場合エスケープ文字として機能せずに値の一部として表示する必要があれば、バックスラッシュでエスケープする必要があります。組み込み関数では、次のエスケープ文字シーケンスが使用されます。
リテラル文字列 \' は ' を表します。
リテラル文字列 \{ は { を表します。
リテラル文字列 \} は } を表します。
リテラル文字列 \\ は \ を表します
と記載されている。つまり、組み込み関数内で、I'm
と表示させたい場合は、I\'m
となる必要があり、さらに、この\
もエスケープ文字の\
として扱うためには\\
としないといけないことから、I\\'m
と表記する必要があるということになりそう。
まとめ
今回はstepfunctiosの組み込み関数内で予約文字を扱う具体的な方法について検証してみた。ドキュメントの文章を理解するのにだいぶ時間がかかってしまい、だいぶややこしかったが、結論は意外とシンプルなので、ハマっている方のお役に立てればと思う。