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



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

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

是的,默认情况下,→ SQS 和 S3 → SNS → SQS 将导致 SQS 消息正文中有两种不同的数据结构/格式。

这是因为 SNS 订阅为传递的每条消息提供元数据 - SNSMessageId、验证真实性的Signature、SNS 最初接受消息的时间Timestamp以及其他属性。 原始消息在此外部 JSON 结构的Message属性内编码为 JSON 字符串。

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

s3event = JSON.parse(sqsbody)

。但是随着SNS到SQS...

s3event = JSON.parse(JSON.parse(sqsbody).Message)

您可以通过在 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 的消息正文不符合其预期。

最新更新