调用 SNS 主题后,状态机任务卡在“正在运行”状态

问题描述

我有一个步骤函数,可以发布到 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 处理我的回调功能,大致类似于下面的 successfulfailed


...
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."
    )
..