将AWS S3事件转发到SQS最终会变成与从S3到SNS到SQS不同的消息吗?

时间:2019-02-13 10:00:18

标签: amazon-web-services amazon-s3 amazon-sqs amazon-sns splunk

我正在使用Splunk技术插件,该插件将从SQS队列中提取消息。尽管TA建议使用S3转发到SNS并已订阅了SQS,但是S3也有可能直接转发到SQS。

SNS会对S3发送给它的内容进行任何更改吗?还是对SQS完全透明的传输方法?

1 个答案:

答案 0 :(得分:2)

是的,默认情况下,S3→SQS和S3→SNS→SQS将在SQS消息主体内产生两种不同的数据结构/格式。

这是因为SNS订阅向metadata提供了每条传递的消息-SNS >>> print(df) 0 EmpID FirstName LastName Relationship 0 1 Ax Bx 1A 1 1 Cx Dx 1B MessageId以验证真实性,Signature是SNS最初接受的时间消息和其他属性。原始消息在此外部JSON结构的Timestamp属性内被编码为JSON字符串。

因此,直接使用SQS,您将使用(伪代码)提取S3事件...

Message

...但是从SNS到SQS ...

s3event = JSON.parse(sqsbody)

您可以禁用其他结构,并通过对SNS主题的SQS订阅启用原始消息传递来使SNS仅发送原始有效载荷。

https://docs.aws.amazon.com/sns/latest/dg/sns-large-payload-raw-message-delivery.html

启用原始消息传递后,S3→SQS和S3→SNS→SQS的内容将相同。

原始消息传递的不利之处在于,原始消息传递会丢失潜在有用的故障排除信息,例如SNS消息ID和SNS发出的时间戳。

另一方面,如果接收服务(SQS使用者)假定消息始终通过SNS来发送,并希望在SQS消息正文中找到SNS数据结构,则直接发送S3→SQS将导致使用者发现来自SQS的邮件正文与预期不符。