Step Functions の監視を考える

記事タイトルとURLをコピーする

こんにちは😸 カスタマーサクセス部の山本です。

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トピックを通じて通知する設定例です。

  1. EventBridgeルールの作成: EventBridgeのコンソールから新しいルールを作成します。

  2. イベントパターンの定義: ルールの「イベントパターン」を以下のように定義します。これにより、特定のステートマシンでエラー関連のステータス変更があったイベントのみをフィルタリングします。

    {
      "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はご自身の環境に合わせて変更してください。

  3. ターゲットの設定: ターゲットとして「SNSトピック」を選択し、通知したいトピックを指定します。ターゲットには他にもLambda関数やChatbotなどを指定でき、エラーに応じた多様な自動処理が可能です。

  4. (オプション)入力トランスフォーマーで通知内容を整形: ターゲット設定内で「入力トランスフォーマー」を設定すると、通知メッセージをより分かりやすく整形できます。

    • 入力パス: イベント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 LogsCloudWatch Metrics、そしてAmazon EventBridgeの3つの主要なアプローチを解説しました。

それぞれの方法には特徴があり、目的に応じて使い分ける、あるいは組み合わせることが重要です。

  • CloudWatch Logs: ワークフローの実行履歴をイベント単位で詳細に追跡し、問題発生時のデバッグに不可欠です。ログレベルを適切に設定(例: ERROR)することで、コストと情報量のバランスを取ることがポイントです。

  • CloudWatch Metrics: 実行数、失敗数、実行時間などの定量的なデータを監視し、パフォーマンスの傾向を把握するのに適しています。CloudWatchアラームと組み合わせることで、「1時間あたりの失敗率が10%を超えたら通知する」といった閾値ベースの監視が可能です。

  • Amazon EventBridge: 「実行が1回でも失敗した」といった個別のイベントをリアルタイムに検知し、即座にSNS通知やLambda実行などのアクションに繋げたい場合に非常に強力です。クリティカルなワークフローのエラーを即時検知するのに最適です。

これらの監視機能を組み合わせることで、Step Functionsで構築したワークフローの信頼性と可観測性を高めることができます。システムの要件に合わせて、最適な監視戦略を設計しましょう。

余談

今日の山は谷川連峰の仙ノ倉山です。平標山方面から。紅葉の時期に。

山本 哲也 (記事一覧)

カスタマーサクセス部のインフラエンジニア。

山を走るのが趣味です。