22

Amazon S3 バケットに重要なデータがあります。他のコンテンツを別のクラウド サービス、または S3 内に毎週バックアップしたいと考えています。データが失われた場合に備えて、バケットを別のリージョン内の新しいバケットに同期するのが最善の方法です。

どうやってやるの?

4

5 に答える 5

14

変更のみが更新される同期を使用してローカルにバックアップすることを好みます。これは完全なバックアップ ソリューションではありませんが、必要に応じて後で定期的な更新を実装できます。

s3cmd sync --delete-removed s3://your-bucket-name/ /path/to/myfolder/

s3cmd を使用したことがない場合は、次を使用してインストールおよび構成します。

pip install s3cmd
s3cmd --configure

また、月額 5 ドルの S3 バックアップ サービスもあるはずですが、マルチパート アップロードを使用する場合は、40 GB 近くの単一アーカイブ ファイルを保存できる Amazon Glacier も確認します。

http://docs.aws.amazon.com/amazonglacier/latest/dev/uploading-archive-mpu.html#qfacts

S3 アカウントが侵害された場合、空のフォルダーや不正な形式のファイルを同期するため、すべてのデータを失う可能性があることに注意してください。そのため、たとえば週の始まりを検出するなどして、バックアップを数回アーカイブするスクリプトを作成することをお勧めします。

2016 年 1 月 17 日更新:

Python ベースの AWS CLI は現在非常に成熟しています。

使用してください: https://github.com/aws/aws-cli
例:aws s3 sync s3://mybucket .

于 2013-04-06T10:08:30.940 に答える
4

このスクリプトは、S3 バケットをバックアップします。

#!/usr/bin/env python
from boto.s3.connection import S3Connection
import re
import datetime
import sys
import time

def main():
    s3_ID = sys.argv[1]
    s3_key = sys.argv[2]
    src_bucket_name = sys.argv[3]
    num_backup_buckets = sys.argv[4]
    connection = S3Connection(s3_ID, s3_key)
    delete_oldest_backup_buckets(connection, num_backup_buckets)
    backup(connection, src_bucket_name)

def delete_oldest_backup_buckets(connection, num_backup_buckets):
    """Deletes the oldest backup buckets such that only the newest NUM_BACKUP_BUCKETS - 1 buckets remain."""
    buckets = connection.get_all_buckets() # returns a list of bucket objects
    num_buckets = len(buckets)

    backup_bucket_names = []
    for bucket in buckets:
        if (re.search('backup-' + r'\d{4}-\d{2}-\d{2}' , bucket.name)):
            backup_bucket_names.append(bucket.name)

    backup_bucket_names.sort(key=lambda x: datetime.datetime.strptime(x[len('backup-'):17], '%Y-%m-%d').date())

    # The buckets are sorted latest to earliest, so we want to keep the last NUM_BACKUP_BUCKETS - 1
    delete = len(backup_bucket_names) - (int(num_backup_buckets) - 1)
    if delete <= 0:
        return

    for i in range(0, delete):
        print 'Deleting the backup bucket, ' + backup_bucket_names[i]
        connection.delete_bucket(backup_bucket_names[i])

def backup(connection, src_bucket_name):
    now = datetime.datetime.now()
    # the month and day must be zero-filled
    new_backup_bucket_name = 'backup-' + str('%02d' % now.year) + '-' + str('%02d' % now.month) + '-' + str(now.day);
    print "Creating new bucket " + new_backup_bucket_name
    new_backup_bucket = connection.create_bucket(new_backup_bucket_name)
    copy_bucket(src_bucket_name, new_backup_bucket_name, connection)


def copy_bucket(src_bucket_name, dst_bucket_name, connection, maximum_keys = 100):
    src_bucket = connection.get_bucket(src_bucket_name);
    dst_bucket = connection.get_bucket(dst_bucket_name);

    result_marker = ''
    while True:
        keys = src_bucket.get_all_keys(max_keys = maximum_keys, marker = result_marker)

        for k in keys:
            print 'Copying ' + k.key + ' from ' + src_bucket_name + ' to ' + dst_bucket_name

            t0 = time.clock()
            dst_bucket.copy_key(k.key, src_bucket_name, k.key)
            print time.clock() - t0, ' seconds'

        if len(keys) < maximum_keys:
            print 'Done backing up.'
            break

        result_marker = keys[maximum_keys - 1].key

if  __name__ =='__main__':main()

これを rake タスク (Rails アプリ用) で使用します。

desc "Back up a file onto S3"
task :backup do
     S3ID = "AKIAJM3FAKEFAKENRWVQ"
     S3KEY = "0A5kuzV+F1pbaMjZxHQAZfakedeJd0dfakeNpry"
     SRCBUCKET = "primary-mzgd"
     NUM_BACKUP_BUCKETS = 2

     Dir.chdir("#{Rails.root}/lib/tasks")
     system "./do_backup.py #{S3ID} #{S3KEY} #{SRCBUCKET} #{NUM_BACKUP_BUCKETS}"
end
于 2012-09-14T18:20:47.710 に答える
0

最善の方法は、データが失われた場合にバケットを別のリージョンの新しいバケットと同期できるようにすることです。

2015年 3 月 24 日現在、これはS3のCross-Region Replication機能を使用して可能です。

リストされているユース ケース シナリオの 1 つは「コンプライアンス要件」です。これは、データ損失に対する重要なデータの保護を強化するユース ケースと一致しているようです。

デフォルトでは、Amazon S3 は地理的に離れた複数のアベイラビリティーゾーンにデータを保存しますが、コンプライアンス要件により、さらに離れた場所にデータを保存する必要がある場合があります。リージョン間レプリケーションを使用すると、離れた AWS リージョン間でデータをレプリケートして、これらのコンプライアンス要件を満たすことができます。

設定手順については、 「クロスリージョン レプリケーションを設定する方法」を参照してください。

于 2017-01-04T19:14:20.023 に答える