この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
ちょっと計算したいだけなのにLambda関数使うの面倒だな
こんにちは、のんピ(@non____97)です。
皆さんはAWS Step Functionsでちょっとだけ計算したいだけなのにLambda関数を使うの面倒だなと思ったことはありますか? 私はあります。
昨年、Step FunctionsではアップデートによりLambda関数を返さなくても直接AWSのサービスと連携できるようになりました。
これにより、Step Functionsは完全に始まりました。
ただ、数値の演算をしたり文字列のハッシュ値を計算したりするなどAWSのサービスが絡まないところについては、引き続きLambda関数に頼る必要がりました。
そんな折、「「AWS Step Functionsの組み込み関数が14個追加された」」とアップデートがありました。
内容を確認すると配列操作やJSONのオブジェクト操作、数値演算などの組み込み関数が追加されたようです。
これはすごいアップデートですよ。
早速確認してみたので、紹介します。
いきなりまとめ
- AWS Step Functionsの組み込み関数が14個追加されて配列や数値などの操作が簡単になりました
- 追加された組み込み関数は以下の通り
追加された組み込み関数 | 説明 |
---|---|
States.ArrayPartition | 配列を分割する |
States.ArrayContains | 特定の値が配列に存在するかどうか返す |
States.ArrayRange | 特定の範囲の要素を含む配列を作成する |
States.ArrayGetItem | 配列の指定されたインデックスの値を返す |
States.ArrayLength | 配列の長さを返す |
States.ArrayUnique | 配列から重複する値を削除して一意の要素のみを含む配列を返す |
States.Base64Encode | MIME Base64でをエンコードする |
States.Base64Decode | MIME Base64でデコードする |
States.Hash | ハッシュ値を計算する |
States.JsonMerge | 2 つの JSON オブジェクトを 1 つのオブジェクトにマージする |
States.MathRandom | 指定された開始番号と終了番号の間の乱数を返す |
States.MathAdd | 2 つの数値の合計を返す |
States.StringSplit | 文字列を配列に分割する |
States.UUID | UUID v4 を返す |
追加された組み込み関数を確認してみる
それでは組み込み関数を確認しましょう。
今まであった組み込み関数は以下の3つでした。
States.Format
States.StringToJson
States.Array
今回のアップデートによって、以下14個の組み込み関数が追加されました。
追加された組み込み関数 | 説明 |
---|---|
States.ArrayPartition | 配列を分割する |
States.ArrayContains | 特定の値が配列に存在するかどうか返す |
States.ArrayRange | 特定の範囲の要素を含む配列を作成する |
States.ArrayGetItem | 配列の指定されたインデックスの値を返す |
States.ArrayLength | 配列の長さを返す |
States.ArrayUnique | 配列から重複する値を削除して一意の要素のみを含む配列を返す |
States.Base64Encode | MIME Base64でをエンコードする |
States.Base64Decode | MIME Base64でデコードする |
States.Hash | ハッシュ値を計算する |
States.JsonMerge | 2 つの JSON オブジェクトを 1 つのオブジェクトにマージする |
States.MathRandom | 指定された開始番号と終了番号の間の乱数を返す |
States.MathAdd | 2 つの数値の合計を返す |
States.StringSplit | 文字列を配列に分割する |
States.UUID | UUID v4 を返す |
これはイイですね。とてもイイです。
以下AWS公式ドキュメントに各組み込み関数の詳細な使い方が記載されています。(表示されない場合は言語をEnglishに変更してみてください)
追加された組み込み関数をちょっと試しみましょう。
以下のようにPass
ステートで追加された組み込み関数を実行するステートマシンを用意しました。
{
"Comment": "A description of my state machine",
"StartAt": "Pass",
"States": {
"Pass": {
"Type": "Pass",
"End": true,
"Parameters": {
"ArrayPartition_Key.$": "States.ArrayPartition($.inputArray,2)",
"ArrayContains_Key.$": "States.ArrayContains($.inputArray, 'd')",
"ArrayRange_Key.$": "States.ArrayRange(0, 1000, 333)",
"ArrayGetItem_Key.$": "States.ArrayGetItem($.inputArray, 3)",
"ArrayLength_Key.$": "States.ArrayLength($.inputArray)",
"ArrayUnique_Key.$": "States.ArrayUnique($.inputArray)",
"Base64Encode_Key.$": "States.Base64Encode($.InputText)",
"Base64Decode_Key.$": "States.Base64Decode($.InputBase64)",
"Hash_Key.$": "States.Hash($.InputText, 'SHA-512')",
"JsonMerge_Key.$": "States.JsonMerge($.json1, $.json2, false)",
"MathRandom_Key.$": "States.MathRandom(0, 10000,10)",
"MathAdd_Key.$": "States.MathAdd(200, 12)",
"StringSplit_Key.$": "States.StringSplit($.InputText, 'ピ')",
"UUID_Key.$": "States.UUID()"
}
}
}
}
これに以下のインプットを渡して実行します。
{
"inputArray": [
"a",
"a",
"b",
"c",
"c",
"c",
"d",
"e",
"e",
"f",
"g"
],
"InputText": "のんピだよ",
"InputBase64": "QmFzZTY044Gn44Ko44Oz44Kz44O844OJ44GV44KM44Gf44Gu44KT44OU",
"json1": {
"a": {
"a1": 1,
"a2": 2
},
"b": 2
},
"json2": {
"a": {
"a3": 1,
"a4": 2
},
"c": 3
}
}
すると、Pass
ステートの出力は以下のようになりました。
{
"JsonMerge_Key": {
"a": {
"a3": 1,
"a4": 2
},
"b": 2,
"c": 3
},
"ArrayGetItem_Key": "c",
"ArrayRange_Key": [
0,
333,
666,
999
],
"ArrayContains_Key": true,
"ArrayUnique_Key": [
"a",
"b",
"c",
"d",
"e",
"f",
"g"
],
"UUID_Key": "73c74908-47ce-487d-a318-abbd74b408da",
"StringSplit_Key": [
"のん",
"だよ"
],
"Base64Decode_Key": "Base64でエンコードされたのんピ",
"MathRandom_Key": 7113,
"MathAdd_Key": 212,
"ArrayPartition_Key": [
[
"a",
"a"
],
[
"b",
"c"
],
[
"c",
"c"
],
[
"d",
"e"
],
[
"e",
"f"
],
[
"g"
]
],
"Hash_Key": "00c4be6125edc5a95b0831215d5df4320ea94447570ae77323810d4c9d3dfc8a53db31dace583a6655e8464f4da9ec2dd44258d83e72a89c7117f83bb38f2322",
"ArrayLength_Key": 11,
"Base64Encode_Key": "44Gu44KT44OU44Gg44KI"
}
意図した挙動をしています。たまんないですね。
ちなみに、MathRandom_Key
はStates.MathRandom
のシードとして固定値で10
を渡しているので、何回実行しても結果は7113
になります。
シードには数値のみ指定可能です。文字列をシードとして渡すと以下のようなエラーを吐きます。
An error occurred while executing the state 'Pass' (entered at the event id #2). There was an error while evaluating the intrinsic function: States.MathRandom(0, 10000,'a'). Invalid arguments in States.MathRandom
また、States.JsonMerge
は現在ディープマージには対応していないようです。第3引数にtrue
を指定してディープマージしようとすると以下のようなエラーを吐きます。
An error occurred while executing the state 'Pass' (entered at the event id #2). There was an error while evaluating the intrinsic function: States.JsonMerge($.json1, $.json2, true). Deep merge not supported in States.JsonMerge
AWS Step Functionsの進化が止まらない
AWS Step Functionsの組み込み関数が新たに14個追加されたアップデートを紹介しました。
Step Functionsの進化が止まらないですね。これからのStep Functionsライフが捗りそうです。
外部のAPIを直接呼んだり、数値の乗算除算などまだ欲しい機能もたくさんあるので、今後も組み込み関数が増えることに期待しましょう。
この記事が誰かの助けになれば幸いです。
以上、AWS事業本部 コンサルティング部の のんピ(@non____97)でした!