问题描述
我通过使用成功执行它的 boto3.client('stepfunctions') 中的 start_execution 调用执行来运行状态机。
现在我想获取执行输出,所以我正在使用 describe_execution。但问题是当它记录时,我无法获得输出,因为状态仍为 RUNNING。我怎样才能让这个 describe_execution 等到状态成功
SF_CLIENT = boto3.client('stepfunctions')
sf_output = SF_CLIENT.start_execution(
stateMachineArn=os.environ['STATE_MACHINE_ARN'],input=input)
sf_response = SF_CLIENT.describe_execution(
executionArn=sf_output['executionArn'])
status = sf_response['status']
while status != 'SUCCEEDED':
sf_response = SF_CLIENT.describe_execution(
executionArn=sf_output['executionArn'])
LOGGER.info("%s: %s" % ("EXECUTION STILL RUNNING",sf_response))
if status != 'SUCCEEDED':
continue
elif status == 'SUCCEEDED':
break
LOGGER.info("%s: %s" % ("STEP FUNCTION EXECUTION OUTPUT",sf_output))
LOGGER.info("%s: %s" % ("STEP FUNCTION EXECUTION RESPONSE",sf_response))
解决方法
正如您发现的那样,StartExecution 是异步的,不会等待执行完成。
以下是一些需要考虑的选项:
-
使用返回结果的 StartSyncExecution 并且本质上是同步操作:https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/stepfunctions.html#SFN.Client.start_sync_execution
-
将执行后您想执行的任何操作添加为执行结束的步骤。
-
通过发送 SQ、事件桥接、...事件作为状态机的最后一步来触发您的下一个操作。
-
通过检查 Describe execution 或 Cloud watch events 等待执行完成。但是这个解决方案应该是你最后的手段。有很多缺点没有。描述执行有速率限制和其他一些需要考虑的限制。