回答:
数百万は大きな数字です-後でそれについて説明します。
アプローチに関係なく、基礎となるメカニズムは、あるバケットから別のバケットに直接コピーする必要があります-この方法では(バケットが同じリージョンにあるため)、帯域幅に課金されません。他のアプローチは単純に非効率的です(たとえば、ファイルのダウンロードと再アップロード)。
バケット間のコピーは、「PUT copy」(「x-amz-copy-source」ヘッダーを含むPUTリクエスト)を使用して実行されます。これはCOPYリクエストとして分類されていると思います。これにより、ファイルとデフォルトで関連するメタデータがコピーされます。ACLを同時に設定する場合は、正しい値で「x-amz-acl」を含める必要があります(そうでない場合は、デフォルトでプライベートになります)。COPYリクエストに対して課金されます(1,000リクエストあたり$ 0.01)。不要なファイルは、コピー後に削除できます(DELETE要求は課金されません)。(オブジェクトがソースバケットから最初にフェッチされる必要があるため、COPYリクエストにもGETリクエストの料金が発生するかどうかは明確ではありません。その場合、料金は追加で$ 0.01 / 10,000になりますリクエスト)。
上記の料金はどうやら避けられないように見えます-100万個のオブジェクトについては、約10ドル(または11ドル)を見ています。最終的には宛先バケットにファイルを実際に作成する必要があるため、他のアプローチ(ファイルのtar gzip圧縮、Amazon Import / Exportなど)はこのコストを回避できません。それでも、転送するオブジェクトが数百万を超える場合は、Amazonに連絡する価値があるかもしれません。
上記の(避けられない価格)を考えると、次に検討すべきことは時間です。これは「数百万のファイル」をコピーするときの大きな要因になります。バケット間で直接コピーを実行できるすべてのツールには、同じ料金がかかります。残念ながら、ファイルごとに1つの要求(コピーするため)、削除するために1つの要求、ACLデータを読み取るために1つの要求が必要です(ファイルにさまざまなACLがある場合)。最高の速度は、ほとんどの並列操作を実行できるものであればどれからでも得られます。
非常に実行可能なコマンドラインアプローチがいくつかあります。
s3fsが機能する可能性がいくつかあります-非常に並列で、同じバケット間のコピーをサポートします-異なるバケット間のコピーはサポートしませんが、異なるバケット間の移動はサポートします。
s3cmd-modificationから始めて、成功したかどうかを確認するか、より良い解決策についてAmazonにお問い合わせください。
aws s3 sync s3://source s3://destination
収まりますか?
古いトピックですが、これは同じシナリオを調査している人向けです。20,000以上のオブジェクトのために、私がかかった時間とともに。AWS Linux / Centosで実行し、各オブジェクトはほとんどの部分が画像であり、ビデオやさまざまなメディアファイルもあります。
AWS CLIツールを使用してバケットAからバケットBにファイルをコピーします。
A.新しいバケットを作成する
$ aws s3 mb s3://new-bucket-name
B.古いバケットを新しいバケットと同期する
$ aws s3 sync s3://old-bucket-name s3://new-bucket-name
20,000以上のオブジェクトをコピーしています...
17:03開始
終了17:06
20,000以上のオブジェクトの合計時間=約3分
新しいバケットが正しく設定されたら、つまり、パーミッション、ポリシーなど、古いバケットを削除したいとします。
C.古いバケットを削除/削除する
$ aws s3 rb --force s3://old-bucket-name
あなたはおそらく今までに良い解決策を見つけたと思いますが、この問題に直面している他の人のために(私はちょうど最近でしたが)、私は特に高度な並行性、しかもCPUとメモリの効率的な方法。
https://github.com/cobbzilla/s3s3mirrorの Apacheライセンスの下にあるgithubにあります。
試してみることにした場合は、フィードバックがあればお知らせください。
--cross-account-copy
オプション(-C
略して)があります。アカウント間でコピーする場合、ACLはコピーされないことに注意してください。宛先バケットの所有者は、コピーされたデータに対する完全な権限を持ちます。
AWS CLIは、並列プロセスで1つのバケットを別のバケットにコピーする方法を提供します。https://stackoverflow.com/a/40270349/371699から取得:
次のコマンドは、AWS CLIに1,000個のスレッドを使用してジョブ(各小さなファイルまたはマルチパートコピーの一部)を実行し、100,000個のジョブを先読みするように指示します。
aws configure set default.s3.max_concurrent_requests 1000
aws configure set default.s3.max_queue_size 100000
これらを実行した後、次のように単純な同期コマンドを使用できます。
aws s3 sync s3://source-bucket/source-path s3://destination-bucket/destination-path
m4.xlargeマシン(AWS--4コア、16GB RAM)で、私の場合(3-50GBファイル)、同期/コピー速度は約9.5MiB / sから700 + MiB / sになり、速度が増加しましたデフォルト設定の70倍。