Amazon Web Services ブログ

AWS Step Functions が、「Choice」ステートの更新、コンテキストオブジェクトへのグローバルアクセス、動的タイムアウト、結果選択、および Amazon States Languages への組み込み関数を追加

デベロッパーは AWS Step Functions を使用して、AWS Lambda、AWS Fargate、Amazon SageMaker などのサービスをリッチアプリケーションに接続するワークフローを設計および実行できます。ワークフローは一連のステップで構成され、1 つのステップの出力が次のステップの入力になります。AWS Step Functions を使用すると、アプリケーションの開発がより直感的になります。これにより、デベロッパーは AWS Lambda 関数や、ステートレスで開発されたコンテナ上の関数などの一連の関数を使って各アプリケーションを設定できます。

本日、Amazon States Language (ASL) を更新することで AWS Step Functions を強化したことを発表します。ASL は JSON ベースの構造化言語で、作業を実行できるステートマシンと状態の集合 (Task 状態) を定義し、次にどのステートに移行するかを決定し (Choice 状態)、エラー時に実行を停止します(Fail 状態)。今日のアップデートにより、シンプルなワークフローアプリケーションを作成し、ステートマシン定義内の柔軟性を高め、Lambda 呼び出しを減らし、状態の移行を減らしてコストを節約することができます。

AWS Step Functions マネジメントコンソールにアクセスすると、定義ステップの下に新しいコードスニペットが表示されます。

Choice 状態の更新

Choice 状態は、基本的にステートマシンにブランチロジックを追加します。このアップデートでは、新しい演算子が複数追加され、選択の幅が広がりました。これにより、演算子が既存の定義を単純化したり、ステートマシン定義内で動的な動作を追加したりできます。

  1. 比較演算子 – 以下の値のテストをサポートします。
    IsNull – Null
    IsString – 文字列
    IsNumeric – 数値
    IsBoolean – ブール値
    IsTimestamp – タイムスタンプ
    {
    "Variable": "$.foo",
    "IsNull|IsString|IsNumeric|IsBoolean|IsTimestamp": true|false
    }
  2. 存在テスト – 特定のフィールドの存在または非存在のテストをサポートします。
    {
    "Variable": "$.foo",
    "IsPresent": true|false
    }
  3. ワイルドカード – シェル「glob」スタイルのワイルドカードをサポートしているため、お客様は log-*.txt または *LATEST* をテストできます。
    {
    "Variable": "$.foo",
    "StringMatches": "log-*.txt"
    }
  4. 変数対変数の比較 – ある入力フィールドを別の入力フィールドと比較できます。現在、Choice 状態では、固定値との比較が可能です。
    {
    "Variable": "$.foo",
    "StringEqualsPath": "$.bar"
    }

コンテキストオブジェクトへのグローバルアクセス

以前は、コンテキストオブジェクトはパラメータブロック内でのみアクセスできましたが、今回の更新でこの制限が取り除かれたため、パラメータブロック外のコンテキストオブジェクトを柔軟に参照できます。ASL で JSON 参照パスが許可されていれば、コンテキストオブジェクトへアクセスできるようになりました。これにより、次のフィールドのコンテキストオブジェクトにアクセスできます。

  •  InputPath
  • OutputPath
  • ItemsPath (Map 状態)
  • Variable (Choice 状態)
  • ResultSelector
  • 変数対変数の比較演算子

次に、コンテキストオブジェクトへのグローバルアクセスによって既存の記述がどのように単純化されるかの例を示します。

動的タイムアウト

ASL は、この更新前の 2 つのタイムアウトパラメータ、「TimeOutSeconds」と「HeartBeatSeconds」をオプションでサポートしました。「TimeOutSeconds」は、タスクが指定された秒数よりも長い場合にエラーを返し、「HeartBeatSeconds」は、タスクからのハートビート間隔が指定秒数よりも長い場合にエラーを返します。アプリケーションによっては、時間の経過とともに動的に変動するようにこれらのパラメータを設定したい場合があります。これには、新しいパラメータ「TimeOutSecondSpath」と「HeartBeatSecondSpath」を使用できます。

{
"Type": "Task",
"Resource": "arn:aws:states:::glue:startJobRun.sync",
"Parameters": {
"JobName": "GlueJob-JTrRO5l98qMG"
},
"TimeoutSecondsPath": "$.params.maxTime",
"HeartbeatSecondsPath": "$.params.heartBeat"
}

結果セレクター

実行結果には、ペイロードとともにメタデータを含めることができます。たとえば、Lambda 関数を呼び出す Task 状態はペイロードを返しますが、一部のサービス統合フレームワークを介した呼び出しでは、Path 状態を使用してペイロードを返すことがあります。その結果メタデータになり、お客様は再度フィルタリングする必要があります。以前は、メタデータが必要ない場合は、別の状態を使用してそれを操作する必要がありました。この新機能により、この必要性がなくなり、ペイロードサイズも縮小できます。パラメータスタイルオブジェクトを追加して、お客様がタスクステータスの出力をフィルタリングし、目的のフィールドを結果パスに渡すのに役立ちます。

{
  "Type": "Task",
  "Resource": "arn:aws:states:::elasticmapreduce:createCluster.sync",
  "Parameters": {
    ...
  },
"ResultSelector": {
         "ClusterId.$": "$.output.ClusterId",
         "ResourceType.$": "$.resourceType"
  },

"ResultPath": "$.EMRoutput"
}

文字列構造

この更新により、入力値を補完することが可能になり、文字列を連結します。文字列コンストラクターを追加して、お客様が入力からフィールド値を構築できるようにすることもできます。

{
  "Parameters": {
    "foo.$": "States.Format('Hello, {} {}', $.firstName, $.lastName)"
  }
}

文字列は、許容可能なデータ型としてのみ使用できます。

JSON から文字列へ、文字列から JSON へ

お客様が DynamoDB に入力を送信したとき、オブジェクト内のオブジェクトを文字列に変更する方法はありませんでした。そのため、お客様は JSON オブジェクトを直接送信できず、Lambda 関数を使用する必要がありました。今回の更新では、JSON をオブジェクト内の文字列に直接変換できるようになりました。

{
  "Type": "Task",
  "Resource": "arn:aws:states:::some.future.integration:run.sync",
  "Parameters": {
    "FieldThatNeedsToBeAString.$": "States.JsonToString($.JSONInputField)",
  }
}

これは逆方向にも機能し、お客様は外部 Lambda 関数を呼び出さずに文字列を JSON に変換することができます。

{
"Type": "Task",
"Resource": "arn:aws:states:::some.future.integration:run.sync",
"Parameters": {
"FieldThatNeedsToBeJSON.$": "States.stringToJson($.EscapedInputField)"
}
}

状態配列

状態は、同じ定義の下で倍数を処理する配列として設定できるようになりました。

"X": {
"Type": "Task",
"Resource": "arn:aws:lambda:us-east-1:123456789012:function:HelloWorld",
"Parameters": {
"PayloadString.$": "States.Format('[[{}]]', States.JsonToString($.in.summary))",
"CmdLine.$": "States.Array('--maxp', $.params.maxpr, '--minp', $.params.minpr)",
"ControlBlock.$": "States.StringToJson($.output.control)"
},
"Next": "AllDone"
}

本日よりご利用いただけます

上記の更新は、中国リージョンを除いて、AWS Step Functions が提供されているすべての AWS リージョンで今日からご利用いただけます。詳細については、ドキュメントをご確認ください。

– Kame;