为什么SNS序列化的JSON消息仅显示“default”?

0

【以下的问题经过翻译处理】 你好, 我有一个Lambda函数,它将消息插入到SNS主题中。该主题随后被推送到订阅的SQS队列,并触发Lambda函数来处理和发送SES电子邮件。

问题:当消息通过SNS和SQS并到达Lambda触发器时,“Message”属性不包含完整的序列化JSON字符串,它被剪切/格式化了。我尝试了下面的许多变体,包括这个 **回goes back to 2014 **的对话: https://github.com/aws/aws-sdk-js/issues/262

将插入到SNS的主题消息参数:

var params = { TopicArn: "...", MessageStructure: "json", Message: JSON.stringify({ default: "I am the default", info: JSON.stringify({data: { message: "hello 123"} }) }), MessageGroupId: "PID-112" };

通过SNS/Queue后的消息主体:

Records: [ { messageId: '...', receiptHandle: '...', body: '{\n' + ' "Type" : "Notification",\n' + ' "MessageId" : "...",\n' + ' "TopicArn" : "arn:aws:sns:...",\n' + ' "Message" : "I am the default",\n' + ' "Timestamp" : "2022-07-07...",\n' + ' "UnsubscribeURL" : "...' + '}', attributes: [Object], messageAttributes: {}, eventSource: 'aws:sqs', eventSourceARN: 'arn:aws:sqs:...', } ]

profile picture
专家
已提问 5 个月前52 查看次数
1 回答
0

【以下的回答经过翻译处理】 Message 属性可以是要发送到所有传输协议的文本消息,也可以是一个 json 对象,当你将属性 MessageStructure 设置为 json 时,可以为每个传输协议发送不同的文本。请参见 发布 API

如果你没有为特定协议定义属性,则会使用 default 属性中的信息。由于你发送到 SQS,只有 default 属性中的信息被发送,而 info 属性不映射到任何传输协议,因此不会被发送。

对于你的用例,请不要发送 MessageStructure 并移除内部 JSON.stringify,例如:

var params = { TopicArn: "arn:aws:sns:us-east-1:321363201397:sendNotification.fifo", Message: JSON.stringify({ default: "I am the default", info: {data: { message: "hello 123"} } }), MessageGroupId: "PID-112" };
profile picture
专家
已回答 5 个月前

您未登录。 登录 发布回答。

一个好的回答可以清楚地解答问题和提供建设性反馈,并能促进提问者的职业发展。

回答问题的准则