最初にコンテンツをローカルシステムにダウンロードせずに、S3バケットのコンテンツを2番目のバケットにコピーするのに役立つツールを探していました。
AWS S3コンソールコピーオプションを試しましたが、ネストされたファイルがいくつか失われました。
Transmitアプリ(Panic)を使用しようとしましたが、重複コマンドは最初にファイルをローカルシステムにコピーしてから、2番目のバケットにコピーします
AWS(ごく最近)は、バケット間でコピーするためのコマンドラインインターフェイスをリリースしました。
$ aws s3 sync s3://mybucket-src s3://mybucket-target --exclude *.tmp
..
このは、1つのターゲットバケットから別のバケットにコピーします。
こちらのドキュメントを参照してください: S3 CLI Documentation
Aws-sdk gemを使用した簡単な例:
AWS.config(:access_key_id => '...', :secret_access_key => '...')
s3 = AWS::S3.new
s3.buckets['bucket-name'].objects['source-key'].copy_to('target-key')
異なるバケット間でコピーを実行する場合は、ターゲットバケット名を指定します。
s3.buckets['bucket-name'].objects['source-key'].copy_to('target-key', :bucket_name => 'target-bucket')
これで、S3管理インターフェイスから実行できます。 1つのバケットに移動して、すべてのフォルダーactions->copy
を選択します。次に、新しいバケットactions->paste
に移動します。
最近のaws-sdkgemで可能です。コードサンプルを参照してください。
require 'aws-sdk'
AWS.config(
:access_key_id => '***',
:secret_access_key => '***',
:max_retries => 10
)
file = 'test_file.rb'
bucket_0 = {:name => 'bucket_from', :endpoint => 's3-eu-west-1.amazonaws.com'}
bucket_1 = {:name => 'bucket_to', :endpoint => 's3.amazonaws.com'}
s3_interface_from = AWS::S3.new(:s3_endpoint => bucket_0[:endpoint])
bucket_from = s3_interface_from.buckets[bucket_0[:name]]
bucket_from.objects[file].write(open(file))
s3_interface_to = AWS::S3.new(:s3_endpoint => bucket_1[:endpoint])
bucket_to = s3_interface_to.buckets[bucket_1[:name]]
bucket_to.objects[file].copy_from(file, {:bucket => bucket_from})
$ aws s3 cp s3://src_bucket/file s3://dst_bucket/file --source-region eu-west-1 --region ap-northeast-1
上記のコマンドは、ヨーロッパ(eu-west-1)のバケットから日本(ap-northeast-1)にファイルをコピーします。次のコマンドを使用して、バケットのリージョンのコード名を取得できます。
$ aws s3api get-bucket-location --bucket my_bucket
ちなみに、S3 Webコンソールでコピーと貼り付けを使用するのは簡単ですが、ソースバケットからブラウザーにダウンロードしてから、宛先バケットにアップロードするようです。 「aws s3」の使用は私にとってはるかに高速でした。
Docker実行可能ファイル of s3s3mirror ツールを作成しました。 AWS S3バケットから別のバケットにコピーおよびミラーリングするユーティリティ。
スレッド化されており、並列COPYと非常にメモリ効率が高く、s3cmdが完全に失敗する場合に成功します。
使用法:
docker run -e AWS_ACCESS_KEY_ID=FOO -e AWS_SECRET_ACCESS_KEY=BAR pmoust/s3s3mirror [OPTIONS] source_bucket[/prefix] dest_bucket[/prefix]
オプションの完全なリストについては、次を試してください。
docker run pmoust/s3s3mirror
以下のドキュメントをご覧ください。それがあなたが探しているものだと思います。 http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTObjectCOPY.html
RightAws gemのS3Interfaceには、上記のコピー機能があります。
http://rubydoc.info/gems/right_aws/3.0.0/RightAws/S3Interface#copy-instance_method
あなたはおそらく今までに良い解決策を見つけたと思いますが、この問題に直面している他の人のために(私は最近)、S3バケットを別のS3バケットにミラーリングするための簡単なユーティリティを作成しました高度な並行性、しかもCPUとメモリの効率的な方法。
Apacheライセンスの下のgithubにあります: https://github.com/cobbzilla/s3s3mirror
非常に大きなバケットがあり、最大のパフォーマンスを求めている場合は、試してみる価値があります。
試してみることにした場合は、フィードバックがあればお知らせください。
シェルで、すべてのファイルではなく複数のファイルをコピーする場合:s3cmd cp --recursive s3:// BUCKET 1/OBJECT1 s3:// BUCKET 2 [/ OBJECT2]
S3バケットをバックアップするスクリプトを作成しました: https://github.com/roseperrone/aws-backup-rake-task
#!/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 __=='__main__':main()
これをrakeタスクで使用します(Railsアプリの場合):
desc "Back up a file onto S3"
task :backup do
S3ID = "AKIAJM3NRWC7STXWUWVQ"
S3KEY = "0A5kuzV+E1dkaPjZxHQAezz1GlSddJd0iS5sNpry"
SRCBUCKET = "primary-mzgd"
NUM_BACKUP_BUCKETS = 2
Dir.chdir("#{Rails.root}/lib/tasks")
system "./do_backup.py #{S3ID} #{S3KEY} #{SRCBUCKET} #{NUM_BACKUP_BUCKETS}"
end
aWS cliから https://aws.Amazon.com/cli/ できる
aws s3 ls
-これは、すべてのS3バケットをリストします
aws cp --recursive s3://<source bucket> s3://<destination bucket>
-これにより、あるバケットから別のバケットにファイルがコピーされます
注*クロスリージョンレプリケーションバケットを作成する際に非常に役立ちます。上記を実行すると、ファイルがすべて追跡され、ソースリージョンファイルの更新がレプリケートバケットに伝播されます。ファイルの削除以外はすべて同期されます。
CRRの場合、バケットでバージョン管理が有効になっていることを確認してください。
Javascriptに興味がある場合は、そのためのノードモジュールがあると聞きました:p
knox-copyドキュメントから:
knoxCopy = require 'knox-copy'
client = knoxCopy.createClient
key: '<api-key-here>'
secret: '<secret-here>'
bucket: 'backups'
client.copyBucket
fromBucket: 'uploads'
fromPrefix: '/nom-nom'
toPrefix: "/upload_backups/#{new Date().toISOString()}"
(err, count) ->
console.log "Copied #{count} files"
EMRクラスターでs3distcpを使用してこれを行うこともできることを知りました。大きなファイルを含むデータの場合は高速になるはずです。それは小さなデータセットで十分に機能しますが、非常に少ないデータをセットアップするために必要な学習曲線を考えると、別のソリューションをお勧めします(EMRを使用したことがありません)。
AWSドキュメントからのリンクは次のとおりです。 http://docs.aws.Amazon.com/ElasticMapReduce/latest/DeveloperGuide/UsingEMR_s3distcp.html
更新:同じデータセットの場合、s3s3mirrorはs3distcpまたはAWS cliよりもはるかに高速でした。セットアップもはるかに簡単です。
ローカルにダウンロードせずに、1つのS3バケットから同じまたは別のS3バケットにコピーするには、非常に簡単です。以下のシェルコマンドを使用します。
hdfs dfs -cp -f "s3://AccessKey:SecurityKey@ExternalBucket/SourceFoldername/*.*" "s3://AccessKey:SecurityKey@ExternalBucket/TargetFoldername"
これにより、ソースバケットのSourceFoldername
フォルダーからターゲットバケットのTargetFoldername
フォルダーにすべてのファイルがコピーされます。上記のコードで、AccessKey
、SecurityKey
およびExternalBucket
を対応する値に置き換えてください。
S3バケットをコピーする最良の方法は、AWS CLIを使用することです。
次の3つの手順が含まれます。
**https://docs.aws.Amazon.com/cli/latest/userguide/cli-chap-install.html**
2つのAWSアカウント間でバケットをコピーする場合、各バケットに正しいポリシーを添付する必要があります。
この後、このコマンドを使用して、あるバケットから別のバケットにコピーします。
aws s3 sync s3://sourcebucket s3://destinationbucket
ステップ2およびステップ3の詳細は、このリンクに記載されています。
https://aws.Amazon.com/premiumsupport/knowledge-center/account-transfer-s3/
aws s3 sync
cliコマンドはどうですか。 aws s3 sync s3:// bucket1/s3:// bucket2 /
Neel Bhaatがこの blog で説明したように、この目的に使用できる多くの異なるツールがあります。いくつかはAWSが提供し、ほとんどはサードパーティのツールです。これらのすべてのツールでは、AWSアカウントキーとシークレットをツール自体に保存する必要があります。サードパーティのツールを使用するときは非常に注意してください。保存した資格情報があなたに損害を与え、あなたの価値を完全に失い、あなたを失ってしまうかもしれません。
したがって、この目的には AWS CLI を使用することを常にお勧めします。 this link からインストールできます。次に、次のコマンドを実行し、AWS CLIでキーとシークレット値を保存します。
aws configure
そして、次のコマンドを使用して、AWS S3バケットをローカルマシンに同期します。 (ローカルマシンにAWS CLIがインストールされている必要があります)
aws s3 sync <source> <destination>
例:
1)AWS S3からローカルストレージの場合
aws s3 sync <S3Uri> <LocalPath>
2)ローカルストレージからAWS S3へ
aws s3 sync <LocalPath> <S3Uri>
3)AWS s3バケットから別のバケットへ
aws s3 sync <S3Uri> <S3Uri>