我正在寻找一种方法来将 AWS 存储桶的每日备份作为增量备份。这些备份将离线存储,远离 AWS。
对于其他存储系统(如 NAS 驱动器),我每天使用同步用于备份。使用 rsync 的--link-dest
开关,我可以每天对远程文件系统进行完整快照。自上次备份以来未更改的任何文件都硬链接到上次备份。这意味着完整的每日快照仅占用增量备份的存储空间。
我想为 Amazon S3 存储桶设置类似的东西。存储桶中有 20GB,但每天只有约 50MB 的变化。
请注意,这是备份 S3 存储桶的内容,而不是备份其他内容到 S3 存储桶。
我知道如何使用 AWS CLI 工具进行完整备份。但不知道如何进行增量备份。
我想我可以(每天)将 S3 同步到本地硬盘,然后每天备份本地硬盘。这感觉很笨重。
编辑
这本来是一个简单的技术问题,而不是关于备份安全性的一般性讨论。但既然有人问我“为什么需要这个”,我现在觉得我需要解释一下备份的基本原理。
轶事:我最近目睹了第三方 IT 提供商由于沟通不畅而 (完全) 丢失了 S3 存储桶。这可能代价非常高昂 (最近工作约 10 万英镑,总工作约 100 万英镑)。幸运的是,我们碰巧在本地笔记本电脑上也有副本,我们只花了 1000 英镑就为他们重建了内容。
它让我更加坚信唯一有效的“备份”是孤立的系统存储场外和离线并通过媒体轮换有效地实施时间锁。其他备份可以增强功能,提供更快速的恢复等...但将所有 AWS 备份保存在您自己的 AWS 账户上并不安全,因为...用户错误。
答案1
除了 之外,还有一种方法aws s3 sync
,但它可能同样笨重。你看,这归结为在 S3 存储桶上添加一个在 PUT 上触发的 Lambda 钩子。理论上,这将允许你构建一个仅限添加S3 bucket 的副本,因此任何 DELETE 都不会被复制。有这方面的教程,但本质上:
- 在存储桶中对对象进行操作。
- 给定操作的事件数据后,Lambda 被触发。
- 如果操作是 PUT,您编写的代码将对该对象执行操作。它会忽略 DELETE。
增量备份逻辑将由您编写。
答案2
注意:这是对原始问题的回答前它甚至提到离线备份。将其留在这里作为原始问题的答案:如何创建 AWS S3 存储桶的增量备份。
第一个问题是为什么要备份 S3 存储桶?您要预防的问题是什么?
记住S3 耐用性大约是 99.99999% - 你极不可能由于硬件故障导致丢失对象,因此我们可以排除这种可能性。
如果你想确保可以恢复 S3 中意外覆盖的对象,你可以使用S3 版本控制- 这将保留文件所有旧版本的历史记录,您可以通过这种方式进行恢复。删除也一样。
说到删除 - 你可以使用S3 删除的 MFA作为另一层保护,例如出于合规性和审计原因。(谢谢蒂姆:)
如果您需要第二个 DR(灾难恢复)在其他地区存储桶,以防万一您的主要地区离线,您可以使用S3 跨区域复制每次发生更改时,它都会自动将您的存储桶内容从一个区域镜像到另一个区域。
如果以上都不能满足您的需求,您可能需要Lambda 函数它会为您处理 S3 存储桶中的每个更改。这样,每次您在 S3 中写入/更新对象时,Lambda 都会将对象备份到您的首选目标。这可以用于在不同的 AWS 账户之间、其他云提供商之间或线下目的地(例如,到您的本地服务器)。使用 Lambda,您可以非常灵活地处理更改。请参阅将 Lambda 与 Amazon S3 结合使用。
如果这还不够,你可以随时使用
aws s3 sync
比较源和目标存储桶并复制仅有的有什么改变。(更新)对于离线备份
- 你当然可以使用
aws s3 sync
同样 - 它可以与磁盘同步,而不仅仅是在存储桶之间同步。 - 或者你可以开发一个更复杂的解决方案,基于捕捉S3 事件当对象被创建/更新时,并立即将它们复制到离线存储中。它应该是一个非常简单的程序,位于您的服务器上,监听 S3 事件或 SNS 消息,联系 S3 获取更新的对象。
- 你当然可以使用
有很多选择。希望其中一些能满足您的需求 :)