[アップデート] AWS Step Functionsの組み込み関数が14個追加されて配列や数値などの操作が簡単になりました

AWS Step Functionsの進化が止まらない
2022.09.01

ちょっと計算したいだけなのに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つでした。

  1. States.Format
  2. States.StringToJson
  3. 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_KeyStates.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)でした!