【问题标题】:API gateway to SNS connection issue using message attributes使用消息属性的 API 网关到 SNS 连接问题
【发布时间】:2022-10-15 00:33:22
【问题描述】:
大家好,
我发现使用节点 js 代码通过 API 网关 POST 到 SNS 使用在 SQS 和 SNS 中设置为 service_type 的过滤策略(消息属性)发布消息有困难
所以应该根据我拥有的过滤器将消息发送到特定队列,我当前的设置如下
映射模板
Action=Publish##
&TopicArn=$util.urlEncode('arn:....fifo')##
&Message=$util.urlEncode($input.json('$.Message'))##
&Subject=$util.urlEncode($input.json('$.Subject'))##
&MessageAttributes.member.1.Name=service_type##
&MessageAttributes.member.1.Value.DataType=String##
&MessageAttributes.member.1.Value.StringValue=$util.escapeJavaScript($input.json('$.ServiceTypeValue'))##
URL 查询字符串参数
MessageAttribute.entry.1.Name 'service_type'
MessageAttributes.entry.1.Value.DataType 'String'
MessageAttributes.entry.1.Value.StringValue 'order'
节点js代码
const axios = require('axios');
let url = `apiurl`;
//let message_attribute ={ message_attribute:'order'};
let payload = {
message: 'First Message',
MessageAttributes: {
service_type: {
DataType: 'String',
StringValue: 'order',
BinaryValue: null
}
}
};
axios
.post(url, payload)
.then(function (response) {
console.log(response.data);
})
.catch(function (error) {
console.log(error);
});
您的帮助将不胜感激
【问题讨论】:
标签:
amazon-web-services
amazon-sqs
amazon-sns
amazon-api-gateway
aws-sqs-fifo
【解决方案1】:
对于 API Gateway 和 SQS 集成,创建如下响应模板(OpenAPI 规范 yaml),
requestTemplates:
application/x-www-form-urlencoded: "Action=SendMessage&MessageBody=$util.base64Encode($input.body)
&MessageAttribute.1.Name=type&MessageAttribute.1.Value.StringValue=xyz&MessageAttribute.1.Value.DataType=String
&MessageAttribute.2.Name=encoding&MessageAttribute.2.Value.StringValue=base64&MessageAttribute.2.Value.DataType=String
&MessageAttribute.3.Name=sourceIp&MessageAttribute.3.Value.StringValue=$context.identity.sourceIp&MessageAttribute.3.Value.DataType=String
&MessageAttribute.4.Name=apiTimestamp&MessageAttribute.4.Value.StringValue=$context.requestTimeEpoch&MessageAttribute.4.Value.DataType=Number"
下面是与 SNS 的集成(笔记:将{{topicArn}}替换为SNS主题的ARN),
requestTemplates:
application/x-www-form-urlencoded: "Action=Publish&Message=$util.base64Encode($input.body)
&TopicArn={{topicArn}}
&MessageAttributes.entry.1.Name=type&MessageAttributes.entry.1.Value.StringValue=xyz&MessageAttributes.entry.1.Value.DataType=String
&MessageAttributes.entry.2.Name=encoding&MessageAttributes.entry.2.Value.StringValue=base64&MessageAttributes.entry.2.Value.DataType=String
&MessageAttributes.entry.3.Name=sourceIp&MessageAttributes.entry.3.Value.StringValue=$context.identity.sourceIp&MessageAttributes.entry.3.Value.DataType=String
&MessageAttributes.entry.4.Name=apiTimestamp&MessageAttributes.entry.4.Value.StringValue=$context.requestTimeEpoch&MessageAttributes.entry.4.Value.DataType=Number"