我有一个用例,我有一个AWS Step功能,当文件上传到S3时触发,从那里第一步运行ffprobe从外部服务获取文件的持续时间,如transloadit,其中写入输出回到S3.
我可以从该事件创建一个新的step函数,但是如果可以在原始step函数中有一个Await promise然后继续到下一个函数,我就会徘徊 - 考虑到ffprobe可能需要更长的时间才能恢复.
任何建议都非常感谢如何解决这个问题.
现在,AWS Step Functions作为第一类,支持长时间运行的步骤的异步回调。
这类似于@mixja的答案,但经过简化。工作流程中的单个状态可以直接调用Lambda,SNS,SQS或ECS并等待对的调用SendTaskSuccess
。
有一个针对SQS记录的好示例,其中步进函数发送消息并暂停工作流程执行,直到提供回调为止。Lambda是等效的(假定像transloadit这样的主要处理过程发生在Lambda本身之外)
您的步进函数定义如下所示
"Invoke transloadit": { "Type": "Task", "Resource": "arn:aws:states:::lambda:invoke.waitForTaskToken", "Parameters": { "FunctionName": "InvokeTransloadit", "Payload": { "some_other_param": "...", "token.$": "$$.Task.Token" } }, "Next": "NEXT_STATE" }
然后在您的Lambda中,您将执行以下操作
def lambda_handler(event, context): token = event['token'] # invoke transloadit via SSM, ECS, passing token along
那么在您长期运行的主要流程中,您将使用令牌(如aws stepfunctions send-task-success --task-token $token
来自shell脚本/ CLI 的令牌)或与API调用类似的令牌发出回调。