AWS Step Functionsが時間以内に終わっているかを監視する方法としては、クラメソさんの以下の記事で紹介されていますが、
Step FunctionsでAPIが呼び出せるようになったのでLambdaを使用せずにStep Functionsで実装してみました
Step Functionsから実行できるAPI一覧
実行可能なAWS SDK APIは以下で確認できます
個人的には、WebUIのWorkflow Studio for AWS Step Functionsで探すほうが楽かなと思います
IAMロールの準備
まず、Step FunctionsのIAMロールに ListExections を実行できるように以下のポリシーを追加します
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"states:ListExecutions"
],
"Effect": "Allow",
"Resource": "arn:aws:states:ap-northeast-1:XXXXXXXXXXXX:stateMachine:*"
}
]
}
ステートマシンの作成
対象のステートマシン名はEventBridgeからInputで渡されることを想定してます
最新のExecutionを取得
sfn:listExecutions
で最新の1件だけ取得します
{
"Comment": "ジョブの遅延監視",
"StartAt": "GetLastExection",
"States": {
"GetLastExection": {
"Type": "Task",
"Resource": "arn:aws:states:::aws-sdk:sfn:listExecutions",
"Parameters": {
"StateMachineArn.$": "States.Format('arn:aws:states:ap-northeast-1:XXXXXXXXXXXX:stateMachine:{}', $.stateMachine)",
"MaxResults": 1
},
"ResultPath": "$.result",
"Next": "CheckStatus",
"Retry": [
{
"ErrorEquals": ["States.ALL"],
"IntervalSeconds": 10,
"MaxAttempts": 5,
"BackoffRate": 2
}
]
},
Statusをチェック
Responseの構造は以下で確認します
Executionsはlistで返されるのでStatusは Executions[0].Status
となります
これが SUCCEEDED
ではない場合は完了していないってことなのでエラー通知に移ります
"CheckStatus": {
"Type": "Choice",
"Choices": [
{
"Variable": "$.result.Executions[0].Status",
"StringEquals": "SUCCEEDED",
"Next": "Succeed"
}
],
"Default": "NotSucceeded"
},
エラー通知
通知用にError、Causeのメッセージを生成します
"NotSucceeded": {
"Type": "Pass",
"Parameters": {
"errorString": "Not Succeeded",
"causeString.$": "States.Format('{} is {}.', $.stateMachine, $.result.Executions[0].Status)"
},
"Next": "Failed"
},
"Failed": {
"Type": "Fail",
"ErrorPath": "$.errorString",
"CausePath": "$.causeString"
},
"Succeed": {
"Type": "Succeed"
}
}
}
EventBridgeに登録
EventBridgeに監視対象となるStep Functionsが終了していてほしい時刻に実行されるように登録します
また、このStep FunctionsのFAILEDをEventBridgeのRuleとして登録し、TargetにSNSを設定して通知されるようにします
{
"detail": {
"stateMachineArn": ["arn:aws:states:ap-northeast-1:XXXXXXXXXXXX:stateMachine:sfn_delay_monitor"],
"status": ["FAILED"]
},
"detail-type": ["Step Functions Execution Status Change"],
"source": ["aws.states"]
}
Step FunctionsからSDK APIが実行されるようになって、今までLambdaを介していたものがStep Functionsだけ済むようになりました
プログラムを書く必要もなくなってこれは楽ですね