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堆栈。
我愿意接受其他解决方案。
答案 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)