概要
AWSのStepfunctionで、人による承認作業や何らかの処理を待ちたい要件があった場合、「コールバック」というのを利用できる。コールバック設定をするとタスクトークンがAWSの何らかのサービスに出力され、待ちたい処理が終わったらそのトークンを取り出し、Stepfunctionに投げ返すと処理が再開するといった仕組みである。
AWSの公式ドキュメントではSQSを利用した例があったが、他にはLambda/SNS/DynamoDB/S3/Stepfunctionといったものにもタスクトークンを出力させられることが可能であった。(おそらく他にもあると思われる。)
Stepfunction ステートマシンのフロー図
DynamoDB PutItemでコールバック設定をしており、ここでフローを停止することができる。
タスクトークンをsend-task-successで返すとCodebuild StartBuildに進み、
SendTaskFailureで返すとSNS Publishに進むフロー図。
コールバック設定の方法
-
タスクトークン出力できるAWSサービスを選ぶ。(以下は例)
SQS:SendMessage
Lambda:Invoke
SNS:Publish
DynamoDB:PutItem
S3:Putobject
-
Wait for callbackオプションにチェックを入れる。
※DynamoDBのときはIntegration typeをAWS SDKにするとWait for callbackを選択できるようになります。
3. エラーハンドリングのフローを追加する。(設定しなくても大丈夫)
※上記はエラーのすべての場合はSNS Publishに進むように設定している例です。
タスクトークンの出力例
ステートマシンを保存して実行すると、
サービスにより出力形式が異なるがおおよそ以下のJSON形式で出力されます。
S3だとファイルに出力、SQSはキューの中に、DynamoDBはテーブル内に出力されます。
{
"MessageTitle": "Task started by Step Functions. Waiting for callback with task token.",
"TaskToken": "AQCEAAAAKgAAAAMAAAAAAAAAAeRy・・・・・・・・・・・・・・・Khis5Rsx0ONGo2"
}
タスクトークンの返却方法
AWS CLIで返す場合の例は以下です。
aws stepfunctions send-task-success --task-token AQCEAAAAKgAAAAMAAAAAAAAAAeRy・・・ --task-output {} --region ap-northeast-1
TaskTokenの文字列"AQCEAAAAKgAAAAMAAAAAAAAAAeRy・・・"を抜き出して「send-task-success」を実行するとStepfunctionにトークンが返されフローが再開する。
処理を失敗とさせたい場合は「SendTaskFailure」を呼び出す形になると思う。
DynamoDBへのタスクトークン出力設定方法
手探りでやった結果、API Parametersに以下json投入する形になります。
{
"TableName": "XXXXTableXXXX",
"Item": {
"XXXXtasktokenXXXX": {
"S": {
"MyTaskToken.$": "$$.Task.Token"
}
}
}
}
変更箇所
・XXXXTableXXXXは自身で作成されたDynamoDBのテーブル名に置き換えてください。
・XXXXtasktokenXXXX(Item直下の4行目のところ)は作成したテーブルのカラム名に置き換えてください。