问题描述
我有一个步骤函数,可以发布到 SNS 主题,然后发送电子邮件通知。电子邮件通知按预期发送,但是当任务应该退出并终止 step 函数时,它会卡在“运行”状态。有谁知道我哪里出错了或可能导致这种情况的原因是什么?
"ErrorNotification": {
"Type": "Task","Resource":"arn:aws:states:::sns:publish.waitForTaskToken","OutputPath": "$","Parameters": {
"TopicArn": "<topic-arn>","Message":{
"Input.$":"$","TaskToken.$":"$$.Task.Token"
}
},"End": true
},
解决方法
这一行
"Resource":"arn:aws:states:::sns:publish.waitForTaskToken",
实现一个 Wait for a Callback with the Task Token
Call Amazon SNS with Step Functions
以下包含一个任务状态,该状态发布到 Amazon SNS 主题,然后等待返回任务令牌。请参阅使用任务令牌等待回调。
{
"StartAt":"Send message to SNS","States":{
"Send message to SNS":{
"Type":"Task","Resource":"arn:aws:states:::sns:publish.waitForTaskToken","Parameters":{
"TopicArn":"arn:aws:sns:us-east-1:123456789012:myTopic","Message":{
"Input.$":"$","TaskToken.$":"$$.Task.Token"
}
},"End":true
}
}
}
在这种情况下,您需要检查是否正在从处理回调并将最终响应发回的(通常是 lambda)发送适当的事件。
例如,我通过 lambda 处理我的回调功能,大致类似于下面的 successful
或 failed
。
...
LOG.info(f"Sending task heartbeat for task ID {body['taskToken']}")
STEP_FUNCTIONS_CLIENT.send_task_heartbeat(taskToken=body["taskToken"])
is_task_success = random.choice([True,False])
if is_task_success:
LOG.info(f"Sending task success for task ID {body['taskToken']}")
STEP_FUNCTIONS_CLIENT.send_task_success(
taskToken=body["taskToken"],output=json.dumps({"id": body['id']})
)
else:
LOG.info(f"Sending task failure for task ID {body['taskToken']}")
STEP_FUNCTIONS_CLIENT.send_task_failure(
taskToken=body["taskToken"],cause="Random choice returned False."
)
..