Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services AWS Api网关使用消息属性连接到SQS_Amazon Web Services_Aws Api Gateway_Amazon Sqs - Fatal编程技术网

Amazon web services AWS 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

通过遵循本教程,我连接了一个Api网关方法来推送到SQS队列上

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.

感谢您的快速响应,但我得到了您使用示例代码描述的属性为空的确切错误。转换后的端点请求正文:Action=sendmages&MessageBody=%7B%7D&MessageAttributes.member.1.Name=source\u ip&MessageAttributes.member.1.Value.DataType=String&MessageAttributes.member.1.Value.StringVvalue=测试调用源ip(注释字符限制只有一个值)从您发布的内容来看,不清楚为什么会出现错误,因为属性1显然不是空的……但您可以使用一些引号进行欺骗。这不是正确的引用,但会防止表单中未捕获的值为空。请将以下内容与上面的答案进行比较,注意添加了两个
,并查看是否可以使用此选项至少获得成功的响应--
&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原因:所需参数没有值”