☁️
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ロール
・参考記事
ステートマシン構築用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