我正在寻找一些建议或最佳实践来备份 S3 存储桶。
从 S3 备份数据的目的是为了防止数据丢失,原因如下:
经过一番调查,我看到以下选项:
我应该选择什么选项,仅在 S3 上存储数据有多安全?想听听你的意见。
一些有用的链接:
最佳答案
Originally posted on my blog: http://eladnava.com/backing-up-your-amazon-s3-buckets-to-ec2/
定期将您的 S3 存储桶同步到 EC2 服务器
这可以通过使用多个命令行实用程序轻松实现,这些实用程序可以将远程 S3 存储桶同步到本地文件系统。
s3cmd
起初,
s3cmd
看起来非常有前途。然而,在我巨大的 S3 存储桶上尝试之后 - 它无法扩展,错误为 Segmentation fault
。不过,它确实在小桶上工作得很好。由于它不适用于大桶,我开始寻找替代方案。s4cmd
s3cmd
的较新的多线程替代方案。看起来更有希望,但是,我注意到它不断重新下载本地文件系统上已经存在的文件。这不是我期望从同步命令中得到的那种行为。它应该检查远程文件是否在本地已经存在(哈希/文件大小检查会很整洁)并在下一次同步运行时在同一目标目录上跳过它。我打开了一个问题 (bloomreach/s4cmd/#46) 来报告这种奇怪的行为。与此同时,我开始寻找另一种选择。awscli
然后我找到了
awscli
。这是亚马逊的官方命令行界面,用于与其不同的云服务(包括 S3)进行交互。它提供了一个有用的同步命令,可以快速轻松地 将远程存储桶文件下载到本地文件系统 。
$ aws s3 同步 s3://your-bucket-name/home/ubuntu/s3/your-bucket-name/
好处:
意外删除
方便的是,如果目标文件夹(本地文件系统)中的文件从源(S3 存储桶)中丢失,则
sync
命令不会删除它们,反之亦然。这非常适合备份 S3——如果文件从存储桶中删除,重新同步它不会在本地删除它们。如果您删除本地文件,它也不会从源存储桶中删除。在 Ubuntu 14.04 LTS 上设置 awscli
让我们从安装
awscli
开始。有 several ways 可以执行此操作,但是,我发现通过 apt-get
安装它最容易。$ sudo apt-get install awscli
配置
接下来,我们需要通过创建用户并附加 AmazonS3ReadOnlyAccess 策略,使用我们的访问 key ID 和 secret key (您必须从 IAM 获取)配置
awscli
。这也将阻止您或任何有权访问这些凭据的人删除您的 S3 文件。确保输入您的 S3 区域,例如 us-east-1
。$ aws 配置
准备
让我们准备本地 S3 备份目录,最好在
/home/ubuntu/s3/{BUCKET_NAME}
中。确保将 {BUCKET_NAME}
替换为您的实际存储桶名称。$ mkdir -p/home/ubuntu/s3/{BUCKET_NAME}
初始同步
让我们继续使用以下命令第一次同步存储桶:
$ aws s3 同步 s3://{BUCKET_NAME}/home/ubuntu/s3/{BUCKET_NAME}/
假设存储桶存在,AWS 凭证和区域正确,并且目标文件夹有效,
awscli
将开始将整个存储桶下载到本地文件系统。根据存储桶的大小和您的 Internet 连接,它可能需要几秒钟到几小时的时间。完成后,我们将继续设置自动 cron 作业以保持存储桶的本地副本最新。
设置 Cron 作业
继续在
sync.sh
中创建一个 /home/ubuntu/s3
文件:$ nano/home/ubuntu/s3/sync.sh
将以下代码复制并粘贴到
sync.sh
中:#!/bin/sh
# 回显当前日期和时间
echo '-----------------------------'
日期
echo '-----------------------------'
回声''
# echo 脚本初始化
echo '正在同步远程 S3 存储桶...'
# 实际运行同步命令(将 {BUCKET_NAME} 替换为您的 S3 存储桶名称)
/usr/bin/aws s3 同步 s3://{BUCKET_NAME}/home/ubuntu/s3/{BUCKET_NAME}/
# echo 脚本完成
echo '同步完成'
确保将 {BUCKET_NAME} 替换为您的 S3 存储桶名称,在整个脚本中两次。
Pro tip: You should use
/usr/bin/aws
to link to theaws
binary, ascrontab
executes commands in a limited shell environment and won't be able to find the executable on its own.
接下来,确保脚本
chmod
可以被 crontab
执行。$ sudo chmod +x/home/ubuntu/s3/sync.sh
让我们尝试运行脚本以确保它确实有效:
$/home/ubuntu/s3/sync.sh
输出应与此类似:
接下来,让我们通过执行以下命令来编辑当前用户的
crontab
:$ crontab -e
如果这是您第一次执行
crontab -e
,则需要选择首选编辑器。我建议选择 nano
,因为它是初学者最容易使用的。同步频率
我们需要通过编写命令来告诉
crontab
运行脚本的频率以及脚本在本地文件系统上的位置。该命令的格式如下:m h dom mon dow 命令
以下命令将
crontab
配置为每小时运行 sync.sh
脚本(通过 minute:0 和 hour:* 参数指定)并将脚本的输出通过管道传输到我们 sync.log
目录中的 s3
文件:0 * * * */home/ubuntu/s3/sync.sh >/home/ubuntu/s3/sync.log
您应该将此行添加到您正在编辑的
crontab
文件的底部。然后,通过按 Ctrl + W 然后 输入 继续将文件保存到磁盘。然后,您可以通过按 Ctrl + X 退出 nano
。 crontab
现在将每小时运行一次同步任务。Pro tip: You can verify that the hourly cron job is being executed successfully by inspecting
/home/ubuntu/s3/sync.log
, checking its contents for the execution date & time, and inspecting the logs to see which new files have been synced.
一切就绪!您的 S3 存储桶现在将每小时自动同步到您的 EC2 服务器,您应该很高兴。请注意,随着时间的推移,随着 S3 存储桶变大,您可能需要增加 EC2 服务器的 EBS 卷大小以容纳新文件。您始终可以通过关注 this guide 来增加 EBS 卷大小。
关于amazon-web-services - AWS S3 存储桶的备份策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17832860/