こんにちは😸 カスタマーサクセス部の山本です。
Step Functions の監視について考えてみました。
ログ監視について
AWS Step Functionsの各ログレベルで記録されるイベントまとめ
ALL
ALLレベルでは、以下を含む全てのイベントタイプが記録されます。ステートマシン全体の詳細な追跡とデバッグが可能です。
| イベントタイプ | 説明 |
|---|---|
| (すべてのイベント) | ワークフローの開始から終了、各ステートの遷移、成功、失敗、タイムアウトなど、実行中に発生する全てのイベントが記録されます。 |
全イベントの詳細な説明については、AWS Step Functions デベロッパーガイドの「イベント履歴」をご参照ください。
ERROR
ERRORレベルでは、実行の失敗、中止、タイムアウトにつながるエラー関連のイベントが記録されます。問題のトラブルシューティングに役立ちます。
| イベントタイプ | 説明 |
|---|---|
ExecutionAborted |
実行が中止されました。 |
ExecutionFailed |
実行が失敗しました。 |
ExecutionTimedOut |
実行がタイムアウトしました。 |
FailStateEntered |
Failステートに遷移しました。 |
LambdaFunctionFailed |
Lambda関数の実行が失敗しました。 |
LambdaFunctionScheduleFailed |
Lambda関数のスケジュールに失敗しました。 |
LambdaFunctionStartFailed |
Lambda関数の開始に失敗しました。 |
LambdaFunctionTimedOut |
Lambda関数の実行がタイムアウトしました。 |
MapIterationAborted |
Mapステートの反復処理が中止されました。 |
MapIterationFailed |
Mapステートの反復処理が失敗しました。 |
MapRunAborted |
Map Runが中止されました。(分散モード) |
MapRunFailed |
Map Runが失敗しました。(分散モード) |
MapStateAborted |
Mapステートが中止されました。 |
MapStateFailed |
Mapステートが失敗しました。 |
ParallelStateAborted |
Parallelステートが中止されました。 |
ParallelStateFailed |
Parallelステートが失敗しました。 |
TaskFailed |
Taskステートが失敗しました。 |
TaskStartFailed |
Taskの開始に失敗しました。 |
TaskStateAborted |
Taskステートが中止されました。 |
TaskSubmitFailed |
Taskの送信に失敗しました。 |
TaskTimedOut |
Taskがタイムアウトしました。 |
WaitStateAborted |
Waitステートが中止されました。 |
FATAL
FATALレベルでは、実行全体が致命的なエラーで終了したことを示すイベントのみが記録されます。最も重要なエラー監視に絞り込む場合に使用します。
| イベントタイプ | 説明 |
|---|---|
ExecutionAborted |
実行が中止されました。 |
ExecutionFailed |
実行が失敗しました。 |
ExecutionTimedOut |
実行がタイムアウトしました。 |
OFF
OFFレベルでは、どのイベントもログに記録されません。
| イベントタイプ | 説明 |
|---|---|
| (なし) | ログに記録されるイベントはありません。 |
実際にログ出力してみる
必要な IAM ポリシー
Step Functions が使用する IAM ロールのポリシーに以下の権限を付与しました。
arn:aws:logs:your-region:your-account-id:log-group:your-log-group-name:* 部分は置き換えてください。
以下を参考にさらに最小権限にしました。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "logs:CreateLogStream", "logs:PutLogEvents", "logs:DescribeLogGroups" ], "Resource": [ "arn:aws:logs:your-region:your-account-id:log-group:your-log-group-name:*" ] }, { "Effect": "Allow", "Action": [ "logs:CreateLogDelivery", "logs:GetLogDelivery", "logs:UpdateLogDelivery", "logs:DeleteLogDelivery", "logs:ListLogDeliveries", "logs:PutResourcePolicy", "logs:DescribeResourcePolicies", "logs:DescribeLogGroups" ], "Resource": "*" } ] }
設定

確認

