是否可以使用帖子正文发布到SQS网址

时间:2018-03-29 16:09:33

标签: amazon-web-services aws-lambda

https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_SendMessage.html

https://sqs.us-east-2.amazonaws.com/123456789012/MyQueue/
?Action=SendMessage
&MessageBody=This+is+a+test+message

这样可以正常工作,但是可以使用帖子体发送有效负载吗?

我有一个外部服务在帖子体中发送json有效负载(吞吐量非常高)。如果我可以直接向他们提供SQS网址,并且避免必须创建AWS api网关,那将是理想的 - > lambda - > SQS堆栈。

我愿意接受其他解决方案。

2 个答案:

答案 0 :(得分:9)

这可能不是完全 API Gateway的设计者所想到的,但考虑到AWS查询API(由SDK使用)在线上工作的方式 - 键/值以urlencoded形式对 - 以及API网关(VTL)中的内置正文映射模板语言公开Message ...这意味着您可以简单地构建API请求 - 表单帖子 - 手工,使用VTL模板,封装原始邮件正文 - urlencoded,以及我们所需要的一切。只要它是有效的字符数据,我们实际上并不关心它的JSON。

使用此解决方案,可以避免使用Lambda函数,并且客户端无需了解SQS如何格式化消息。

整个传入请求正文成为SQS中的/

在API网关控制台中:

创建资源(例如POST)和方法(例如Integration type: AWS Service AWS Region: [select your region] AWS Service: Simple Queue Service (SQS) AWS Subdomain [leave blank] HTTP Method: POST Action Type: Use path override Path override: / Execution Role: [your role ARN, needs to be able to send a message to the queue] Credentials cache: Do not add caller credentials to cache key Content Handling: Passthrough )。

在集成请求设置中:

HTTP Headers

Content-Type下,添加一个标头'application/x-www-form-urlencoded'。该值应指定为"映射自" Body Mapping Templates - 请注意,这是一个单引号字符串。

Never下,选择Content-Type

添加application/json Action=SendMessage## &QueueUrl=$util.urlEncode('https://sqs.us-east-2.amazonaws.com/000000000000/my-queue-name')## &MessageBody=$util.urlEncode($input.body)## 并使用以下映射模板:

SendMessage

您有一个API可以将原始JSON输入主体转换为SQS ## API请求。

每行末尾的##是为了便于阅读 - VTL是一种文本模板语言,因此保留了空格和换行符。将$ curl -X POST https://xxxxxxxxxx.execute-api.us-east-2.amazonaws.com/v1 --data '{"works": true}' -H 'Content-Type: application/json' 放在每行的末尾会导致换行被删除,这对于构建正确的Web表单是必需的。否则,整个身体映射模板将需要在一行上。

部署然后测试:

{"SendMessageResponse":{"ResponseMetadata":{"RequestId":"bbbbbbbb-aaaa-5555-8888-334ed25bb6b3"},"SendMessageResult":{"MD5OfMessageAttributes":null,"MD5OfMessageBody":"81f2ecc3cb027268138bdfe7af0f8a3f","MessageId":"cccccccc-dddd-4444-1111-542e08bb39af","SequenceNumber":null}}}

响应:

{{1}}

为了获得额外的功劳,还可以重用Integration Response中的正文映射模板来自定义响应。

答案 1 :(得分:0)