最小コストで2つのS3バケット間でファイルを移動する方法は?


44

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

どうすればいいですか?

回答:


53

数百万は大きな数字です-後でそれについて説明します。

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

バケット間のコピーは、「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がある場合)。最高の速度は、ほとんどの並列操作を実行できるものであればどれからでも得られます。

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

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

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

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


バケットエクスプローラーはうまく機能しているようです(現時点では2つのバケット間でファイルを移動しています)
Noodles

3
どこにaws s3 sync s3://source s3://destination収まりますか?
オリビエラロンド

7

古いトピックですが、これは同じシナリオを調査している人向けです。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

救世主。300 GB以上をコピーしています。ヒント:同じ地域のバケットからコピーする場合は、別の地域よりもはるかに高速です(そして、私はその安価を読んでいます)。
マルセロアギモヴェル

私はあなたの方法に問題がありました:ファイルのプライバシーはすべてプライベートに設定されており、ほとんどのオブジェクトがパブリックであっても、何が起こったのですか?
マルセロアギモヴェル

5

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


6
100万個のファイルではうまく機能しない可能性があります。
ジェームズ

@Jamesは痛いことを確認することができます。)
ロブ・

3

あなたはおそらく今までに良い解決策を見つけたと思いますが、この問題に直面している他の人のために(私はちょうど最近でしたが)、私は特に高度な並行性、しかもCPUとメモリの効率的な方法。

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

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


私はs3s3mirrorで素晴らしい経験をしました。m1.small EC2ノードにセットアップし、約2時間で150万個のオブジェクトをコピーすることができました。MavenとJavaに慣れていないため、セットアップは少し大変でしたが、Ubuntuでapt-getコマンドをいくつか実行するだけですべてがインストールされました。最後のメモ:(私のように)大きくて重要なs3バケットで不明なスクリプトを実行することが心配な場合は、コピー元バケットで読み取り専用アクセス権を持つ特別なユーザーを作成し、それらの資格情報を使用します。偶発的な削除のゼロチャンス。
ミカ

これは異なるアカウント間のバケットに適用できますか?
オリバーバーデキン

@OliverBurdekinはい、これを行う--cross-account-copyオプション(-C略して)があります。アカウント間でコピーする場合、ACLはコピーされないことに注意してください。宛先バケットの所有者は、コピーされたデータに対する完全な権限を持ちます。
cobbzilla

ありがとう@rfcreaderどうすればこのコストを見積もることができますか?私はAWSのコスト計算機を知っていますが、gets puts lsリクエストなどの数の点でこのプロセスが何を含むのか分かりません。AWSサポートは「リクエスターが支払う」ことを提案しました。ハ!
オリバーバーデキン

@OliverBurdekin s3s3mirrorは、タイプ(GET、COPY、DELETEなど)ごとにAWSリクエストの数を追跡します。これらの統計は、実行時に定期的に出力され、最後に1回出力されます。オブジェクトの小さなサブセットをコピーするために制限/テストを実行できます。これにより、データセット全体をコピーするために必要なリクエストの合計数を把握できます。
cobbzilla

2

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


0

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

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

1
なぜ他の人が1年前に言及した解決策を繰り返すのですか?
ベンジャミン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.