LoginSignup
10
1

Step Functionsの遅延監視をLambdaを使わずにやってみた

Posted at

AWS Step Functionsが時間以内に終わっているかを監視する方法としては、クラメソさんの以下の記事で紹介されていますが、

Step FunctionsでAPIが呼び出せるようになったのでLambdaを使用せずにStep Functionsで実装してみました

Step Functionsから実行できるAPI一覧

実行可能なAWS SDK APIは以下で確認できます

個人的には、WebUIのWorkflow Studio for AWS Step Functionsで探すほうが楽かなと思います

workflow-studio.png

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だけ済むようになりました
プログラムを書く必要もなくなってこれは楽ですね

10
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
1