【发布时间】:2016-03-16 18:31:14
【问题描述】:
我正在构建一个由 Lambda 函数提供服务的 API,但我需要这些是异步的,因此我使用“AWS 服务代理”来发布,而不是将 API-Gateway 直接连接到 Lambda 函数 SNS 消息,然后让 Lambda 函数订阅相关的 SNS 主题,以便接收请求的传递。这是一张说明流程的图片:
我已经单独测试了 Lambda 函数以及 SNS 和 Lambda 之间的发布/订阅消息,但我在 API-Gateway 到 SNS 切换方面遇到了困难。文档很简单,但我现在假设必须在 POST 请求中发送以下属性:
Action:API-Gateway 提供在 UI 中设置此功能,我已放入 Publish 操作,这是适当的 SNS 操作
消息:POST 消息的正文应该是 JSON 文档。它将由 Web 客户端传递并通过网关代理到 SNS。
TopicArn:表示我们要发布到的 SNS 主题。在我的设计中,这将是一个静态值/端点,所以我希望网络客户端也不必传递它,但如果这样做更容易,那也可以。
我尝试了很多东西,但只是卡住了。很想在某个地方找到一个好的代码示例,但我们将不胜感激。
想在我当前的尝试中添加更多上下文:
我已尝试发布我的 API 并使用 Postman 来尝试获得有效响应。这是邮递员屏幕(一个用于标头变量,一个用于 JSON 正文):
这会导致以下错误消息:
{
"Error": {
"Code": "InvalidParameter",
"Message": "Invalid parameter: TopicArn or TargetArn Reason: no value for required parameter",
"Type": "Sender"
},
"RequestId": "b33b7700-e8a3-58f7-8ebe-39e4e62b02d0"
}
错误似乎表明 TopicArn 参数未发送到 SNS,但我已在 API-Gateway 中包含以下内容:
【问题讨论】:
-
你曾经解决过这个问题吗?我在完全相同的架构下遇到了类似的问题。在我发布一个单独的问题详细说明我的问题之前,我想我会看看你是否能够让它工作。
-
哦哦。我已经发布了一个答案,但它没有通过。我明天会努力解决这个问题。
-
您是否设法使用 POST 请求使其运行?我设法做到这一点的唯一方法是将 TopicArn 和 Message 设置为查询字符串参数(如下面提出的答案),因为即使我设置了 POST 方法,请求正文也总是被忽略。我需要请求正文中的内容,但似乎无法将其复制为查询字符串参数。
-
是的,目前看来您可以不使用请求正文。这将在某个时候得到解决,但没有日期。
标签: amazon-web-services amazon-sns aws-api-gateway