amazon-web-services - AWS S3 存储桶的备份策略

标签 amazon-web-services amazon-s3 backup amazon-glacier

我正在寻找一些建议或最佳实践来备份 S3 存储桶。
从 S3 备份数据的目的是为了防止数据丢失,原因如下:

  • S3 问题
  • 我不小心从 S3 中删除了这些数据的问题

  • 经过一番调查,我看到以下选项:
  • 使用版本控制 http://docs.aws.amazon.com/AmazonS3/latest/dev/Versioning.html
  • 使用 AWS 开发工具包从一个 S3 存储桶复制到另一个存储桶
  • 备份到 Amazon Glacier http://aws.amazon.com/en/glacier/
  • 备份到生产服务器,生产服务器本身备份

  • 我应该选择什么选项,仅在 S3 上存储数据有多安全?想听听你的意见。
    一些有用的链接:
  • Data Protection Documentation
  • Data Protection FAQ
  • 最佳答案

    Originally posted on my blog: http://eladnava.com/backing-up-your-amazon-s3-buckets-to-ec2/



    定期将您的 S3 存储桶同步到 EC2 服务器

    这可以通过使用多个命令行实用程序轻松实现,这些实用程序可以将远程 S3 存储桶同步到本地文件系统。

    s3cmd
    起初,s3cmd 看起来非常有前途。然而,在我巨大的 S3 存储桶上尝试之后 - 它无法扩展,错误为 Segmentation fault 。不过,它确实在小桶上工作得很好。由于它不适用于大桶,我开始寻找替代方案。

    s4cmds3cmd 的较新的多线程替代方案。看起来更有希望,但是,我注意到它不断重新下载本地文件系统上已经存在的文件。这不是我期望从同步命令中得到的那种行为。它应该检查远程文件是否在本地已经存在(哈希/文件大小检查会很整洁)并在下一次同步运行时在同一目标目录上跳过它。我打开了一个问题 (bloomreach/s4cmd/#46) 来报告这种奇怪的行为。与此同时,我开始寻找另一种选择。

    awscli
    然后我找到了 awscli 。这是亚马逊的官方命令行界面,用于与其不同的云服务(包括 S3)进行交互。

    AWSCLI

    它提供了一个有用的同步命令,可以快速轻松地 将远程存储桶文件下载到本地文件系统

    $ aws s3 同步 s3://your-bucket-name/home/ubuntu/s3/your-bucket-name/

    好处:
  • 可扩展 - 支持巨大的 S3 存储桶
  • 多线程 - 通过利用多线程更快地同步文件
  • 智能 - 仅同步新文件或更新文件
  • 快速 - 由于其多线程特性和智能同步算法

  • 意外删除

    方便的是,如果目标文件夹(本地文件系统)中的文件从源(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 配置

    aws configure

    准备

    让我们准备本地 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 the aws binary, as crontab 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

    输出应与此类似:

    sync.sh output

    接下来,让我们通过执行以下命令来编辑当前用户的 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 退出 nanocrontab 现在将每小时运行一次同步任务。

    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/

    相关文章:

    javascript - 自定义意图的 AWS lambda 超时

    python - 如何使用 Poetry 将 Python 包发布到 CodeArtifact?

    amazon-web-services - CloudWatch Events 规则未使用标签查找 EC2 目标

    url - 限制我的移动应用程序访问云端签名 URL(GET 请求)

    .net - 归档平面文件的理想选择

    sql-server - SQL Server 数据库还原卡在 99%

    django - 图像使用原始 URL 还是静态 URL?

    amazon-web-services - 存储桶策略拒绝 S3 :DeleteBucket and S3:DeleteObject still deletes objects

    amazon-web-services - 无法在现有 S3 存储桶中放置通知事件来触发 CloudFormation Lambda

    scripting - vmware - 脚本自动备份