Amazon web services AWS Api网关使用消息属性连接到SQS
通过遵循本教程,我连接了一个Api网关方法来推送到SQS队列上Amazon web services AWS Api网关使用消息属性连接到SQS,amazon-web-services,aws-api-gateway,amazon-sqs,Amazon Web Services,Aws Api Gateway,Amazon Sqs,通过遵循本教程,我连接了一个Api网关方法来推送到SQS队列上 Action=SendMessage&MessageBody=$util.urlEncode($util.escapeJavaScript($input.json('$'))) 这一切都很好,但我想添加一些消息属性到我的消息使用一些路径参数,但我不能让它工作 这是教程中的当前映射模板 Action=SendMessage&MessageBody=$util.urlEncode($util.escapeJavaSc
Action=SendMessage&MessageBody=$util.urlEncode($util.escapeJavaScript($input.json('$')))
这一切都很好,但我想添加一些消息属性到我的消息使用一些路径参数,但我不能让它工作
这是教程中的当前映射模板
Action=SendMessage&MessageBody=$util.urlEncode($util.escapeJavaScript($input.json('$')))
我试图保持“application/x-www-form-urlencoded”格式,并通过将其更改为(现在使用静态值)来将MessageAttributes添加到此格式中
但是我得到了这个错误
{
"Error": {
"Code": "MalformedQueryString",
"Message": "Keys may not contain [",
"Type": "Sender"
},
"RequestId": "ea121e6e-ca37-5d14-b92b-4a2c6fedf403"
}
如果不使用'['没有完全清楚地说明这一点,事实上,这似乎与该服务真正期望看到的情况有点不一致。在连线上,它使用.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)##
##
是为了可读性。在构建web表单时,映射模板中不能有换行符,因为它们最终会出现在表单本身中,##
告诉VTL从这里到行尾的所有内容都将被忽略,包括行尾的换行符。嵌入的换行符将被忽略se使表单结构不正确
还请注意,API不允许这些值为空,因此如果有可能任何属性都不存在,则需要额外的逻辑来测试该属性并用其他属性替换该属性,因为索引号(iirc)必须是连续的
为什么我们要使用body映射模板为API Gateway+SQS构建web表单,以及如何配置它的更多信息,在我对的回答中也有更详细的解释。在我的案例中,我必须使用API Gateway-->SNS并使用MessageAttributes进行过滤。这是一个类似的过程。 在本文和其他文章中介绍了Michael-sqlbot解决方案之后 我正在分享我的映射模板和为我工作的PostBody负载 映射模板:
Action=Publish##
&TopicArn=$util.urlEncode('arn:aws:sns:us-west-2:111111:TOPIC_NAME')##
&Message=$util.urlEncode($input.json('$.Message'))##
&Subject=$util.urlEncode($input.json('$.Subject'))##
&MessageAttributes.member.1.Name=hostName##
&MessageAttributes.member.1.Value.DataType=String##
&MessageAttributes.member.1.Value.StringValue=$util.escapeJavaScript($input.json('$.HostNameValue'))##
注意
&MessageAttributes.member.1.Name=hostName##
是硬编码的,因为它是一个键,如果您从POST有效负载映射它,您将得到一条错误消息属性名称无效(它使用“”)
这个
&MessageAttributes.member.1.Value.StringValue=$util.escapeJavaScript($input.json('$.HostNameValue'))##
也将发送HostNameValue。由于我们使用urlEncode,当它点击SNS时会是这样,因此您的过滤器将无法工作
"MessageAttributes": {
"hostName": {
"Type": "String",
"Value": "\"your.host.name\""
}
柱体有效载荷:
{
"Subject": "YOLO",
"Message": "Bla",
"HostNameValue": "your.host.name"
}
我试图使用映射模板从AWSAPI网关传递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
这是我用于测试的原始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
aws文档也显示了格式
样本请求
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
注:
- 它是MessageAttribute而不是MessageAttributes
- 要传递映射参数,不需要
.member.
“
,并查看是否可以使用此选项至少获得成功的响应--&MessageAttributes.member.1.Value.StringValue=“$util.urlEncode($context.identity.sourceIp)”##
是的,它显然不是空的,但我得到了相同的错误。即使使用硬编码的值Action=SendMessage&MessageBody=%7B%7D&MessageAttributes.member.1.Name=source\u ip&MessageAttributes.member.1.value.DataType=String&MessageAttributes.member.1.value.StringValue=“foo”{“error”:{“code”:“InvalidParameterValue”,“Message”:”:“请求必须包含非空的消息属性名称。”,“类型”:“发件人”},“请求ID”:“ded496eb-afc7-5c56-89af-c2a860080ea5”}我收到与@JohnWebb相同的错误。我删除了“成员”“符号和它工作得很好。&MessageAttributes.1.Name=source_ip#####而不是&MessageAttributes.member.1.Name=source#ip#Hi Dionis,我正在使用下面的模板``Action=Publish&TopicArn=$util.urlEncode(“arn:aws:sns:eu-west-2:03620108529:booking-topic-imod-4225”)&&Message=$util.urlEncode($input.json('$)”“``但我得到的错误参数无效:TopicArn或targetran原因:所需参数没有值”