2012-08-05 8 views
19

私はAmazon S3バケットに重要なデータを持っています。私は他のクラウドサービスに、あるいはS3の中にさえ、他のコンテンツを毎週バックアップする必要があります。データが消失した場合、バケットを別の地域の新しいバケットに同期するのが最善の方法です。Amazon S3バケットをバックアップまたは同期するにはどうすればよいですか?

どうすればいいですか?

+0

s3cmd http://s3tools.org/s3cmdを使用するか、s3 apiで独自のバックアップツールを作成してください。 – qrtt1

+3

本当に便利ですか? S3のデータは冗長です。 http://aws.amazon.com/s3/#protectingから:「Amazon S3の標準ストレージは、2つの施設で同時にデータが失われるのを防ぐために設計されています。」 – ben

+1

このアプローチの有用性についてのもう一つの洞察を追加するには[S3 FAQ](http://aws.amazon.com/s3/faqs/#How_durable_is_Amazon_S3)): Amazon S3は、特定の年に99.999999999%のオブジェクトの耐久性を提供するように設計されています。この耐久性レベルは、オブジェクトの0.000000001%の平均年間期待損失に対応します。たとえば、Amazon S3で10,000個のオブジェクトを保存した場合、平均して10,000,000年に1回オブジェクトが失われることが予想されます。さらに、Amazon S3は、2つの施設におけるデータの同時損失を維持するように設計されています。 – Viccari

答えて

13

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

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

あなたがs3cmdを使用したことがない場合は、使用してそれをインストールして設定:

pip install s3cmd 
s3cmd --configure 

またS3のバックアップがなければなりません$ 5 /月のサービスを提供していますが、マルチパートアップロードを使用している場合は、ほぼ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
例:私は過去にこれを実行しようとしました、そしてそれは、特に大規模なマルチGB、多くの-百万人・オブ・ファイルのバケットで、まだうるさく難しいaws s3 sync s3://mybucket .

+0

$ 5 s3バックアップサービスのいくつかは何ですか?私は人間のエラーを防ぐバックアップをしたい。共有サーバーのようにs3を使用します。 –

+0

これ以上のようには見えません。Google Cloud Platformなどの別のクラウドアカウントを使用して重複を保存することをお勧めします。 – hurturk

3

このスクリプトは、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() 

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

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 
+0

FY3 ...あなたのS3 IDとKeyはこの答えで公開されているようです。 –

+2

これは偽物です。 –

0

。私が見つけた最高の解決策は、正確にこの目的のために作られたS3S3Mirrorでした。

スイッチを反転させるのと同じくらい些細なことではありませんが、私が試したほとんどのDIYソリューションよりも優れています。それはマルチスレッドであり、同様のシングルスレッドアプローチよりもはるかに高速にファイルをコピーします。

1つの提案:別のEC2インスタンスに設定し、実行すると、そのマシンをシャットダウンしますが、そこにAMIを残してください。その後、再起動する必要があるときは、マシンを再起動してください。これは、真に自動化されたソリューションほど素晴らしいものではありませんが、毎月または毎週のバックアップ用に管理可能です。

0

データが消失した場合、バケットを別の領域の新しいバケットと同期させることをお勧めします。

24 Mar 2015の場合、これはS3のCross-Region Replication機能を使用して可能です。記載されているUse-case Scenarios

一つのデータ損失に対する重要なデータの追加の保護のあなたのユースケースに合わせているようだ「コンプライアンス要件」、である:デフォルトでは、Amazon S3のは全体のデータを格納し、ものの

複数の地理的に離れたアベイラビリティゾーン、コンプライアンス要件により、さらに遠くにデータを格納することが指示されることがあります。クロスリージョンレプリケーションを使用すると、遠方のAWSリージョン間でデータをレプリケートして、これらのコンプライアンス要件を満たすことができます。

設定手順については、How to Set Up Cross-Region Replicationを参照してください。

関連する問題