☁️

AWS Step Functionsにてリタンコードに基づいたエラーハンドリング(正常・警告・異常)実装してみた

に公開

1.はじめに

Step FunctionsにてECS(Fargate)で実行したリタンコードに基づいたエラーハンドリングを実装してみました。
学習の備忘録として残します

2.機能検証内容

前提

ステートマシンにてECS(Fargate)を呼び出してタスクステート実行する
以下、リタンコード範囲指定に基づいて、フローを遷移させる

リタンコード(ExitCode)

0〜9 :正常終了
10〜99 :警告終了 ※実態は正常終了
100〜255:異常終了
ECS(Fargate)タスクの終了コード=リターンコード=ExitCode(Step Functionsの用語)

構築リソースについて

以下、リソースは事前に構築しておく
・VPC(SG含む)
・ECSタスク定義
使用したDockerイメージ:"alpine”
実行コマンドは設定無
→Step Functionsの"Overrides"定義にて指定するため
・IAMロール

・参考記事
https://dev.classmethod.jp/articles/step_functions_run_ecs_task_passrole_error/

ステートマシン構築用ymlテンプレート

AWSTemplateFormatVersion: '2010-09-09'
Resources:
  StateMachinee390c1b9:
    Type: AWS::StepFunctions::StateMachine
    Properties:
      Definition:
        StartAt: ECS RunTask
        States:
          ECS RunTask:
            Type: Task
            Resource: arn:aws:states:::ecs:runTask.sync
            Parameters:
              LaunchType: FARGATE
              Cluster: [クラスターのarn]
              NetworkConfiguration:
                AwsvpcConfiguration:
                  Subnets:
                    - [サブネットID]
                  SecurityGroups:
                    - [セキュリティグループID]
                  AssignPublicIp: ENABLED
              Overrides:
                ContainerOverrides:
                  - Name: [コンテナ名]
                    Command:
                      - sh
                      - '-c'
                      - echo Hello-world; exit 9 #特定のリターンコード指定
            Catch:
              - ErrorEquals:
                  - States.ALL
                Next: Choice
                ResultPath: $.error
                Assign:
                  parsed_cause.$: States.StringToJson($.Cause)
            End: true
          Choice:
            Type: Choice
            Choices:
              - Next: 正常終了
                And:
                  - Variable: $parsed_cause.Containers[0].ExitCode
                    NumericGreaterThanEquals: 0
                  - Variable: $parsed_cause.Containers[0].ExitCode
                    NumericLessThanEquals: 9
              - Next: 警告終了
                And:
                  - Variable: $parsed_cause.Containers[0].ExitCode
                    NumericGreaterThanEquals: 10
                  - Variable: $parsed_cause.Containers[0].ExitCode
                    NumericLessThanEquals: 99
              - Next: 異常終了
                And:
                  - Variable: $parsed_cause.Containers[0].ExitCode
                    NumericGreaterThanEquals: 100
                  - Variable: $parsed_cause.Containers[0].ExitCode
                    NumericLessThanEquals: 255
          正常終了:
            Type: Succeed
          警告終了:
            Type: Succeed
          異常終了:
            Type: Fail
      RoleArn: >-
        [IAMのarn]
      StateMachineName: [ステートマシン名]
      StateMachineType: STANDARD
      EncryptionConfiguration:
        Type: AWS_OWNED_KEY
      LoggingConfiguration:
        Level: 'OFF'
        IncludeExecutionData: false

機能説明

機能 説明
Catch タスクステート単位で設定可能
全てのエラー名をキャッチするルールを指定
エラー名=AWS側仕様のエラー名(カスタムエラー名設定可能)
Choice フローステートの一種
ExitCode範囲値を条件指定し、フローを分岐させることが可能
後続ステートにEndを指定することはできないため、必ず別途ステートへ遷移させる必要がある
Succeed フローステートの一種
ワークフロー実行を成功として終了させる
"Choice"の後続ステートとして使用
Fail フローステートの一種
ワークフロー実行を失敗として終了させる
"Choice"の後続ステートとして使用

構築したステートマシンワークフロー図

3.検証結果

①.正常終了 ExitCode=9

ECS(Fargate)終了コード:9

ステートマシンワークフロー図


②.警告終了 ExitCode=99

・ECS(Fargate)終了コード:99

ステートマシンワークフロー図


③.異常終了 ExitCode=255

・ECS(Fargate)終了コード:255

ステートマシンワークフロー図


終わりに

タスクステートのみのフローだと、ExitCode≠0以外は全て異常と判定されるが、別途フローステートを使用することで、ExitCode≠0以外も正常と見なすことができました。

Discussion