web-dev-qa-db-ja.com

最小コストで2つのS3バケット間でファイルを移動するにはどうすればよいですか?

Amazon S3バケットに数百万のファイルがあり、これらのファイルを他のバケットやフォルダーに最小コストで、または可能であれば無料で移動したいと考えています。すべてのバケットが同じゾーンにあります。

どうすればできますか?

45
Daniel Cukier

何百万人というのは大きな数です-後でまた戻します。

アプローチに関係なく、基盤となるメカニズムはバケット間で直接コピーする必要があります。この方法では(バケットが同じリージョンにあるため)帯域幅の料金は発生しません。他のアプローチはすべて非効率的です(たとえば、ファイルのダウンロードと再アップロード)。

バケット間のコピーは、「PUTコピー」を使用して実行されます。つまり、「x-amz-copy-source」ヘッダーを含むPUTリクエストです。これはCOPYリクエストとして分類されると思います。これにより、ファイルとデフォルトで関連するメタデータがコピーされます。同時にACLを設定する場合は、正しい値で「x-amz-acl」を含める必要があります(そうしないと、デフォルトでプライベートになります)。 COPYリクエストに対して請求されます(1,000リクエストあたり0.01ドル)。不要になったファイルは、コピー後に削除できます(DELETEリクエストは課金されません)。 (私が明確にしていない点の1つは、オブジェクトが最初にソースバケットからフェッチされる必要があるため、COPYリクエストでもGETリクエストの料金が発生するかどうかです。発生した場合、追加料金は$ 0.01/10,000になります。リクエスト)。

上記の料金は一見避けられないようです-100万個のオブジェクトについて、およそ10ドル(または11ドル)です。最終的には宛先バケットにファイルを実際に作成する必要があるため、他のアプローチ(ファイルのtar-gzip圧縮、Amazon Import/Exportなど)ではこのコストを回避できません。それでもなお、転送するオブジェクトが200万を超える場合は、Amazonに連絡する価値があります。

上記(避けられない価格)を考えると、次に検討すべきことは時間です。これは「数百万のファイル」をコピーするときに大きな要因になります。バケット間で直接コピーを実行できるすべてのツールは、同じ料金が発生します。残念ながら、ファイルごとに1つの要求(コピーする)、削除する1つの要求、およびACLデータを読み取る1つの要求(ファイルにさまざまなACLがある場合)が必要です。最高の速度は、最も並列操作を実行できるものから得られます。

かなり実行可能なコマンドラインアプローチがいくつかあります。

  • s3cmd-modification (その特定のプルリクエスト)には、cpおよびmvの並列コマンドが含まれており、適切なオプションです。
  • AWSコンソールはコピーを直接実行できますが、それがどれほど並列であるかについて話すことはできません。
  • Tim Kayのaws スクリプトはコピーを実行できますが、これは並列ではありません-必要なフルコピーを実行するには、スクリプトでスクリプトを作成する必要があります(この場合はおそらく最適なオプションではありません)。素晴らしいスクリプト)。
  • CloudBerry S3 ExplorerBucket Explorer 、および CloudBuddy はすべて、タスクを実行できるはずですが、それぞれの効率はわかりません積み上げます。ただし、これらのほとんどのマルチスレッド機能にはソフトウェアの購入が必要だと思います。
  • 利用可能なSDKの1つを使用して、独自のスクリプトを作成します。

S3fsが機能する可能性がいくつかあります-非常に並列で、同じバケット間のコピーをサポートします-異なるバケット間のコピーをサポートしませんが、 might 異なるバケット間の移動をサポートします。

私はs3cmd-modificationから始めて、成功するかどうかを確認するか、より良い解決策についてAmazonにお問い合わせください。

55
cyberx86

古いトピックですが、これは同じシナリオを調査する人のためのものです。 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
9
user1360528

それが最善のアプローチかどうかはわかりませんが、AWS管理コンソールには切り取り/コピー/貼り付け機能があります。非常に使いやすく、効率的です。

5
Itikos Kleinos

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

これらを実行した後、次のように単純なsyncコマンドを使用できます。

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倍。

4
timetofly

私はあなたがおそらく今までに良い解決策を見つけたと想像しますが、この問題に遭遇している他の人のために(ちょうど最近だったように)、あるS3バケットを別のS3バケットにミラーリングする目的で特に簡単なユーティリティを作成しました非常に並行性がありながら、CPUとメモリの効率的な方法。

これはApacheライセンスの下のgithubにあります: https://github.com/cobbzilla/s3s3mirror

試してみることにした場合は、フィードバックがありましたらお知らせください。

3
cobbzilla

失われたバケットで、別のバケットにコピーするファイルを選択します。

  • [アクション]で[コピー]を選択します。
  • 獲得バケットに移動します。
  • [アクション]で[貼り付け]を選択します
0
john