AWS Api Gateway 使用消息属性连接到 SQS

Joh*_*ebb 3 amazon-sqs amazon-web-services aws-api-gateway

我已经按照本教程连接了一个 Api 网关方法来推送到 SQS 队列。

https://dzone.com/articles/creating-aws-service-proxy-for-amazon-sqs

这一切都很好,但我想使用一些路径参数向我的消息添加一些消息属性,但我无法让它工作。

这是教程中的当前映射模板。

Action=SendMessage&MessageBody=$util.urlEncode($util.escapeJavaScript($input.json('$')))
Run Code Online (Sandbox Code Playgroud)

我试图保留“application/x-www-form-urlencoded”格式,并通过将其更改为(现在使用静态值)将 MessageAttributes 添加到此

    Action=SendMessage&MessageBody=$util.urlEncode($util.escapeJavaScript($input.json('$')))
&MessageAttribute[0][Name]=foo&MessageAttribute[0][Type]=String&MessageAttribute[0][Value]=bar
Run Code Online (Sandbox Code Playgroud)

但我得到了这个错误

{
  "Error": {
    "Code": "MalformedQueryString",
    "Message": "Keys may not contain [",
    "Type": "Sender"
  },
  "RequestId": "ea121e6e-ca37-5d14-b92b-4a2c6fedf403"
}
Run Code Online (Sandbox Code Playgroud)

我应该如何在不使用“[”的情况下对 MessageAttribues 数组进行编码

小智 9

我试图使用映射模板从 AWS API 网关传递 SQS MessageAttributes。我最终跟踪了来自 aws cli 的等效请求,以使用 MessageAttributes 向 SQS 提交消息。它涉及设置本地 https 代理并查看 aws cli 生成的原始 http POST 请求。根据请求,我能够将工作映射模板放在一起:

Action=SendMessage&MessageBody=message+with+attribute&MessageAttribute.1.Name=somename&MessageAttribute.1.Value.DataType=String&MessageAttribute.1.Value.StringValue=somevalue
Run Code Online (Sandbox Code Playgroud)

这是我用于测试的原始 aws cli 命令:

aws sqs send-message --queue-url "queue/url"  --message-body "message with attribute" --message-attributes '{"somename" : { "DataType":"String", "StringValue":"somevalue"}}' --no-verify-ssl
Run Code Online (Sandbox Code Playgroud)

aws 文档还显示格式https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_SendMessage.html#API_SendMessage_Examples

样品请求

https://sqs.us-east-2.amazonaws.com/123456789012/MyQueue/
?Action=SendMessage
&MessageBody=This+is+a+test+message
&MessageAttribute.1.Name=my_attribute_name_1
&MessageAttribute.1.Value.StringValue=my_attribute_value_1
&MessageAttribute.1.Value.DataType=String
&MessageAttribute.2.Name=my_attribute_name_2
&MessageAttribute.2.Value.StringValue=my_attribute_value_2
&MessageAttribute.2.Value.DataType=String
&Expires=2020-05-05T22%3A52%3A43PST
&Version=2012-11-05
&AUTHPARAMS
Run Code Online (Sandbox Code Playgroud)

笔记:

  • 这是MessageAttribute而不是MessageAttributes
  • 传递您不需要的地图参数.member.


Mic*_*bot 5

SQS API参考不作这种完全清楚,事实上,似乎是什么服务真正希望看到有些不一致。在线路上,它使用.member.N.符号,并且N基于 1 而不是基于 0。还有,MessageAttributes是复数。

预期的格式如下所示:

&MessageAttributes.member.1.Name=source_ip##
&MessageAttributes.member.1.Value.DataType=String##
&MessageAttributes.member.1.Value.StringValue=$util.urlEncode($context.identity.sourceIp)##
&MessageAttributes.member.2.Name=user_agent##
&MessageAttributes.member.2.Value.DataType=String##
&MessageAttributes.member.2.Value.StringValue=$util.urlEncode($context.identity.userAgent)##
&MessageAttributes.member.3.Name=stage##
&MessageAttributes.member.3.Value.DataType=String##
&MessageAttributes.member.3.Value.StringValue=$util.urlEncode($context.stage)##
Run Code Online (Sandbox Code Playgroud)

##是可读性。在构建 Web 表单时,您不能在映射模板中使用换行符,因为它们最终会出现在表单本身中,并##告诉 VTL 从这里到行尾的所有内容都将被忽略,包括换行符在行尾。否则嵌入的换行符会使表单构造不正确。

另请注意,API 不允许这些值为空,因此如果有可能不存在任何属性,您将需要额外的逻辑来测试这一点并将属性替换为其他内容,因为索引号(iirc) 必须是连续的。

为什么我们使用主体映射模板为 API Gateway + SQS 构建 Web 表单,以及有关如何配置它的更多信息,在我对是否可以使用POST 身体?

  • 我收到与@JohnWebb 相同的错误。我删除了“成员”符号,它工作正常。&MessageAttributes.1.Name=source_ip## 而不是 &MessageAttributes.member.1.Name=source_ip## (2认同)