Application Integration

AWS Step Functions

BedrockのInvokeModel・AgentCoreのInvokeHarnessと最適化統合を持つ、GenAIオーケストレーションの配線盤。ReAct・サーキットブレーカー・人間承認(HITL)の受け皿として複数ドメインにまたがって出ます。

  • B|実装まわり
  • D1 FM統合・データ・コンプラ
  • D2 実装と統合
  • D3 安全性・セキュリティ・ガバナンス

ひとことで言うと

BedrockとAgentCoreの両方に最適化されたサービス統合を持つ、状態機械(ステートマシン)です。GenAIの文脈では「FM呼び出しをどう並べ、どう失敗に備え、どこで人間を挟むか」を配線する層として出てきます。

要するに、配線図付きの指揮台です。Lambdaが個々の手足だとすれば、Step Functionsはどの手足をどの順番で、失敗したらどう動かすかを決める指揮者です。
BedrockのInvokeModelもAgentCoreのInvokeHarnessも、専用のResource型(arn:aws:states:::bedrock:invokeModel等)として直接呼べます。呼び出しごとにLambdaのグルーコードを書く必要がありません。

なぜ生まれたか

GenAIアプリのオーケストレーションは、単発のFM呼び出しでは終わりません。プロンプトチェーン(前の応答を次の入力に使う)、複数ツールを試すReActループ、失敗したら別モデルにフォールバックする構成、人間の承認を待ってから実行を続ける構成など、「順序・分岐・待機・リトライ」を伴う処理が必ず出てきます。これをアプリのコードに素朴に書くと、状態管理とエラー処理だけで肥大化します。

Step FunctionsはRetry・Catch・Choice・Map・Parallelといった状態をJSON定義で持つことで、この配線をコード外に出します。BedrockとAgentCoreの両方に最適化統合が用意されているのは、GenAIのオーケストレーションがこのサービスの主要な適用先の一つになっているためです。

素朴に自作すると肥大化する処理Step Functionsの受け皿
モデル呼び出し失敗時のリトライ制御Retry(指数バックオフ)・Catch(代替パス)
複数ツールを試すエージェントループChoice・Mapによる分岐と並列実行
人間承認を挟む処理の待機.waitForTaskTokenによるコールバック

何に使うか

用途使い方関連ドメイン
プロンプトチェーン前段のInvokeModel結果を次のTask Stateの入力に渡すD1
エージェントのReActループChoiceでツール呼び出しか最終応答かを分岐し、Mapで並列にツールを試すD2
AgentCoreハーネスの起動InvokeHarnessで長時間の多ターン会話・ツール利用を委ねるD2
サーキットブレーカー・フォールバックRetryで指数バックオフ、Catchで代替モデルへの切り替えパスに分岐D1・D5
人間承認(HITL).waitForTaskTokenでコールバックを待ち、人間の承認後に処理を再開するD3

試験でどう問われるか

問われ方正解に寄る条件引っかけの選択肢
モデル呼び出し失敗時の継続性一時的な障害に備えたい → Retry+Catchによるサーキットブレーカーアプリ側で単純にtry-catchしてリトライし続ける実装(バックオフなし・観測不能)
長時間実行のエージェント処理数分〜数十分のツール利用を伴う → Standardワークフロー(最大1年実行)+InvokeHarnessExpressワークフロー(最大5分)で長時間セッションを組もうとする案
承認を経てから機微な操作を実行したい人間の判断を挟む → .waitForTaskTokenによるコールバックパターンBedrock Guardrailsだけで代替しようとする(Guardrailsは検閲であって承認フローではない)
AgentCoreハーネスの呼び出しがタイムアウトするTask Stateの上限は15分固定(TimeoutSecondsをそれ以上にしても効かない)TimeoutSecondsを伸ばせば長く待てると考える
高頻度・低レイテンシなストリーミング系処理at-least-once・5分以内で完結 → ExpressワークフローすべてのユースケースにStandardワークフローを一律適用する

InvokeHarnessは.syncにも.waitForTaskTokenにも対応していません。サポートされるのはRequest Responseパターンのみで、しかもTask State自体の実行時間は15分が上限です(ハーネス側のタイムアウトをそれより長く設定しても、Step Functions側は15分で打ち切ります)。マルチターンの会話でも最後のアシスタント発言だけが返り、途中のターンやツール利用の詳細は破棄されます。エージェントの思考過程を追いたい場合はCloudWatch Transaction Searchでの観測が別途必要です。

実務でどう使うか

  • InvokeModelのペイロードは256KiBまで。 超える場合はBodyではなくInput/OutputにS3 URIを指定して大きなデータを迂回させます。画像やドキュメントを直接埋め込む設計は上限に当たります
  • モデルカスタマイズ(CreateModelCustomizationJob)も.sync統合で待てます。 ファインチューニングジョブの完了をポーリングするコードを自作する必要がありません
  • IAMポリシーは自動生成されるが、ワイルドカードを避けて特定のモデルARN・ハーネスARNにスコープを絞るのが推奨。 コンソールが自動生成するロールをそのまま使うと過剰な権限になりがちです
  • Standard/Expressの選択はGenAIワークロードの性質で決まります。 対話1往復で完結する軽いAPI呼び出しはExpress、複数ターンにまたがるエージェントの実行やHITLを含む長時間フローはStandardが基本線です
項目StandardExpress
最大実行時間1年5分
実行保証exactly-onceat-least-once
GenAIでの用途長時間のエージェント実行・HITL単発API呼び出し・高頻度ストリーミング

取り違えやすいもの

迷う相手切り分けの一言
Bedrock Prompt FlowsPrompt FlowsはBedrock内で完結するプロンプトチェーン専用のノーコードツール。Step FunctionsはBedrock以外のAWSサービスも横断するオーケストレーションが要る場面で選ぶ
AgentCore Runtime単体Runtime単体でもエージェントは動くが、**複数エージェント・複数ステップにまたがる制御フロー(承認待ち・条件分岐・他サービス連携)**が要るならStep Functionsで包む
EventBridgeEventBridgeはイベントの配送が主役。Step Functionsは手順の実行と状態管理が主役。イベント起点でワークフローを起動する形で併用することが多い
Lambda単体でのオーケストレーション実装状態管理・リトライ・可視化をコードで自作するとStep Functionsの再発明になる。分岐やリトライが複雑になった時点で移行を検討する対象

想起チェック

Q1. AgentCoreハーネスの呼び出しで、多ターンの会話履歴のうちStep Functionsが受け取れるのはどこまで?

最後のアシスタント発言のみです。途中のターンやツール利用・推論ブロックは応答から破棄されます。詳細な過程を追うにはCloudWatch連携での観測が別途必要です。

Q2. モデル呼び出し失敗時にサーキットブレーカーを実装する標準の組み方は?

Task StateにRetry(指数バックオフ)とCatch(代替パスへの分岐)を定義することです。アプリケーションコード側で独自にリトライループを書くのは、観測性・バックオフ制御の面で劣ります。

Q3. 人間の承認を経てから処理を続けたいときのパターンは?

.waitForTaskTokenによるコールバックパターンです。タスクトークンを発行して待機し、承認担当者(人間)がコールバックAPIを呼ぶまで実行が止まります。

出典(AWS公式)