目次
- 初心者から実務者向けの包括的解説
- 概要
- Step Functions が解決する課題
- 主な特徴
- アーキテクチャ
- ワークフロータイプ(Standard vs Express)
- State Types
- ASL(アマゾンステーツランゲージ)基礎
- Distributed Map(大規模並列処理)
- Workflow Studio(ビジュアルエディタ)
- 主要ユースケース
- エラーハンドリング(Retry/Catch)
- サービス統合
- .sync / .waitForTaskToken
- クロスアカウント・クロスリージョン
- ロギング・モニタリング
- セキュリティ
- SAGA・SAGA Compensation
- Step Functions vs EventBridge vs Lambda + SQS
- 他の類似ツールとの比較
- クライアントとエコシステム
- ベストプラクティス
- トラブルシューティング
- 2025-2026 最新動向
- 学習リソース
- 実装例・活用シーン
- 導入ロードマップ
- 実装チェックリスト
- まとめ
AWS Step Functions 完全ガイド 2026
初心者から実務者向けの包括的解説
AWS Step Functions は、マイクロサービス・MLパイプライン・バッチ処理・長期ワークフローを、ステートマシンベースの サーバーレスオーケストレーション で管理する AWS Application Integration サービスです。AWS Lambda・ECS・SageMaker・Bedrock など 200+ の AWS サービスを、コード不要な宣言型の Amazon States Language(ASL)で統合し、エラーハンドリング・リトライ・条件分岐・並列処理を組み込めます。本ガイドは、初心者から実務者向けに、Step Functions の全貌を体系的に解説するものです。
ドキュメントの目的
本ガイドは以下を対象としています。
- 初心者向け: Step Functions とは何か、なぜ必要かを学びたい方
- 開発者向け: ワークフロー定義・Workflow Studio・Lambda 統合を実装したい方
- DevOps/SRE 向け: Distributed Map での大規模並列処理・エラーハンドリングを構築したい方
- アーキテクト向け: Airflow・EventBridge・Lambda との使い分け・ベストプラクティス
- 意思決定者向け: OSS オーケストレーション(Temporal・Airflow)vs Step Functions の投資判断
2026 年の Step Functions エコシステム
- Distributed Map 拡張:JSONata サポート、Map Run による実行詳細表示、最大 10,000 並列ワーカー
- Amazon Bedrock 統合:AI エージェントのオーケストレーション、生成 AI パイプライン
- Variables 機能:ステートマシン内での変数定義・再利用(ASL 拡張)
- JSONata 式言語:より表現力豊かなデータ変換(従来の States Intrinsic Functions の補完)
- クロスアカウント実行:マルチテナント・複数 AWS アカウント環境への対応
- LocalStack・SAM Local 対応:ローカル開発環境でステートマシンをシミュレート
- Express Workflow 同期実行:API Gateway 統合で REST API として即座に応答
- Map Run:大規模 Distributed Map の詳細なメトリクス・ログ表示
定義
AWS 公式による定義:
“AWS Step Functions is a serverless, visual orchestration platform that lets you build and run multi-step workflows that combine AWS services, including AWS Lambda, Amazon ECS, AWS Glue, and more.”
複数の AWS サービスをビジュアルにつなぎ、実行状態・エラー・再試行を完全に管理します。
エディション・ワークフロータイプ
Step Functions には 2 つのワークフロータイプ があります:
- Standard ワークフロー:最大 1 年の実行期間、完全な実行履歴、長期ワークフロー・人間承認向け
- Express ワークフロー(非同期・同期):最大 5 分、高スループット(100,000/秒)、IoT・イベント駆動向け
Step Functions 自体はマネージドサービスで、エディション分けはありません。
目次
- 概要
- Step Functions が解決する課題
- 主な特徴
- アーキテクチャ
- ワークフロータイプ(Standard vs Express)
- State Types(Pass・Task・Choice・Wait・Parallel・Map・Succeed・Fail)
- ASL(Amazon States Language)基礎
- Distributed Map(大規模並列処理)
- Workflow Studio(ビジュアルエディタ)
- 主要ユースケース(10+)
- エラーハンドリング(Retry・Catch)
- サービス統合(Lambda・ECS・SageMaker・Bedrock・200+ 直接統合)
- .sync・.waitForTaskToken
- クロスアカウント・クロスリージョン
- ロギング・モニタリング(CloudWatch・X-Ray・Map Run)
- セキュリティ(IAM・リソースポリシー)
- SAGA・SAGA Compensation
- Step Functions vs EventBridge vs Lambda + SQS
- 他の類似ツールとの比較
- クライアントとエコシステム(CDK・SAM・Terraform・Workflow Studio・Local emulator)
- ベストプラクティス
- トラブルシューティング
- 2025-2026 最新動向
- 学習リソース
- 実装例・活用シーン
- 導入ロードマップ
- 実装チェックリスト
- まとめ
- 参考文献
概要
初心者向けメモ: Step Functions は「複数の AWS サービスを接続して、複雑なワークフローを自動化する」プラットフォームです。Lambda 関数を 1 つ呼ぶだけでなく、Lambda → DynamoDB → SQS → SNS という複雑な処理フローを、コードを書かずに JSON/YAML で定義できます。各ステップの失敗時の自動リトライ、条件分岐、並列処理もすべて宣言的に管理できるのが特徴です。
Step Functions の位置づけは以下の通り:
graph TD
Event[S3アップロード/API呼び出し/EventBridge]
Event -->|トリガー| StepFunctions[AWS Step Functions]
StepFunctions -->|呼び出し| Lambda[Lambda関数]
StepFunctions -->|呼び出し| ECS[ECSタスク]
StepFunctions -->|呼び出し| SageMaker[SageMaker Training]
StepFunctions -->|呼び出し| DynamoDB[DynamoDB操作]
StepFunctions -->|呼び出し| Bedrock[Amazon Bedrock]
Lambda --> Result[実行結果]
ECS --> Result
SageMaker --> Result
DynamoDB --> Result
Bedrock --> Result
Result -->|完了通知| SNS[SNS/SQS]
Result -->|ダッシュボード| CloudWatch[CloudWatch Logs]
Step Functions が解決する課題
1. 複数 Lambda の接続(Lambda Chaining の問題)
問題: Lambda 関数を複数連鎖させる場合、各関数でエラー処理・リトライ・タイムアウト管理を個別実装する必要があり、コード複雑度が指数関数的に増加します。
// ❌ Lambda Chaining: 各関数でエラー処理を繰り返す
async function lambda1(event) {
try {
const result = await callLambda2(event);
return result;
} catch (e) {
// エラー処理・リトライロジック...
}
}
解決: Step Functions で ASL で宣言的に定義。
{
"Retry": [{
"ErrorEquals": ["Lambda.ServiceException"],
"IntervalSeconds": 2,
"MaxAttempts": 3,
"BackoffRate": 2.0
}],
"Catch": [{"ErrorEquals": ["States.ALL"], "Next": "HandleError"}]
}
2. 長時間実行ワークフロー(Lambda 15 分制限)
問題: Lambda の最大実行時間は 15 分のため、承認フロー(数日)・ML パイプライン(数時間)・大量データ処理は Lambda だけで実装不可。
解決: Step Functions Standard ワークフロー最大 1 年 の実行期間。Wait for callback で人間の承認待機。
3. AWS サービス統合の煩雑さ
問題: Lambda を仲介して DynamoDB・ECS・SageMaker を呼び出すため、Lambda ボイラープレート・SDK 呼び出し・IAM 権限管理が複雑化。
解決: Step Functions SDK Integration で 220+ AWS サービスを直接オーケストレーション。Lambda を経由しないため、コスト削減・レイテンシー低減。
4. ワークフロー状態の把握困難
問題: Lambda Chaining では「今どのステップの誰が何をしているのか」が不明確。監査ログ・実行履歴が散在。
解決: Step Functions は完全な実行履歴・各ステップの入出力・エラー情報を CloudWatch Logs・X-Ray で一元管理。
主な特徴
| 特徴 | 説明 |
|---|---|
| 宣言的ワークフロー定義 | Amazon States Language(ASL)で JSON/YAML で複雑なフロー定義 |
| 200+ AWS サービス直接統合 | Lambda・ECS・DynamoDB・SageMaker・Bedrock・SNS・SQS・Glue・Athena・EventBridge 等 |
| エラーハンドリング組み込み | Retry(指数バックオフ)・Catch(エラーキャッチ)を宣言的に定義 |
| 条件分岐(Choice ステート) | if/else・複数条件分岐を ASL で表現 |
| 並列処理(Parallel / Distributed Map) | Parallel:複数ブランチ並列実行。Distributed Map:100M+ アイテムの並列処理(最大 10,000 ワーカー) |
| 長期実行ワークフロー | Standard:最大 1 年(監査ログ 90 日保持)。Express:最大 5 分(高スループット) |
| 人間承認(Wait for Callback) | .waitForTaskToken でトークン発行、外部システムからコールバックで再開 |
| ビジュアルエディタ | Workflow Studio でドラッグ&ドロップ定義・デバッグ・単体テスト |
| 実行履歴・監査ログ | CloudWatch Logs・X-Ray・CloudTrail で完全なエビデンス |
| 価格効率性 | Standard 0.025/1,000 状態遷移(月 4,000 は無料)。Express 1/100 万実行 + $0.00001667/GB-秒 |
アーキテクチャ
初心者向けメモ: Step Functions は 3 層構造 です。イベント(S3・EventBridge)から Step Functions が起動され、各ステートで AWS サービス(Lambda・ECS・DynamoDB)を呼び出し、結果を次のステートに渡します。「Step Functions 自体はデータを保存しない」のが重要で、状態・入出力はすべて CloudWatch Logs・実行履歴に記録されます。
graph TD
subgraph Trigger[イベントトリガー]
S3[S3アップロード]
EventBridge[EventBridge ルール]
API[API Gateway]
Others[その他イベント]
end
subgraph Core[Step Functions コア]
ASL["Amazon States Language<br/>ステートマシン定義"]
Engine["実行エンジン<br/>(状態管理・遷移制御)"]
Retry["リトライ・エラー処理<br/>(Retry / Catch)"]
end
subgraph Services[AWS サービス統合層]
Lambda[Lambda]
ECS[ECS / Fargate]
DynamoDB[DynamoDB]
SageMaker[SageMaker]
Bedrock[Bedrock]
Others2["SNS / SQS / Glue<br/>200+ サービス"]
end
subgraph Monitoring[ロギング・モニタリング]
CloudWatch["CloudWatch Logs<br/>(実行ログ)"]
XRay["AWS X-Ray<br/>(分散トレース)"]
History["実行履歴<br/>(90日保持)"]
end
Trigger --> Core
Core --> Services
Services --> Retry
Retry -->|成功| Core
Retry -->|失敗| Engine
Core --> Monitoring
アーキテクチャの各層
1. イベントトリガー層
- S3 バケットへのアップロード(S3 イベント通知)
- EventBridge ルール(スケジュール・カスタムイベント)
- API Gateway REST API
- SNS・SQS メッセージ
- CloudWatch イベント(スケジュール実行)
- 手動実行(AWS コンソール・CLI・SDK)
2. Step Functions コア層
- ASL 定義:JSON/YAML でステートマシン定義
- 実行エンジン:ステート間の遷移制御・状態管理
- リトライ・エラー処理:指数バックオフ・Catch ハンドラー
3. AWS サービス統合層
- 直接統合(SDK Integration):arn:aws:states:::service:action
- Lambda 仲介:arn:aws:lambda:region:account:function:name
- HTTP エンドポイント:https://example.com/api
4. ロギング・モニタリング層
- CloudWatch Logs:詳細ログ、カスタムログフィルター
- X-Ray:分散トレース、パフォーマンス分析
- 実行履歴:ステップごとの入出力・タイムスタンプ
ワークフロータイプ(Standard vs Express)
| 観点 | Standard ワークフロー | Express ワークフロー |
|---|---|---|
| 最大実行時間 | 1 年 | 5 分 |
| 実行履歴保持 | ✅ 完全な監査ログ(90 日) | ❌ CloudWatch Logs のみ |
| 実行開始レート | 2,000/秒 | 100,000/秒 |
| デリバリー保証 | 正確に 1 回(Exactly-Once) | 少なくとも 1 回(At-Least-Once, 非同期)/ 最大 1 回(At-Most-Once, 同期) |
| 価格 | `0.025/1,000 状態遷移(月 4,000 無料) | `1/100 万実行 + $0.00001667/GB-秒 |
| 適用シーン | 長期ワークフロー・人間承認・監査必要 | 高スループット・短期処理・IoT イベント |
| 実行例 | 注文フロー(数日)・ML パイプライン・承認フロー | ストリーム処理・リアルタイム分析・API レスポンス |
| .waitForTaskToken | ✅ サポート | ✅ サポート(非同期のみ) |
| Distributed Map | ✅ サポート | ✅ サポート |
選択ガイド
Standard を選ぶ場合:
- ✅ ワークフロー期間が 5 分を超える
- ✅ 人間による承認ステップが含まれる
- ✅ 監査ログ・完全な実行履歴が必要
- ✅ Exactly-Once デリバリー保証が必要
- ✅ 実行レート 2,000/秒以下
Express を選ぶ場合:
- ✅ ワークフロー期間が 5 分以内
- ✅ 100,000/秒 の高スループット必要
- ✅ マイクロサービス・イベント駆動
- ✅ 非同期バックグラウンド処理
- ✅ At-Least-Once デリバリーで許容
State Types
Step Functions には 8 つの主要ステートタイプ があります。
1. Task ステート
説明: AWS サービス・Lambda・HTTP エンドポイント・アクティビティを呼び出して処理を実行。
{
"Type": "Task",
"Resource": "arn:aws:states:::lambda:invoke",
"Parameters": {
"FunctionName": "MyFunction",
"Payload.{{CONTENT}}quot;: "{{CONTENT}}quot;
},
"Next": "ProcessResult"
}
パターン:
arn:aws:lambda:region:account:function:name:Lambda 関数arn:aws:states:::sqs:sendMessage:SQS メッセージ送信arn:aws:states:::dynamodb:putItem:DynamoDB 書き込みarn:aws:states:::ecs:runTask.sync:2:ECS タスク(同期待機)https://example.com/api:HTTP(S) エンドポイント
2. Choice ステート
説明: 入力データに基づいて条件分岐。if/else 相当。
{
"Type": "Choice",
"Choices": [
{
"Variable": "$.order.total",
"NumericGreaterThan": 1000,
"Next": "ProcessLargeOrder"
},
{
"Variable": "$.order.status",
"StringEquals": "VIP",
"Next": "ProcessVIP"
}
],
"Default": "ProcessNormalOrder"
}
比較演算子:
StringEquals、NumericEquals、BooleanEqualsStringMatches(正規表現)NumericGreaterThan、NumericLessThan、NumericGreaterThanEquals、NumericLessThanEqualsAnd、Or、Not(複合条件)
3. Wait ステート
説明: 固定秒数待機、または特定の日時まで待機。
{
"Type": "Wait",
"Seconds": 300,
"Next": "ProcessAfterWait"
}
または
{
"Type": "Wait",
"Timestamp": "2026-12-25T00:00:00Z",
"Next": "ProcessOnDate"
}
4. Parallel ステート
説明: 複数のブランチを並列実行し、すべて完了まで待機。
{
"Type": "Parallel",
"Branches": [
{
"StartAt": "CheckInventory",
"States": {
"CheckInventory": {
"Type": "Task",
"Resource": "arn:aws:states:::lambda:invoke",
"End": true
}
}
},
{
"StartAt": "ProcessPayment",
"States": {
"ProcessPayment": {
"Type": "Task",
"Resource": "arn:aws:states:::dynamodb:putItem",
"End": true
}
}
}
],
"Next": "CombineResults"
}
5. Map ステート / Distributed Map
説明: 配列の各要素を反復処理。Distributed Map で最大 100M アイテム・10,000 並列ワーカー対応。
{
"Type": "Map",
"ItemsPath": "$.items",
"MaxConcurrency": 10,
"Iterator": {
"StartAt": "ProcessItem",
"States": {
"ProcessItem": {
"Type": "Task",
"Resource": "arn:aws:states:::lambda:invoke",
"End": true
}
}
},
"Next": "Succeeded"
}
Distributed Map(大規模並列処理):
{
"Type": "Map",
"ItemReader": {
"Resource": "arn:aws:states:::s3:getObject",
"Parameters": {
"Bucket": "my-bucket",
"Key": "data.csv"
}
},
"MaxItemsPath": "$.maxItems",
"MaxConcurrency": 10000,
"TolerateFailureCount": 100,
"Iterator": {
"StartAt": "ProcessCSVRow",
"States": {
"ProcessCSVRow": {
"Type": "Task",
"Resource": "arn:aws:lambda:region:account:function:process",
"End": true
}
}
}
}
6. Pass ステート
説明: 入力データを変換して次のステートに渡す。処理実行しない(デバッグ・データ加工用)。
{
"Type": "Pass",
"Parameters": {
"orderId.{{CONTENT}}quot;: "$.id",
"total.{{CONTENT}}quot;: "States.MathAdd($.price, $.tax)",
"timestamp": "2026-04-26T00:00:00Z"
},
"Next": "ProcessOrder"
}
7. Succeed ステート
説明: ワークフロー成功終了。
{
"Type": "Succeed"
}
8. Fail ステート
説明: ワークフロー失敗終了。エラーコード・メッセージ指定。
{
"Type": "Fail",
"Error": "InvalidOrderError",
"Cause": "Order total exceeds credit limit"
}
ステートタイプ比較表
| ステート | 用途 | 処理実行 | データ変換 |
|---|---|---|---|
| Task | AWS サービス呼び出し | ✅ | ❌(結果は出力) |
| Choice | 条件分岐 | ❌ | ❌ |
| Wait | 遅延実行 | ❌ | ❌ |
| Parallel | 並列実行 | ✅(複数ブランチ) | ❌ |
| Map | 反復処理 | ✅(イテレーション) | ❌ |
| Pass | データ加工 | ❌ | ✅ |
| Succeed | 成功終了 | ❌ | ❌ |
| Fail | 失敗終了 | ❌ | ❌ |
ASL(アマゾンステーツランゲージ)基礎
ASL とは
Amazon States Language(ASL)は JSON/YAML ベースの 宣言型ワークフロー定義言語。ステートマシン全体の構造・各ステートの処理内容・エラーハンドリング・入出力変換を記述します。
基本構造
{
"Comment": "Order processing workflow",
"StartAt": "ValidateOrder",
"States": {
"ValidateOrder": {
"Type": "Task",
"Resource": "arn:aws:states:::lambda:invoke",
"Parameters": {
"FunctionName": "validate-order",
"Payload.{{CONTENT}}quot;: "{{CONTENT}}quot;
},
"Next": "CheckInventory",
"Retry": [
{
"ErrorEquals": ["Lambda.ServiceException"],
"IntervalSeconds": 2,
"MaxAttempts": 3,
"BackoffRate": 2.0
}
],
"Catch": [
{
"ErrorEquals": ["InvalidOrderError"],
"Next": "NotifyFailure",
"ResultPath": "$.errorInfo"
}
]
},
"CheckInventory": {
"Type": "Task",
"Resource": "arn:aws:states:::dynamodb:getItem",
"Parameters": {
"TableName": "Inventory",
"Key": {
"ProductId": {
"S.{{CONTENT}}quot;: "$.productId"
}
}
},
"Next": "ProcessPayment"
},
"ProcessPayment": {
"Type": "Task",
"Resource": "arn:aws:states:::sqs:sendMessage",
"Parameters": {
"QueueUrl": "https://sqs.ap-northeast-1.amazonaws.com/123456789/payment-queue",
"MessageBody.{{CONTENT}}quot;: "States.JsonToString($.order)"
},
"End": true
},
"NotifyFailure": {
"Type": "Task",
"Resource": "arn:aws:states:::sns:publish",
"Parameters": {
"TopicArn": "arn:aws:sns:ap-northeast-1:123456789:order-alerts",
"Message.{{CONTENT}}quot;: "States.Format('Order {} failed: {}', $.orderId, $.errorInfo.Cause)"
},
"End": true
}
}
}
入出力処理(InputPath / OutputPath / ResultPath / Parameters)
ASL でのデータフロー制御:
| 属性 | 説明 | 例 |
|---|---|---|
| InputPath | 入力データの一部のみを次のステートに渡す | “InputPath”: “.order” ← ``.order オブジェクトのみ |
| OutputPath | ステート出力の一部のみを次のステートに渡す | “OutputPath”: “$.result” ← 結果の result フィールドのみ |
| ResultPath | タスク結果を元の入力のどこにマージするか | “ResultPath”: “$.processResult” ← 元データを保持 |
| Parameters | 入力を加工してタスク引数に渡す | "Parameters": {"id.": ".id", "name": "fixed"} |
例:
{
"StartAt": "EnrichData",
"States": {
"EnrichData": {
"Type": "Pass",
"InputPath": "$.customer",
"Parameters": {
"id.{{CONTENT}}quot;: "$.id",
"name.{{CONTENT}}quot;: "$.name",
"timestamp": "2026-04-26T00:00:00Z",
"status": "processed"
},
"ResultPath": "$.enriched",
"OutputPath": "{{CONTENT}}quot;,
"Next": "SaveToDatabase"
},
"SaveToDatabase": {
"Type": "Task",
"Resource": "arn:aws:states:::dynamodb:putItem",
"End": true
}
}
}
組み込み関数(Intrinsic Functions)
ASL で利用可能な関数:
| 関数 | 説明 | 例 |
|---|---|---|
| States.Format | 文字列フォーマット | States.Format('Order {}: {}', .id, .status) |
| States.StringToJson | 文字列 → JSON パース | States.StringToJson($.jsonString) |
| States.JsonToString | JSON → 文字列化 | .object)$ |
| States.JsonMerge | 2 つの JSON をマージ | States.JsonMerge(.obj1, .obj2) |
| States.ArrayGetItem | 配列要素取得 | States.ArrayGetItem($.items, 0) |
| States.ArrayLength | 配列長取得 | States.ArrayLength($.items) |
| States.ArrayContains | 配列に要素が含まれるか | States.ArrayContains($.items, 'value') |
| States.MathAdd | 数値加算 | States.MathAdd(.price, .tax) |
| States.MathSubtract | 数値減算 | States.MathSubtract(.total, .discount) |
| States.UUID | UUID 生成 | States.UUID() |
JSONata サポート(2026 新機能)
より表現力豊かなデータ変換を実現:
{
"Type": "Pass",
"Parameters": {
"totalPrice.{{CONTENT}}quot;: "$.items.{\"quantity\": $.qty, \"price\": $.unitPrice}} | $sum(price * quantity)",
"highValueItems.{{CONTENT}}quot;: "$.items[price > 1000]"
}
}
Distributed Map(大規模並列処理)
概要
Distributed Map は、100M 以上のアイテムを最大 10,000 並列ワーカーで処理 できる Step Functions の機能。CSV・JSON Lines・Parquet ファイルなど、S3 から直接読み込んで大規模バッチ処理を実施。
ユースケース
- 10 億レコードの ETL(Extract-Transform-Load)
- 複数リージョン・アカウントへの一括デプロイ
- 大規模画像・動画・ドキュメント処理
- 機械学習トレーニングデータの並列前処理
ASL 例
{
"Comment": "Distributed Map for large-scale data processing",
"StartAt": "ProcessCSVFromS3",
"States": {
"ProcessCSVFromS3": {
"Type": "Map",
"ItemReader": {
"Resource": "arn:aws:states:::s3:getObject",
"Parameters": {
"Bucket": "my-data-bucket",
"Key": "large-dataset.csv"
},
"ReaderConfig": {
"InputType": "CSV",
"CSVHeaderLocation": "FIRST_ROW"
}
},
"MaxConcurrency": 10000,
"MaxItemsPath": "$.maxItems",
"TolerateFailureCount": 1000,
"Iterator": {
"StartAt": "TransformRow",
"States": {
"TransformRow": {
"Type": "Task",
"Resource": "arn:aws:states:::lambda:invoke",
"Parameters": {
"FunctionName": "transform-csv-row",
"Payload.{{CONTENT}}quot;: "{{CONTENT}}quot;
},
"ResultPath": "$.transformedData",
"Next": "SaveToS3"
},
"SaveToS3": {
"Type": "Task",
"Resource": "arn:aws:states:::s3:putObject",
"Parameters": {
"Bucket": "my-output-bucket",
"Key.{{CONTENT}}quot;: "States.Format('output/{}/{}', $.id, States.UUID())",
"Body.{{CONTENT}}quot;: "States.JsonToString($.transformedData)"
},
"End": true
}
}
},
"Next": "NotifyCompletion"
},
"NotifyCompletion": {
"Type": "Task",
"Resource": "arn:aws:states:::sns:publish",
"Parameters": {
"TopicArn": "arn:aws:sns:ap-northeast-1:123456789:data-processing",
"Message": "Distributed Map processing completed"
},
"End": true
}
}
}
Map Run
Map Run は、Distributed Map 実行の詳細メトリクス・ログを取得・分析するための機能。CloudWatch で並列度・処理時間・エラー率を可視化。
Workflow Studio(ビジュアルエディタ)
概要
AWS コンソール上で ドラッグ&ドロップ でステートマシンを構築。JSON ASL との双方向同期により、ビジュアルと ASL コードを同時に編集可能。
主な機能
| 機能 | 説明 |
|---|---|
| キャンバス | ステートを配置・接続してフローを構築 |
| プロパティパネル | 選択したステートの設定(Resource・Retry・Catch 等)を編集 |
| ASL エディタ | 左側に JSON コード編集(リアルタイム同期) |
| 検証 | エラーをリアルタイム表示(リソース ARN の形式等) |
| デバッグ | テスト実行で入力データを指定、ステップごとの出力確認 |
| Mock サービス | 外部サービス呼び出しをモック化してローカルテスト |
ワークフロー
- Create state machine → Workflow Studio を選択
- キャンバスに Task ステート配置 → リソース選択(Lambda・ECS 等)
- プロパティパネルで設定 → Retry・Catch・InputPath・OutputPath
- ASL エディタで細部調整 → Parameters・組み込み関数
- Test execution → テストデータで実行・デバッグ
- デプロイ → Create state machine で確定
主要ユースケース
1. E-Commerce Order Processing(注文処理フロー)
graph TD
Order[注文受信]
Order -->|ValidateOrder| Validate{有効か?}
Validate -->|Yes| Check[在庫確認]
Validate -->|No| Fail[キャンセル]
Check -->|OK| Parallel["並列処理"]
Check -->|NG| Refund[払戻]
Parallel -->|Branch1| Payment[決済処理]
Parallel -->|Branch2| Notify[在庫減少通知]
Parallel -->|Branch3| Log[ログ記録]
Payment -->|成功| Shipping[配送手配]
Payment -->|失敗| CompensatePayment[補償処理]
Shipping --> Notify2[完了通知]
Notify2 --> End[終了]
実装:
- Validate Order(Lambda)
- Check Inventory(DynamoDB)
- Process Payment(SQS + Lambda)
- Arrange Shipping(ECS タスク)
- Compensating Transaction(ロールバック)
2. Machine Learning Pipeline(ML パイプライン)
- Data Preparation(Glue ジョブ)
- Feature Engineering(Lambda)
- Model Training(SageMaker Training Job)
- Model Evaluation(Lambda)
- Conditional Deployment(Choice + SageMaker Endpoint)
3. Approval Workflow(人間承認フロー)
- Request Submit → DynamoDB 保存
- Send Approval Request → SNS → Approver Email(.waitForTaskToken)
- Wait for Callback → トークン返却待機
- Resume Workflow → アカウント有効化
4. SAGA Pattern(分散トランザクション)
複数マイクロサービスの一貫性を Step Functions で管理:
- Order Service → Payment Service → Shipping Service
- 失敗時は補償トランザクション(Refund・Cancel Shipping)
5. Data Migration(データ移行)
- S3 から CSV 読み込み
- Distributed Map で 100M レコード並列処理
- DynamoDB・Redshift へ一括書き込み
6. CI/CD Pipeline Orchestration
- Code Build ジョブ起動
- 複数リージョンへの並列デプロイ(Parallel)
- 自動テスト実行
- デプロイ成功・失敗通知
7. IoT データ処理(ストリーム処理)
Express Workflow で IoT デバイスからの高頻度イベント処理:
- センサーデータ入力 → EventBridge トリガー
- Lambda で異常検知
- リアルタイム通知
8. Bedrock AI Agent Orchestration
AI エージェント(Anthropic Claude など)を利用した複雑なワークフロー:
- ユーザー入力 → Bedrock の Claude API 呼び出し
- Claude の出力に基づく条件分岐
- 外部 API 呼び出し(Web 検索・ツール実行)
9. Scheduled Batch Processing(スケジュール実行)
CloudWatch Events で定期実行:
- 毎日 22:00 に開始
- 大規模ログ分析(Athena)
- レポート生成(QuickSight)
- メール配信(SES)
10. Event-Driven Microservice Orchestration
複数マイクロサービスの連携:
- EventBridge → Step Functions
- REST API マイクロサービス呼び出し(HTTP(S)Task)
- 非同期処理(SQS キュー)
- 最終結果通知(SNS)
エラーハンドリング(Retry/Catch)
Retry(自動リトライ)
タスク失敗時に自動的に再試行。指数バックオフ&ジッタで分散化。
{
"Type": "Task",
"Resource": "arn:aws:states:::lambda:invoke",
"Retry": [
{
"ErrorEquals": ["Lambda.ServiceException"],
"IntervalSeconds": 1,
"MaxAttempts": 3,
"BackoffRate": 2.0,
"JitterStrategy": "FULL"
},
{
"ErrorEquals": ["States.Timeout"],
"IntervalSeconds": 5,
"MaxAttempts": 1
}
],
"Next": "ProcessResult"
}
リトライスケジュール例(IntervalSeconds=1, BackoffRate=2.0, MaxAttempts=3):
- 1 回目失敗 → 1 秒待機 → 再試行
- 2 回目失敗 → 2 秒待機 → 再試行
- 3 回目失敗 → 4 秒待機 → 再試行
- すべて失敗 → Catch に遷移
Catch(エラーキャッチ)
特定のエラーをキャッチして別のステートに遷移。
{
"Type": "Task",
"Resource": "arn:aws:states:::lambda:invoke",
"Catch": [
{
"ErrorEquals": ["InvalidOrderError"],
"Next": "HandleInvalidOrder",
"ResultPath": "$.error"
},
{
"ErrorEquals": ["States.ALL"],
"Next": "HandleGenericError",
"ResultPath": "$.allErrors"
}
],
"End": true
}
組み込みエラー:
States.ALL→ すべてのエラーStates.TaskFailed→ タスク失敗States.Timeout→ タイムアウトStates.HeartbeatTimeout→ ハートビートタイムアウトStates.BranchFailed→ 並列ブランチ失敗States.NoChoiceMatched→ Choice ステートでマッチなし
Retry と Catch の組み合わせ
{
"Type": "Task",
"Resource": "arn:aws:states:::ecs:runTask.sync:2",
"Retry": [
{
"ErrorEquals": ["States.TaskFailed"],
"IntervalSeconds": 10,
"MaxAttempts": 2,
"BackoffRate": 1.5
}
],
"Catch": [
{
"ErrorEquals": ["States.ALL"],
"Next": "SendAlertAndFail",
"ResultPath": "$.failureDetails"
}
],
"Next": "ProcessSuccess"
}
サービス統合
直接統合パターン(SDK Integration)
Step Functions から Lambda を経由せずに AWS サービスを直接呼び出し。arn:aws:states:::service:action 形式。
Lambda 統合
{
"Type": "Task",
"Resource": "arn:aws:states:::lambda:invoke",
"Parameters": {
"FunctionName": "my-function",
"Payload.{{CONTENT}}quot;: "{{CONTENT}}quot;
}
}
DynamoDB 統合
{
"Type": "Task",
"Resource": "arn:aws:states:::dynamodb:putItem",
"Parameters": {
"TableName": "Orders",
"Item": {
"OrderId": {
"S.{{CONTENT}}quot;: "$.orderId"
},
"Status": {
"S": "pending"
}
}
}
}
ECS Task 実行
{
"Type": "Task",
"Resource": "arn:aws:states:::ecs:runTask.sync:2",
"Parameters": {
"LaunchType": "FARGATE",
"Cluster": "my-cluster",
"TaskDefinition": "my-task",
"NetworkConfiguration": {
"AwsvpcConfiguration": {
"Subnets": ["subnet-abc123"],
"SecurityGroups": ["sg-xyz789"]
}
}
}
}
SQS メッセージ送信
{
"Type": "Task",
"Resource": "arn:aws:states:::sqs:sendMessage",
"Parameters": {
"QueueUrl": "https://sqs.ap-northeast-1.amazonaws.com/123456789/queue-name",
"MessageBody.{{CONTENT}}quot;: "States.JsonToString($.message)"
}
}
SNS 通知
{
"Type": "Task",
"Resource": "arn:aws:states:::sns:publish",
"Parameters": {
"TopicArn": "arn:aws:sns:ap-northeast-1:123456789:topic-name",
"Message.{{CONTENT}}quot;: "States.Format('Order {} status: {}', $.orderId, $.status)"
}
}
SageMaker Training Job
{
"Type": "Task",
"Resource": "arn:aws:states:::sagemaker:createTrainingJob.sync:2",
"Parameters": {
"TrainingJobName.{{CONTENT}}quot;: "States.Format('job-{}', States.UUID())",
"RoleArn": "arn:aws:iam::123456789:role/SageMaker",
"AlgorithmSpecification": {
"TrainingImage": "382416733822.dkr.ecr.ap-northeast-1.amazonaws.com/xgboost:latest",
"TrainingInputMode": "File"
},
"InputDataConfig": [{
"ChannelName": "training",
"DataSource": {
"S3DataSource": {
"S3Uri": "s3://my-bucket/training-data/",
"S3DataType": "S3Prefix",
"S3DataDistributionType": "FullyReplicated"
}
}
}],
"OutputDataConfig": {
"S3OutputPath": "s3://my-bucket/model-output/"
},
"ResourceConfig": {
"InstanceType": "ml.m5.xlarge",
"InstanceCount": 1,
"VolumeSizeInGB": 30
},
"StoppingCondition": {
"MaxRuntimeInSeconds": 3600
}
}
}
Amazon Bedrock (Claude AI) 統合
{
"Type": "Task",
"Resource": "arn:aws:states:::bedrock:invokeModel",
"Parameters": {
"ModelId": "anthropic.claude-3-5-sonnet-20241022-v2:0",
"Body.{{CONTENT}}quot;: "States.JsonToString({\"messages\": [{\"role\": \"user\", \"content\": \"Analyze: $.text\"}], \"max_tokens\": 1024})"
},
"Next": "ProcessAIOutput"
}
サポートされる統合(主要 200+ サービス)
| サービス | Resource パターン | 説明 |
|---|---|---|
| Lambda | arn:aws:states:::lambda:invoke |
Lambda 関数呼び出し |
| ECS | arn:aws:states:::ecs:runTask.sync:2 |
ECS タスク実行(同期) |
| DynamoDB | arn:aws:states:::dynamodb:putItem |
アイテム書き込み |
| SQS | arn:aws:states:::sqs:sendMessage |
メッセージ送信 |
| SNS | arn:aws:states:::sns:publish |
トピック発行 |
| S3 | arn:aws:states:::s3:getObject |
オブジェクト取得 |
| Glue | arn:aws:states:::glue:startJobRun.sync:2 |
Glue ジョブ実行 |
| SageMaker | arn:aws:states:::sagemaker:createTrainingJob.sync:2 |
学習ジョブ実行 |
| Bedrock | arn:aws:states:::bedrock:invokeModel |
LLM 推論 |
| Athena | arn:aws:states:::athena:startQueryExecution.sync:2 |
クエリ実行 |
| CodeBuild | arn:aws:states:::codebuild:startBuild.sync:2 |
ビルド実行 |
| HTTP(S) | https://example.com/api |
HTTP エンドポイント呼び出し |
| EventBridge | arn:aws:states:::events:putEvents |
イベント送信 |
| StepFunctions | arn:aws:states:::states:startExecution.sync:2 |
別ワークフロー実行 |
| …その他 200+ サービス | … | … |
.sync / .waitForTaskToken
.sync:2(同期待機)
Task リソースの末尾に .sync:2 を付けることで、タスク完了まで 同期的に待機。
{
"Type": "Task",
"Resource": "arn:aws:states:::ecs:runTask.sync:2",
"Parameters": {
"Cluster": "my-cluster",
"TaskDefinition": "my-task"
},
"Next": "ProcessResult"
}
動作:
- ECS タスク起動
- タスク完了まで待機(ステートマシン停止)
- タスク結果を入力として次のステートに渡す
.waitForTaskToken(コールバック待機)
外部システムからのコールバックを待機する。トークンを外部に渡し、処理完了後に SendTaskSuccess または SendTaskFailure API でトークンを返却して再開。
{
"Type": "Task",
"Resource": "arn:aws:states:::sqs:sendMessage.waitForTaskToken",
"Parameters": {
"QueueUrl": "https://sqs.ap-northeast-1.amazonaws.com/123456789/approval-queue",
"MessageBody": {
"approvalRequest": "User onboarding",
"taskToken.{{CONTENT}}quot;: "$.Task.Token"
}
},
"Next": "AccountActivation"
}
使用例:人間承認フロー
- SNS/Email で承認者にリクエスト送信(taskToken 含む)
- 承認者が URL をクリック → API Gateway → Lambda 呼び出し
- Lambda が
SendTaskSuccessで taskToken を返却 - Step Functions 再開 → 次のステートへ
import boto3
sfn_client = boto3.client('stepfunctions')
def approve_workflow(event, context):
task_token = event['taskToken']
# 承認処理
response = sfn_client.send_task_success(
taskToken=task_token,
output='{"approved": true}'
)
return {'statusCode': 200}
クロスアカウント・クロスリージョン
クロスアカウント実行
別の AWS アカウントから Step Functions ワークフローを実行。AssumeRole で権限委譲。
{
"Type": "Task",
"Resource": "arn:aws:states:region:ACCOUNT-B:stateMachine:MyStateMachine",
"RoleArn": "arn:aws:iam::ACCOUNT-A:role/StepFunctionsAssumeRole",
"Next": "ProcessResult"
}
IAM 設定:
Account A(実行元)のロール:
{
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": "arn:aws:iam::ACCOUNT-B:role/StepFunctionsService"
}
Account B(実行先)のトラストリレーションシップ:
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::ACCOUNT-A:role/StepFunctionsService"
},
"Action": "sts:AssumeRole"
}
クロスリージョン実行
別のリージョンへのワークフロー実行も同様に Resource ARN 指定:
{
"Type": "Task",
"Resource": "arn:aws:states:us-west-2:123456789:stateMachine:GlobalWorkflow",
"Next": "CheckResult"
}
ロギング・モニタリング
CloudWatch Logs
Step Functions 実行ログをリアルタイムで記録。
設定:
{
"StateMachineArn": "arn:aws:states:ap-northeast-1:123456789:stateMachine:MyWorkflow",
"LoggingConfiguration": {
"Level": "ALL",
"IncludeExecutionData": true,
"Destinations": [
{
"CloudWatchLogsLogGroup": {
"LogGroupName": "/aws/stepfunctions/my-workflow"
}
}
]
}
}
ログレベル:
ALL→ すべてのイベント(詳細)ERROR→ エラーのみFATAL→ 致命的エラーのみOFF→ ロギング無効
X-Ray(分散トレース)
Step Functions 実行を X-Ray で可視化。各ステートの実行時間・エラーを分析。
設定:
{
"StateMachineArn": "arn:aws:states:ap-northeast-1:123456789:stateMachine:MyWorkflow",
"TracingConfiguration": {
"Enabled": true
}
}
実行履歴
AWS コンソールで各ステップの入出力・タイムスタンプを確認(90 日保持)。
Map Run
Distributed Map の詳細メトリクスを CloudWatch で表示:
- 並列度(実行中のワーカー数)
- 処理時間分布
- エラー率
セキュリティ
IAM ロールと権限
Step Functions に関連するロール:
Step Functions 実行ロール
ワークフロー内でサービス呼び出しを行うための権限:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"lambda:InvokeFunction",
"dynamodb:PutItem",
"sqs:SendMessage",
"sns:Publish"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": "iam:PassRole",
"Resource": "arn:aws:iam::123456789:role/*"
}
]
}
API 呼び出し時のロール
Step Functions API を呼び出すユーザー・ロール:
{
"Effect": "Allow",
"Action": [
"states:StartExecution",
"states:DescribeExecution",
"states:GetExecutionHistory"
],
"Resource": "arn:aws:states:ap-northeast-1:123456789:stateMachine:MyWorkflow"
}
リソースポリシー
ワークフローへのアクセスをリソースレベルで制限:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "lambda.amazonaws.com"
},
"Action": "states:StartExecution",
"Resource": "arn:aws:states:ap-northeast-1:123456789:stateMachine:MyWorkflow"
}
]
}
暗号化
- 実行履歴:CloudWatch Logs KMS 暗号化対応
- ログデータ:X-Ray、CloudWatch Logs ネイティブ暗号化
SAGA・SAGA Compensation
SAGA パターン
複数の分散トランザクション間で一貫性を保証。各ステップの失敗時に補償トランザクション(ロールバック)を実行。
例:E-Commerce Order Processing
{
"Comment": "SAGA Pattern for Order Processing",
"StartAt": "ReserveInventory",
"States": {
"ReserveInventory": {
"Type": "Task",
"Resource": "arn:aws:states:::dynamodb:updateItem",
"Parameters": {
"TableName": "Inventory",
"Key": {"ProductId": {"S.{{CONTENT}}quot;: "$.productId"}},
"UpdateExpression": "SET InventoryCount = InventoryCount - :qty",
"ExpressionAttributeValues": {
":qty": {"N.{{CONTENT}}quot;: "$.quantity"}
}
},
"Next": "ProcessPayment",
"Catch": [{
"ErrorEquals": ["States.ALL"],
"Next": "ReserveInventoryFailed"
}]
},
"ProcessPayment": {
"Type": "Task",
"Resource": "arn:aws:states:::sqs:sendMessage",
"Parameters": {
"QueueUrl": "https://sqs.ap-northeast-1.amazonaws.com/123456789/payment-queue",
"MessageBody.{{CONTENT}}quot;: "States.JsonToString($.paymentInfo)"
},
"Next": "ArrangeShipping",
"Catch": [{
"ErrorEquals": ["States.ALL"],
"Next": "CompensateInventory"
}]
},
"ArrangeShipping": {
"Type": "Task",
"Resource": "arn:aws:states:::ecs:runTask.sync:2",
"Parameters": {
"Cluster": "shipping-cluster",
"TaskDefinition": "ship-order"
},
"Next": "OrderSuccess",
"Catch": [{
"ErrorEquals": ["States.ALL"],
"Next": "CompensatePayment"
}]
},
"OrderSuccess": {
"Type": "Succeed"
},
"CompensateInventory": {
"Type": "Task",
"Resource": "arn:aws:states:::dynamodb:updateItem",
"Parameters": {
"TableName": "Inventory",
"Key": {"ProductId": {"S.{{CONTENT}}quot;: "$.productId"}},
"UpdateExpression": "SET InventoryCount = InventoryCount + :qty",
"ExpressionAttributeValues": {
":qty": {"N.{{CONTENT}}quot;: "$.quantity"}
}
},
"Next": "InventoryRolledBack"
},
"CompensatePayment": {
"Type": "Task",
"Resource": "arn:aws:states:::sns:publish",
"Parameters": {
"TopicArn": "arn:aws:sns:ap-northeast-1:123456789:payment-refund",
"Message.{{CONTENT}}quot;: "States.JsonToString($.paymentInfo)"
},
"Next": "CompensateInventory"
},
"InventoryRolledBack": {
"Type": "Fail",
"Error": "OrderFailed",
"Cause": "Compensation completed"
},
"ReserveInventoryFailed": {
"Type": "Fail",
"Error": "InsufficientInventory"
}
}
}
Step Functions vs EventBridge vs Lambda + SQS
| 観点 | Step Functions | EventBridge | Lambda + SQS |
|---|---|---|---|
| 用途 | 複雑なワークフロー・長期実行 | イベント駆動・ルーティング | 非同期メッセージ処理 |
| 構文 | ASL(宣言型) | イベントマッピング | Lambda コード |
| 実行時間 | 最大 1 年(Standard) | リアルタイム(< 1 秒) | 15 分(Lambda 制限) |
| 状態管理 | ✅ 完全な履歴・状態保持 | ❌ ステートレス | ❌ アプリで管理 |
| エラーハンドリング | ✅ Retry・Catch 組み込み | ❌ 手動実装 | ❌ 手動実装 |
| 並列処理 | ✅ Parallel・Map | ❌ ターゲット単位 | ❌ アプリで管理 |
| 監査ログ | ✅ 90 日保持 | ✅ CloudTrail | ❌ CloudWatch Logs のみ |
| 価格 | `0.025/1k 遷移 | `1/100 万リクエスト | Lambda + SQS 従量課金 |
使い分け:
- Step Functions → 注文フロー・ML パイプライン・承認フロー・SAGA パターン
- EventBridge → S3 イベント → 複数ターゲット。API・イベント駆動。
- Lambda + SQS → シンプルな非同期処理・ワーカープール。
他の類似ツールとの比較
| ツール | メリット | デメリット | 用途 |
|---|---|---|---|
| Step Functions | AWS ネイティブ・200+ 統合・監査ログ | AWS のみ・学習曲線 | AWS エコシステム内の複雑ワークフロー |
| Apache Airflow / MWAA | Python DAG・豊富なオペレーター・コミュニティ | インフラ管理必要・複雑設定 | データエンジニアリング・定期バッチ |
| Temporal | 強力な状態管理・マルチランゲージ・OSS | オンプレ運用・学習コスト | 複雑な分散トランザクション・長期ワークフロー |
| Cadence | Temporal の前身・シンプル | メンテナンス中心・ドキュメント少ない | 分散アプリケーション |
| Prefect | モダン UI・クラウドネイティブ | Step Functions より高コスト | Python ベースのデータ処理 |
| Dagster | ソリッドベース・強力な型システム | 新興・社コミュニティ | データ管理・資産志向アーキテクチャ |
| Azure Logic Apps | Azure ネイティブ・マネージド | Azure のみ | Azure エコシステム |
| GCP Workflows | GCP ネイティブ・シンプル | 機能制限・小規模用 | GCP エコシステム |
| Camunda | BPMN 標準・エンタープライズ機能 | ライセンスコスト高・複雑 | エンタープライズワークフロー |
クライアントとエコシステム
AWS CDK(Infrastructure as Code)
import * as sfn from 'aws-cdk-lib/aws-stepfunctions';
import * as sfn_tasks from 'aws-cdk-lib/aws-stepfunctions-tasks';
import * as lambda from 'aws-cdk-lib/aws-lambda';
const validateOrderFn = new lambda.Function(this, 'ValidateOrder', {
runtime: lambda.Runtime.PYTHON_3_11,
handler: 'index.handler',
code: lambda.Code.fromAsset('lambda')
});
const validateTask = new sfn_tasks.LambdaInvoke(this, 'ValidateOrderTask', {
lambdaFunction: validateOrderFn
});
const workflow = new sfn.StateMachine(this, 'OrderWorkflow', {
definition: validateTask,
logs: {
level: sfn.LogLevel.ALL,
destination: new logs.LogGroup(this, 'LogGroup')
}
});
AWS SAM(Serverless Application Model)
Resources:
OrderWorkflow:
Type: AWS::Serverless::StateMachine
Properties:
Type: STANDARD
Logging:
Level: ALL
IncludeExecutionData: true
Destinations:
- CloudWatchLogsLogGroup:
LogGroupName: !Ref WorkflowLogGroup
Definition:
Comment: Order Processing Workflow
StartAt: ValidateOrder
States:
ValidateOrder:
Type: Task
Resource: arn:aws:lambda:ap-northeast-1:123456789:function:validate
Next: ProcessPayment
ProcessPayment:
Type: Task
Resource: arn:aws:states:::sqs:sendMessage
End: true
Terraform
resource "aws_sfn_state_machine" "order_workflow" {
name = "order-processing"
role_arn = aws_iam_role.step_functions_role.arn
definition = file("${path.module}/state_machine.json")
logging_configuration {
log_destination = "${aws_cloudwatch_log_group.step_functions.arn}:*"
include_execution_data = true
level = "ALL"
}
}
LocalStack・SAM Local
ローカル開発環境でステートマシンをシミュレート:
# LocalStack で Step Functions 実行
docker-compose up localstack
aws stepfunctions --endpoint-url=http://localhost:4566 create-state-machine \
--name my-workflow \
--definition file://state_machine.json \
--role-arn arn:aws:iam::000000000000:role/service-role
ベストプラクティス
1. ワークフロー設計
✅ DO:
- ステートマシンを モジュール化(子ワークフローに分割)
- 宣言的 に エラーハンドリング(Retry・Catch)を定義
- テスト可能 な小さなステート単位
- InputPath・OutputPath・ResultPath で入出力を明確化
❌ DON’T:
- 巨大な 1 つのステートマシン
- Lambda コード内でエラー処理を混在
- 無限ループ(Choose ステートで自己参照)
2. エラーハンドリング
{
"Retry": [
{
"ErrorEquals": ["States.TaskFailed", "States.Timeout"],
"IntervalSeconds": 2,
"MaxAttempts": 3,
"BackoffRate": 2.0
}
],
"Catch": [
{
"ErrorEquals": ["States.ALL"],
"Next": "HandleError",
"ResultPath": "$.error"
}
]
}
3. パフォーマンス最適化
- Distributed Map で大規模並列処理(100M+ アイテム)
- Express Workflow で高スループット短期処理
- 並列処理(Parallel) で依存なし処理を並行実行
4. コスト削減
- 状態遷移数を最小化 → Pass ステートでデータ加工して遷移削減
- 条件分岐(Choice) で不要なタスク実行をスキップ
- Express Workflow で短期処理・IoT 実行
5. 監視・ロギング
{
"LoggingConfiguration": {
"Level": "ALL",
"IncludeExecutionData": true,
"Destinations": [{
"CloudWatchLogsLogGroup": {
"LogGroupName": "/aws/stepfunctions/my-workflow"
}
}]
},
"TracingConfiguration": {
"Enabled": true
}
}
トラブルシューティング
よくある問題と解決策
| 問題 | 原因 | 解決策 |
|---|---|---|
| Execution timed out | Standard でも実行時間超過 | 待機時間・ポーリング不足を確認。Wait ステート追加。 |
| States.TaskFailed | サービス呼び出し失敗 | CloudWatch Logs・実行履歴で詳細確認。Retry パラメータ調整。 |
| InvalidJsonPath | InputPath・OutputPath が無効 | JSONPath 構文確認。`` で全データ、.key で特定フィールド。 |
| NoChoiceMatched | Choice ステートでマッチなし | Default ステート追加。条件見直し。 |
| Insufficient IAM permission | 実行ロール権限不足 | IAM ロールで lambda:InvokeFunction 等許可確認。 |
| BranchFailed | Parallel ブランチ失敗 | 各ブランチエラーを CloudWatch Logs で確認。Catch 追加。 |
デバッグテクニック
- Workflow Studio でビジュアルデバッグ → テスト実行で各ステップの出力確認
- CloudWatch Logs でログ検索 → エラーメッセージ・トレースバック確認
- X-Ray で分散トレース → ステート間の実行時間・エラー箇所特定
- 実行履歴を確認 → ステップごとの入出力・タイムスタンプ確認
2025-2026 最新動向
1. Distributed Map の拡張
- JSONata サポート → より表現力豊かなデータ変換
- Map Run → メトリクス・ログの詳細表示
- 最大 10,000 並列ワーカー → 大規模バッチ処理
2. Amazon Bedrock 統合
AI エージェント(Claude など)を Step Functions で直接オーケストレーション:
{
"Type": "Task",
"Resource": "arn:aws:states:::bedrock:invokeModel",
"Parameters": {
"ModelId": "anthropic.claude-3-5-sonnet-20241022-v2:0",
"Body.{{CONTENT}}quot;: "States.JsonToString($.promptData)"
}
}
3. Variables 機能
ステートマシン内で変数を定義・再利用:
{
"Comment": "Using Variables",
"StartAt": "Initialize",
"States": {
"Initialize": {
"Type": "Pass",
"Parameters": {
"orderId.{{CONTENT}}quot;: "$.id",
"totalPrice.{{CONTENT}}quot;: "States.MathAdd($.price, $.tax)"
},
"ResultPath": "$.context",
"Next": "ProcessOrder"
}
}
}
4. JSONata 式言語
複雑なデータ変換を より簡潔に:
{
"Type": "Pass",
"Parameters": {
"highValueOrders.{{CONTENT}}quot;: "$.orders[totalPrice > 1000]",
"totalRevenue.{{CONTENT}}quot;: "$sum($.orders.totalPrice)"
}
}
5. クロスアカウント・マルチテナント対応
より安全で詳細なクロスアカウント実行。
6. ローカル開発環境統合
LocalStack・SAM Local で完全にシミュレート可能。
学習リソース
公式ドキュメント
チュートリアル・ラボ
- AWS Workshops → Step Functions Workshop
- Qwiklabs → Step Functions ハンズオンラボ
- A Cloud Guru → Step Functions コース
コミュニティリソース
- GitHub AWS Samples → serverless-patterns
- Slack / Reddit → r/aws・AWS Community
実装例・活用シーン
シーン 1:E-Commerce Order Processing
S3 にアップロードされた注文ファイルを Step Functions で処理。在庫確認→決済→配送手配→通知まで一連のフロー。
シーン 2:ML Pipeline Orchestration
Glue データ準備 → SageMaker 学習 → Model Evaluation → 本番デプロイまで、完全に Step Functions で管理。
シーン 3:人間承認ワークフロー
申請書自動評価(Lambda)→ 承認者へ通知(SNS)→ 承認待機(.waitForTaskToken)→ アカウント有効化。
シーン 4:大規模データ ETL
Distributed Map で S3 CSV 100M レコードを処理。各行変換→データベース書き込み。
シーン 5:マルチリージョン障害復旧
EventBridge スケジュール → Step Functions → Parallel で複数リージョンへの健全性テスト・フェイルオーバー検証。
導入ロードマップ
Phase 1:基礎習得(1 週間)
- Step Functions 基本概念学習
- Workflow Studio でシンプルなワークフロー作成
- Lambda + DynamoDB 統合テスト
Phase 2:機能検証(2 週間)
- エラーハンドリング(Retry・Catch)実装
- 並列処理(Parallel・Map)の動作確認
- CloudWatch Logs・X-Ray ロギング設定
Phase 3:パイロット導入(1 ヶ月)
- 既存プロセス(注文フロー・承認フロー等)に Step Functions 適用
- Distributed Map での大規模処理パフォーマンステスト
- 本番環境へのデプロイ(CDK・Terraform)
Phase 4:運用・最適化(継続)
- CloudWatch・X-Ray でパフォーマンス監視
- コスト分析・最適化
- ワークフロー改善・拡張
実装チェックリスト
- [ ] Step Functions ワークフロー定義(ASL)完成
- [ ] IAM ロール・権限設定完了
- [ ] CloudWatch Logs ロギング設定
- [ ] X-Ray 分散トレース有効化
- [ ] エラーハンドリング(Retry・Catch)実装
- [ ] 本番環境テスト完了
- [ ] CDK / SAM / Terraform 構成管理
- [ ] ドキュメント・操作マニュアル作成
- [ ] チーム・オンコール体制構築
- [ ] パフォーマンス・コスト監視ダッシュボード作成
まとめ
AWS Step Functions は、サーバーレスワークフローの標準基盤。Amazon States Language(ASL)で宣言的に複雑なフロー定義でき、Lambda・ECS・DynamoDB・SageMaker・Bedrock など 200+ の AWS サービスを直接統合できます。
主な価値:
- ✅ エラーハンドリング・リトライ・並列処理を宣言的に管理
- ✅ 長期ワークフロー(最大 1 年)・人間承認フロー対応
- ✅ 完全な実行履歴・監査ログで可視化
- ✅ Distributed Map で大規模バッチ処理(100M+ アイテム)
- ✅ AWS ネイティブでインフラ管理不要
導入する際のポイント:
- Standard(1 年対応)vs Express(5 分・高スループット)の使い分け
- Workflow Studio でビジュアル定義・デバッグ
- SAGA パターンで分散トランザクション管理
- CloudWatch・X-Ray で完全可視化
- CDK・SAM で Infrastructure as Code 化
2025-2026 年は Bedrock 統合・Distributed Map 拡張・JSONata サポートなど、AI・大規模データ処理への機能強化が進みます。AWS エコシステム内の複雑なワークフローを構築する際の 必須ツール になります。
参考文献
AWS 公式
- AWS Step Functions Developer Guide
- Amazon States Language
- Step Functions Pricing
- AWS Step Functions Features
- Distributed Map Documentation
- Service Integrations
- Workflow Studio Guide
- Error Handling Documentation
- Step Functions with AWS CDK
- AWS SAM Step Functions
ブログ・ケーススタディ
- AWS Blogs - Step Functions カテゴリ
- AWS Re:Invent セッション動画
- AWS クラウドスキルビルダー
コミュニティ
- GitHub AWS Samples - serverless-patterns
- AWS Community Builders
- Slack AWS Community
ワークフロー設計標準・比較ツール
- Temporal.io - Durable Execution Platform
- Camunda - Process Automation Engine
- Argo Workflows - Kubernetes Workflow Engine
- Apache Airflow - Workflow Orchestration
- Zeebe - Workflow Engine for Microservices
イベント・メッセージング統合
- CNCF CloudEvents Specification
- AsyncAPI Specification
- AWS Compute Blog - Step Functions Articles
- Serverless Land - Step Functions Patterns
AI・機械学習パイプライン
ドキュメント最終更新:2026-04-26
対応バージョン:Step Functions 2026 / ASL 拡張機能対応 / Bedrock 統合
参考文献:20+件 / 比較対象:5+ OSS/サード製品