- ALL
- ERROR
- FATAL
例:
{ "details": { "cause": "The filter 'instance-state-namep' is invalid (Service: Ec2, Status Code: 400, Request ID: 1111111-1111-1111-1111-11111111) (SDK Attempt Count: 1)", "error": "Ec2.Ec2Exception" }, "redrive_count": "0", "id": "6", "type": "ExecutionFailed", "previous_event_id": "5", "event_timestamp": "1755768243865", "execution_arn": "arn:aws:states:ap-northeast-1:111111111111:execution:mylearning-jsonata02:1111-1111-1111-1111-1111111111111111" }
メトリクスによる監視
AWS Step Functionsでは、ワークフローのパフォーマンスや実行状況を把握するために、Amazon CloudWatchへ様々なメトリクスを自動的に送信します。これらのメトリクスを利用することで、ステートマシンの動作を監視し、問題が発生した際にアラートを設定することが可能です。
監視できるメトリクスは、主に
- ステートマシン(実行)
- アクティビティ
- Lambda関数
- サービス統合
のカテゴリに分類されます。
ステートマシンのメトリクス
ステートマシン全体の実行に関する統計情報です。ワークフローが正常に動作しているか、パフォーマンスに問題がないかを大局的に把握するのに役立ちます。
| メトリクス名 | 説明 | 単位 |
|---|---|---|
ExecutionsStarted |
開始された実行の数。 | カウント |
ExecutionsSucceeded |
正常に完了した実行の数。 | カウント |
ExecutionsFailed |
失敗した実行の数。 | カウント |
ExecutionsAborted |
中止された実行の数。 | カウント |
ExecutionsTimedOut |
タイムアウトした実行の数。 | カウント |
ExecutionTime |
実行が開始されてから終了するまでの時間。 | ミリ秒 |
ExecutionThrottled |
スロットリング(レート制限)されたStateEnteredイベントと再試行の数。APIの呼び出し頻度が高すぎる場合に増加します。 |
カウント |
アクティビティのメトリクス
アクティビティワーカーによって実行されるタスクに関するメトリクスです。(現在では、サービス統合の利用が主流です)
| メトリクス名 | 説明 | 単位 |
|---|---|---|
ActivitiesStarted |
開始されたアクティビティタスクの数。 | カウント |
ActivitiesSucceeded |
正常に完了したアクティビティタスクの数。 | カウント |
ActivitiesFailed |
失敗したアクティビティタスクの数。 | カウント |
ActivitiesTimedOut |
タイムアウトしたアクティビティタスクの数。 | カウント |
ActivityRunTime |
アクティビティが実行を開始してから完了するまでの時間。 | ミリ秒 |
ActivityScheduleTime |
アクティビティがスケジュールされてから開始されるまでの時間。 | ミリ秒 |
ActivitiesHeartbeatTimedOut |
ハートビートがタイムアウトしたアクティビティの数。 | カウント |
Lambda関数のメトリクス
ステートマシンから呼び出されるLambda関数に特化したメトリクスです。
| メトリクス名 | 説明 | 単位 |
|---|---|---|
LambdaFunctionsStarted |
開始されたLambda関数の実行数。 | カウント |
LambdaFunctionsSucceeded |
正常に完了したLambda関数の実行数。 | カウント |
LambdaFunctionsFailed |
失敗したLambda関数の実行数。 | カウント |
LambdaFunctionsTimedOut |
タイムアウトしたLambda関数の実行数。 | カウント |
LambdaFunctionRunTime |
Lambda関数が実行を開始してから完了するまでの時間。 | ミリ秒 |
LambdaFunctionScheduleTime |
Lambda関数がスケジュールされてから開始されるまでの時間。 | ミリ秒 |
サービス統合のメトリクス
Step Functionsが他のAWSサービス(例: Amazon SNS, Amazon SQS, AWS Batchなど)と連携する際のパフォーマンスを示すメトリクスです。
| メトリクス名 | 説明 | 単位 |
|---|---|---|
ServiceIntegrationsStarted |
開始されたサービス統合タスクの数。 | カウント |
ServiceIntegrationsSucceeded |
正常に完了したサービス統合タスクの数。 | カウント |
ServiceIntegrationsFailed |
失敗したサービス統合タスクの数。 | カウント |
ServiceIntegrationsTimedOut |
タイムアウトしたサービス統合タスクの数。 | カウント |
ServiceIntegrationRunTime |
サービス統合タスクが開始してから完了するまでの時間。 | ミリ秒 |
ServiceIntegrationScheduleTime |
サービス統合タスクがスケジュールされてから開始されるまでの時間。 | ミリ秒 |
これらのメトリクスをCloudWatchで監視することで、例えば「実行失敗数(ExecutionsFailed)が1分間に5回を超えたらアラートを送信する」といった設定や、「平均実行時間(ExecutionTime)が一定のしきい値を超えたら通知する」といったパフォーマンス監視が可能になります。
メトリクスを確認してみる
ExecutionsStarted

ExecutionsFailed

アラームも作成可能です。

ServiceIntegrationsStarted

