AWS Step Functionsで使える文字列操作機能まとめ

AWS Step Functionsで利用可能な様々な文字列操作機能について詳しく解説します

はじめに

AWS Step Functionsは、AWSのサーバーレスワークフローサービスで、複数のAWSサービスを組み合わせて複雑なビジネスロジックを実装できます。Step Functionsでは、Amazon States Language (ASL)という言語を使用してワークフローを定義します。

ASLには「組み込み関数(Intrinsic Functions)」と呼ばれる機能があり、Lambda関数などの外部サービスを呼び出さずに、ワークフロー内で直接データ変換や操作を行うことができます。この記事では、Step Functionsで利用可能な文字列操作に関する組み込み関数について詳しく解説します。

組み込み関数(Intrinsic Functions)とは

組み込み関数は、Step Functionsのワークフロー内で基本的なデータ処理操作を実行するための機能です。これらの関数を使用することで、Lambda関数などの外部サービスを呼び出さずに、ワークフロー内で直接データ変換や操作を行うことができます。

組み込み関数を使用するには、ステートマシン定義内のキー値に .$ を指定する必要があります。例えば:

"KeyId.$": "States.Array($.Id)"

組み込み関数は以下のステートとフィールドでサポートされています:

  • Pass ステート: Parameters
  • Task ステート: Parameters, ResultSelector, Credentials
  • Parallel ステート: Parameters, ResultSelector
  • Map ステート: Parameters, ResultSelector

文字列分割: States.StringSplit

States.StringSplit 関数は、文字列を区切り文字で分割して配列に変換します。この関数は2つの引数を取ります:

  1. 分割する文字列
  2. 区切り文字(単一または複数の文字)

単一の区切り文字を使用した例

以下の入力があるとします:

{
  "inputString": "1,2,3,4,5",
  "splitter": ","
}

States.StringSplit 関数を使用して文字列を分割します:

"array.$": "States.StringSplit($.inputString, $.splitter)"

結果:

{
  "array": ["1", "2", "3", "4", "5"]
}

複数の区切り文字を使用した例

複数の区切り文字を使用することもできます:

{
  "inputString": "This.is+a,test=string",
  "splitter": ".+,="
}

States.StringSplit 関数を使用:

"myStringArray.$": "States.StringSplit($.inputString, $.splitter)"

結果:

{
  "myStringArray": [
    "This",
    "is",
    "a",
    "test",
    "string"
  ]
}

文字列フォーマット: States.Format

States.Format 関数は、リテラル値と補間値の両方から文字列を構築するために使用します。この関数は1つ以上の引数を取ります:

  1. 最初の引数は文字列で、{} のプレースホルダーを含むことができます
  2. 残りの引数は、プレースホルダーに挿入される値です

基本的な使用例

以下の入力があるとします:

{
  "name": "Arnav",
  "template": "Hello, my name is {}."
}

States.Format 関数を使用して文字列を構築します:

"greeting.$": "States.Format('Hello, my name is {}.', $.name)"

または:

"greeting.$": "States.Format($.template, $.name)"

どちらの場合も、結果は以下のようになります:

{
  "greeting": "Hello, my name is Arnav."
}

複数のプレースホルダーを使用した例

複数のプレースホルダーを使用することもできます:

{
  "firstName": "John",
  "lastName": "Doe",
  "age": 30
}

States.Format 関数を使用:

"introduction.$": "States.Format('My name is {} {}. I am {} years old.', $.firstName, $.lastName, $.age)"

結果:

{
  "introduction": "My name is John Doe. I am 30 years old."
}

Base64エンコード/デコード

Step Functionsには、Base64エンコーディングに基づいてデータをエンコードまたはデコードするための組み込み関数が用意されています。

States.Base64Encode

States.Base64Encode 関数は、MIME Base64エンコーディングスキームに基づいてデータをエンコードします。この関数は、エンコードする最大10,000文字のデータ文字列を唯一の引数として取ります。

例えば、以下の入力があるとします:

{
  "input": "Data to encode"
}

States.Base64Encode 関数を使用してエンコードします:

"base64.$": "States.Base64Encode($.input)"

結果:

{
  "base64": "RGF0YSB0byBlbmNvZGU="
}

States.Base64Decode

States.Base64Decode 関数は、MIME Base64デコーディングスキームに基づいてデータをデコードします。この関数は、デコードする最大10,000文字のBase64エンコードされたデータ文字列を唯一の引数として取ります。

例えば、以下の入力があるとします:

{
  "base64": "RGF0YSB0byBlbmNvZGU="
}

