为什么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:...', } ]

1 Antwort
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
EXPERTE
beantwortet vor 5 Monaten

Du bist nicht angemeldet. Anmelden um eine Antwort zu veröffentlichen.

Eine gute Antwort beantwortet die Frage klar, gibt konstruktives Feedback und fördert die berufliche Weiterentwicklung des Fragenstellers.

Richtlinien für die Beantwortung von Fragen