EventBridgeによる監視通知
ログやメトリクスによる監視に加えて、Amazon EventBridge を利用することで、Step Functionsの実行状態の変化をリアルタイムに捉え、柔軟な通知や連携処理を実装できます。個別の実行エラーに対して即座にアクションを起こしたい場合に特に有効です。
Step Functionsが発行するイベント
Step Functionsは、ステートマシンの実行ステータスが変わるたびに、「Step Functions Execution Status Change」というイベントをEventBridgeに発行します。このイベントには、実行ARN、ステートマシンARN、ステータスなどの詳細情報が含まれます。
監視できる主な実行ステータスは以下の通りです。
ステータス (status) |
説明 |
|---|---|
RUNNING |
実行が開始されました。 |
SUCCEEDED |
実行が正常に完了しました。 |
FAILED |
実行が失敗しました。 |
TIMED_OUT |
実行がタイムアウトしました。 |
ABORTED |
実行が中止されました。 |
設定例:実行失敗時にSNSで通知する
特定のステートマシンの実行が失敗、タイムアウト、または中止された場合に、Amazon SNSトピックを通じて通知する設定例です。
EventBridgeルールの作成: EventBridgeのコンソールから新しいルールを作成します。
イベントパターンの定義: ルールの「イベントパターン」を以下のように定義します。これにより、特定のステートマシンでエラー関連のステータス変更があったイベントのみをフィルタリングします。
{ "source": ["aws.states"], "detail-type": ["Step Functions Execution Status Change"], "detail": { "stateMachineArn": [ "arn:aws:states:ap-northeast-1:123456789012:stateMachine:your-state-machine-name" ], "status": [ "FAILED", "TIMED_OUT", "ABORTED" ] } }stateMachineArnはご自身の環境に合わせて変更してください。ターゲットの設定: ターゲットとして「SNSトピック」を選択し、通知したいトピックを指定します。ターゲットには他にもLambda関数やChatbotなどを指定でき、エラーに応じた多様な自動処理が可能です。
(オプション)入力トランスフォーマーで通知内容を整形: ターゲット設定内で「入力トランスフォーマー」を設定すると、通知メッセージをより分かりやすく整形できます。
入力パス: イベントJSONから必要な値を抽出するための変数を定義します。
{ "stateMachineName": "$.detail.stateMachineArn", "status": "$.detail.status", "time": "$.time" }入力テンプレート: 上で定義した変数を使って、通知メッセージのテンプレートを作成します。
"Step Functionsでエラーを検知しました。\n発生日時:<time>\nステートマシン名(ARN):<stateMachineName>\nエラー内容:<status>"
この設定により、SNSやChatbotに送信される通知が、以下のように整形されたメッセージになります。
Step Functionsでエラーを検知しました。 発生日時:2023-10-27T10:30:00Z ステートマシン名(ARN):arn:aws:states:ap-northeast-1:123456789012:stateMachine:your-state-machine-name エラー内容:FAILED
実際にやってみた
通知が来ました。

CloudWatch Alarmsとの使い分け
メトリクスを監視するCloudWatch AlarmsとEventBridgeは、目的によって使い分けるのが効果的です。
- CloudWatch Alarms: 閾値ベースの統計的な監視に適しています。(例:「1時間の失敗率が10%を超えたらアラート」)
- EventBridge: 個別のイベントに対するリアルタイムな対応に適しています。(例:「重要なワークフローが1回でも失敗したら即時通知」)
まとめ
本記事では、AWS Step Functionsの監視方法として、CloudWatch Logs、CloudWatch Metrics、そしてAmazon EventBridgeの3つの主要なアプローチを解説しました。
それぞれの方法には特徴があり、目的に応じて使い分ける、あるいは組み合わせることが重要です。
CloudWatch Logs: ワークフローの実行履歴をイベント単位で詳細に追跡し、問題発生時のデバッグに不可欠です。ログレベルを適切に設定(例:
ERROR)することで、コストと情報量のバランスを取ることがポイントです。CloudWatch Metrics: 実行数、失敗数、実行時間などの定量的なデータを監視し、パフォーマンスの傾向を把握するのに適しています。CloudWatchアラームと組み合わせることで、「1時間あたりの失敗率が10%を超えたら通知する」といった閾値ベースの監視が可能です。
Amazon EventBridge: 「実行が1回でも失敗した」といった個別のイベントをリアルタイムに検知し、即座にSNS通知やLambda実行などのアクションに繋げたい場合に非常に強力です。クリティカルなワークフローのエラーを即時検知するのに最適です。
これらの監視機能を組み合わせることで、Step Functionsで構築したワークフローの信頼性と可観測性を高めることができます。システムの要件に合わせて、最適な監視戦略を設計しましょう。
余談
今日の山は谷川連峰の仙ノ倉山です。平標山方面から。紅葉の時期に。



