最初发布在我的博客上:http : //eladnava.com/backing-up-your-amazon-s3-buckets-to-ec2/
定期将您的S3存储桶同步到EC2服务器
这可以通过利用多个命令行实用程序轻松实现,这些实用程序可以将远程S3存储桶同步到本地文件系统。
s3cmd
最初s3cmd
看起来非常有前途。但是,在我巨大的S3存储桶上试用后,它无法缩放,并出现错误Segmentation fault
。不过,它在小水桶上确实工作良好。由于它不适用于大型水桶,因此我开始寻找替代方法。
s4cmd
的更新,多线程替代品s3cmd
。看起来更加有希望,但是,我注意到它一直在重新下载本地文件系统上已经存在的文件。这不是我从sync命令期望的行为。它应该检查远程文件是否已经在本地存在(哈希/文件大小检查会很整洁),并在同一目标目录上的下一次同步中跳过它。我打开了一个问题(bloomreach / s4cmd /#46)报告了这种奇怪的行为。同时,我开始寻找另一种选择。
awscli
然后我发现awscli
。这是Amazon的官方命令行界面,用于与其不同的云服务(包括S3)进行交互。
它提供了一个有用的同步命令,可以快速轻松地将远程存储桶文件下载到本地文件系统。
$ aws s3 sync s3://您的存储桶名称/ home / ubuntu / s3 /您的存储桶名称/
好处:
- 可扩展-支持庞大的S3存储桶
- 多线程-通过利用多个线程更快地同步文件
- 智能-仅同步新文件或更新文件
- 快速-得益于其多线程特性和智能同步算法
意外删除
方便地,sync
如果源文件夹(S3存储桶)中缺少文件,该命令将不会删除目标文件夹(本地文件系统)中的文件,反之亦然。这是备份S3的理想选择-如果文件从存储桶中删除,则重新同步它不会在本地删除它们。而且,如果您删除本地文件,则也不会从源存储桶中删除该文件。
在Ubuntu 14.04 LTS上设置awscli
让我们从安装开始awscli
。有几种方法可以做到这一点,但是,我发现最容易通过安装它apt-get
。
$ sudo apt-get install awscli
组态
接下来,我们需要通过创建用户并附加AmazonS3ReadOnlyAccess策略awscli
,使用您必须从IAM获取的访问密钥ID和秘密密钥进行配置。这也将阻止您或获得这些凭据访问权限的任何人删除您的S3文件。确保输入您的S3区域,例如。us-east-1
$ aws配置
制备
让我们准备本地S3备份目录,最好在中/home/ubuntu/s3/{BUCKET_NAME}
。确保{BUCKET_NAME}
用您的实际存储桶名称替换。
$ mkdir -p / home / ubuntu / s3 / {BUCKET_NAME}
初始同步
让我们继续使用以下命令首次同步存储桶:
$ aws s3 sync 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'正在同步远程S3存储桶...'
#实际运行sync命令(将{BUCKET_NAME}替换为您的S3存储桶名称)
/ usr / bin / aws s3 sync s3:// {BUCKET_NAME} / home / ubuntu / s3 / {BUCKET_NAME} /
#回声脚本完成
回显“同步完成”
确保在脚本中两次用您的S3存储桶名称替换{BUCKET_NAME}。
专家提示:您应该使用/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
为sync.sh
每小时运行一次脚本(通过minute:0和hour:*参数指定),并使其通过管道将脚本的输出传递到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的容量。