AWS S3 事件通知是不是可以保证送达?

Posted

技术标签:

【中文标题】AWS S3 事件通知是不是可以保证送达?【英文标题】:Are AWS S3 Event Notifications guaranteed to be delivered?AWS S3 事件通知是否可以保证送达? 【发布时间】:2016-03-18 05:54:42 【问题描述】:

我正在将 AWS S3 事件通知连接到 AWS Lambda 处理管道。

我找不到有关 S3 事件通知保证的文档。我可以确定所有 S3 事件都会触发 lambda 进程吗?订单与我无关,只是我的 lambda 最终会被解雇。

如果不存在这样的保证,架构师如何处理?

【问题讨论】:

只要您在 s3 中定义您的存储桶发送事件,就没有理由怀疑它不会... 【参考方案1】:

2020 年更新

事件现在至少有一次:https://docs.aws.amazon.com/AmazonS3/latest/dev/NotificationHowTo.html

该页面的相关引用:

Amazon S3 事件通知设计为至少发送一次。通常,事件通知会在几秒钟内送达,但有时可能需要一分钟或更长时间。

原答案

原则上是的。但是,Lambda 有 99.9% 的 SLA,S3 也有 99.9% 的正常运行时间 SLA。所以从理论上讲,有些事件可能会被错过,但前提是它们有服务中断。当 Lambda 函数失败时,它会自动重试最多 3 次。

我将 S3 用作 Lambda 的“队列”,并且从未错过任何消息(数以百万计)。

我认为你无能为力。使用“无服务器”基础设施的一部分意味着您也会失去一些控制权(但是,我认为 AWS 可以做得比我自己和一些专用服务器做得更好)。

【讨论】:

2.5 年后,这对您来说仍然有效吗?我正在考虑以同样的方式使用 S3。 是的,我们仍然在我们的实时环境中使用它,并以这种方式成功处理了数十亿个事件! Lambda 将重试异步调用两次,而不是三次。 我认为您的意思是“原则上不是,但实际上是”。 “保证”是关于某事的正式保证或承诺。在实践中,您可能永远不会真正遇到问题,因为提供商会尽一切合理努力确保事情按照他们应该的方式发生,但这并不能保证。 很难说。如果他们迷路了,您可能也不会看到弹出错误,因为没有触发任何内容。但我们仍在运行这些管道(距离我的回答大约 3.5 年),已经处理了数十亿次 lambda 执行,并且从未遇到过可能与此相关的问题。【参考方案2】:

From the Documentation 重要 Amazon S3 事件通知通常会在几秒钟内发送事件,但有时可能需要一分钟或更长时间。 在极少数情况下,事件可能会丢失

我们现在看到丢失的事件。数量很多,但百分比很低。

【讨论】:

与提供的链接相关,看这里决定实现哪个错误处理逻辑:docs.aws.amazon.com/lambda/latest/dg/invocation-async.html 请注意,文档已更新,现在声明保证交付 @mishka 感谢您的更新。这当然很有趣 它没有说,也从来没有说过,“保证交付”。它说“Amazon S3 事件通知设计为至少发送一次。”设计做 X 和保证做 X 不是一回事。虽然您可能永远不会看到事件丢失事件(因为系统旨在防止它发生),但这并不是保证。 @jarmod 现在明确说明事件可能丢失的边缘情况:“如果同时对单个非版本化对象进行两次写入,则可能只有一个事件将发送通知。”【参考方案3】:

非常有趣的是,AWS 仅通过文档而不是产品将语义从 at most once 升级为 at most once

2020 年之前,link 如下所示:

Amazon S3 事件通知通常会在几秒钟内发送事件,但 有时可能需要一分钟或更长时间。在非常罕见的情况下,事件 可能会丢失。如果您的应用程序需要特定的语义(例如 例如,确保没有错过任何事件,或者操作运行 只有一次),我们建议您考虑错过和重复 设计应用程序时的事件。您可以审核错过的 使用 LIST Objects API 或 Amazon S3 Inventory 报告的事件。 LIST Objects API 和 Amazon S3 库存报告受制于 最终的一致性,可能不会反映最近添加或删除的内容 对象。

2020年改为至少一次,如下:

Amazon S3 事件通知设计为至少发送一次。通常,事件通知会在几秒钟内送达,但有时可能需要一分钟或更长时间。

2021 年 11 月,根据 PR,它再次降级为仅一次

默认情况下,Amazon S3 事件通知仅发送一次。大多数情况下,事件通知会在几秒钟内发送。但是,有时可能需要一分钟或更长时间才能送达。

2021 年 12 月,我们指出 AWS 进行了向后不兼容的更改,AWS 解释说这是文档更改事件,尽管我不相信。于是AWS很快将文档改回如下:

Amazon S3 事件通知设计为至少发送一次。通常,事件通知会在几秒钟内送达,但有时可能需要一分钟或更长时间

但 AWS 支持也告诉我们,它被设计为至少一次,但不保证任何事情。

所以这不仅令人困惑,而且具有误导性。

【讨论】:

好吧,AWS 支持告诉我们,S3 事件通知设计为至少发送一次,但不保证您的 lambda 被调用。这是多么令人困惑!

以上是关于AWS S3 事件通知是不是可以保证送达?的主要内容,如果未能解决你的问题,请参考以下文章

S3 存储桶 Lambda 事件:无法验证以下目标配置

使用nodejs中的AWS Lambda函数上传音频文件

将文件上传到 S3 存储桶后,AWS Glue Crawler 的基于事件的触发器?

AWS:如何修复 S3 事件用“+”在 json 中登录对象键名替换空格

使用从 S3 事件调用的 AWS Lambda 触发 Airflow DAG

为啥 AWS Lambda CFN S3 响应在删除事件时返回 403?