最初发布在我的博客上: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 sync s3://your-bucket-name /home/ubuntu/s3/your-bucket-name/
好处:
- 可扩展 - 支持巨大的 S3 存储桶
- 多线程 - 通过利用多个线程更快地同步文件
- 智能 - 仅同步新文件或更新文件
- 快速 - 得益于其多线程特性和智能同步算法
意外删除
方便的是,sync
如果源(S3 存储桶)中缺少目标文件夹(本地文件系统)中的文件,该命令不会删除它们,反之亦然。这非常适合备份 S3 - 如果文件从存储桶中删除,重新同步它不会在本地删除它们。如果您删除本地文件,它也不会从源存储桶中删除。
在 Ubuntu 14.04 LTS 上设置 awscli
让我们从安装开始awscli
。有几种方法可以做到这一点,但是,我发现通过apt-get
.
$ sudo apt-get 安装 awscli
配置
接下来,我们需要通过创建用户并附加AmazonS3ReadOnlyAccess策略来配置您必须从IAMawscli
获取的访问密钥 ID 和密钥。这也将阻止您或任何有权访问这些凭据的人删除您的 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
:
$纳米/home/ubuntu/s3/sync.sh
将以下代码复制并粘贴到sync.sh
:
#!/bin/sh
# 回显当前日期和时间
回声'--------------'
日期
回声'--------------'
回声''
# 回显脚本初始化
echo '正在同步远程 S3 存储桶...'
# 实际运行同步命令(将 {BUCKET_NAME} 替换为您的 S3 存储桶名称)
/usr/bin/aws s3 同步 s3://{BUCKET_NAME} /home/ubuntu/s3/{BUCKET_NAME}/
# 回显脚本完成
echo '同步完成'
确保将{BUCKET_NAME}替换为您的 S3 存储桶名称,在整个脚本中使用两次。
专业提示:您应该使用/usr/bin/aws
链接到aws
二进制文件,因为crontab
在有限的 shell 环境中执行命令并且无法自行找到可执行文件。
接下来,确保chmod
脚本可以由crontab
.
$ sudo chmod +x /home/ubuntu/s3/sync.sh
让我们尝试运行脚本以确保它确实有效:
$ /home/ubuntu/s3/sync.sh
输出应该与此类似:
crontab
接下来,让我们通过执行以下命令来编辑当前用户:
$ crontab -e
如果这是您第一次执行crontab -e
,您需要选择一个首选编辑器。我建议选择nano
它,因为它对初学者来说最容易使用。
同步频率
我们需要crontab
通过编写命令来确定脚本运行的频率以及脚本在本地文件系统中的位置。该命令的格式如下:
mh dom mon dow 命令
以下命令配置为每小时crontab
运行一次脚本(通过 minute:0 和 hour:* 参数指定)并将脚本的输出通过管道传输到我们目录中的文件:sync.sh
sync.log
s3
0 * * * * /home/ubuntu/s3/sync.sh > /home/ubuntu/s3/sync.log
crontab
您应该将此行添加到您正在编辑的文件的底部。然后,继续按Ctrl + W将文件保存到磁盘,然后按 Enter。然后,您可以nano
按Ctrl + X退出。crontab
现在将每小时运行一次同步任务。
专业提示:/home/ubuntu/s3/sync.log
您可以通过检查、检查执行日期和时间的内容以及检查日志以查看已同步哪些新文件来验证每小时 cron 作业是否已成功执行。
可以了,好了!您的 S3 存储桶现在将每小时自动同步到您的 EC2 服务器,您应该一切顺利。请注意,随着时间的推移,随着您的 S3 存储桶变大,您可能必须增加 EC2 服务器的 EBS 卷大小以容纳新文件。您始终可以按照本指南增加 EBS 卷大小。