States.Base64Decode 関数を使用してデコードします:

"data.$": "States.Base64Decode($.base64)"

結果:

{
  "data": "Data to encode"
}

一意識別子の生成: States.UUID

States.UUID 関数は、ランダムな数値を使用して生成されたバージョン4のユニバーサル一意識別子(v4 UUID)を返します。この関数は引数を取りません。

"uuid.$": "States.UUID()"

結果:

{
  "uuid": "ca4c1140-dcc1-40cd-ad05-7b4aa23df4a8"
}

この機能は、DynamoDBテーブルにアイテムを挿入する場合や、UUIDパラメータを必要とする他のAWSサービスやリソースを呼び出す場合に便利です。

ハッシュ計算: States.Hash

States.Hash 関数は、指定された入力のハッシュ値を計算します。この関数は2つの引数を取ります:

  1. ハッシュ値を計算するデータ(最大10,000文字)
  2. ハッシュ計算に使用するハッシュアルゴリズム

サポートされているハッシュアルゴリズムは以下の通りです:

  • MD5
  • SHA-1
  • SHA-256
  • SHA-384
  • SHA-512

例えば、以下の入力があるとします:

{
  "Data": "input data",
  "Algorithm": "SHA-1"
}

States.Hash 関数を使用してハッシュ値を計算します:

"output.$": "States.Hash($.Data, $.Algorithm)"

結果:

{
  "output": "aaff4a450a104cd177d28d18d7485e8cae074b7"
}

文字列操作を組み合わせた高度な例

Step Functionsの組み込み関数は、最大10個までネストすることができます。これにより、複雑な文字列操作を実行することが可能です。

ARNからリージョンとアカウントIDを抽出する例

AWS ARN(Amazon Resource Name)から特定の情報を抽出する例を見てみましょう:

{
  "ImageRecipe": {
    "Arn": "arn:aws:imagebuilder:us-west-2:123456789012:image-recipe/example-recipe/1.0.0"
  }
}

以下のように複数の組み込み関数を組み合わせて、リージョンとアカウントIDを抽出できます:

"myArn.$": "States.Format('{}.{}', States.ArrayGetItem(States.StringSplit(States.ArrayGetItem(States.StringSplit($.ImageRecipe.Arn, '/'), 0), ':'), 3), States.ArrayGetItem(States.StringSplit(States.ArrayGetItem(States.StringSplit($.ImageRecipe.Arn, '/'), 0), ':'), 4))"

結果:

{
  "myArn": "us-west-2.123456789012"
}

この例では、以下の操作を行っています:

  1. ARNを / で分割し、最初の部分(arn:aws:imagebuilder:us-west-2:123456789012:image-recipe)を取得
  2. その部分を : で分割し、リージョン(インデックス3)とアカウントID(インデックス4)を取得
  3. States.Format を使用して、リージョンとアカウントIDをドットで連結

組み込み関数使用時の注意点

予約文字のエスケープ

組み込み関数では、以下の文字が予約されており、値に表示させたい場合はバックスラッシュ(\)でエスケープする必要があります:

  • ' (シングルクォート)
  • { (左中括弧)
  • } (右中括弧)
  • \ (バックスラッシュ)

エスケープシーケンスは以下の通りです:

  • リテラル文字列 \'' を表します
  • リテラル文字列 \{{ を表します
  • リテラル文字列 \}} を表します
  • リテラル文字列 \\\ を表します

JSONでは、文字列リテラル値に含まれるバックスラッシュは別のバックスラッシュでエスケープする必要があるため、JSONでの表現は以下のようになります:

  • エスケープされた文字列 \\\'\' を表します
  • エスケープされた文字列 \\\{\{ を表します
  • エスケープされた文字列 \\\}\} を表します
  • エスケープされた文字列 \\\\\\ を表します

JSONPathの制限

組み込み関数に引数として渡されるパスに英数字以外の文字(_ を除く)が含まれている場合は、角括弧表記を使用する必要があります。例えば:

$.abc.['def ghi']

まとめ

AWS Step Functionsの組み込み関数を使用することで、Lambda関数などの外部サービスを呼び出さずに、ワークフロー内で直接文字列操作を行うことができます。これにより、ワークフローの実行時間の短縮、状態遷移の削減、コードの削減、追加のリソース管理と構成の削減が可能になります。

この記事で紹介した文字列操作機能を活用することで、Step Functionsワークフローをより効率的に構築できるようになるでしょう。特に、シンプルな文字列処理のためだけにLambda関数を作成する必要がなくなり、アプリケーションのコスト削減と保守性の向上につながります。

参考リンク