1. ホーム
  2. amazon-s3

[解決済み] S3バケット間でファイルを移動する最適な方法とは?

2023-01-14 19:24:02

質問

本番用バケットから開発用バケットに毎日ファイルをコピーしたいのですが、どうすればいいですか?

例えば 本番用バケット/フィード/フィード名/日付をコピーする をdevelopmentbucket/feed/feedname/dateにコピーする。

欲しいファイルがフォルダ構造の奥深くにあるため、各フォルダに移動してコピー&ペーストするのは時間がかかりすぎる。

各バケットにドライブをマウントし、Windows のバッチ スクリプトを書くという方法を試しましたが、これは非常に遅く、すべてのファイル/フォルダーを不必要にローカル サーバーにダウンロードし、再びバックアップすることになります。

どのように解決するのですか?

アップデート

として によって指摘され、alberge (+1) が指摘したように、現在では優れた AWSコマンドラインインターフェース は、AWS の (ほとんど) すべてを操作するための最も汎用的なアプローチを提供します - それは一方でほとんどのサービスの API をカバーし、さらに より高度な S3 コマンド あなたのユースケースを具体的に扱うには、S3コマンドを参照してください。 S3用AWS CLIリファレンス :

  • 同期 - ディレクトリとS3プレフィックスを同期します。 あなたのユースケースをカバーするのは 例2 (さらに細かい使い方は --exclude , --include や接頭辞の処理等も可能です)。

    以下のsyncコマンドは、s3オブジェクトをコピーすることで、指定したプレフィックスとバケット下のオブジェクトを、別の指定したプレフィックスとバケット下のオブジェクトに同期させるものです。[...]

    aws s3 sync s3://from_my_bucket s3://to_my_other_bucket
    
    

完全を期すために、この章で紹介した 下位レベルのS3コマンド を使用しても利用可能です。 s3api サブコマンドで利用可能で、SDKベースのソリューションをAWS CLIに直接変換し、最終的にはより高いレベルの機能を採用することができます。


最初の回答

S3バケット間のファイルの移動は、以下の方法で実現できます。 PUTオブジェクト - コピーAPI (その後に オブジェクトの削除 ):

このPUT操作の実装は、すでにAmazon S3に保存されているオブジェクトのコピー のコピーを作成します。PUTコピー操作は、GETしてからPUTするのと同じです。 GETを実行し、次にPUTを実行するのと同じです。リクエストヘッダを追加します。 x-amz-copy-sourceを追加すると、PUTオペレーションはソースオブジェクトを宛先バケットにコピーします。 コピー先のバケットにコピーします。 ソース

既存のすべてのAWS SDKについて、それぞれのサンプルが公開されています。 1回の操作でオブジェクトをコピーする . 当然ながら、スクリプトベースのソリューションが最初の選択肢となります。 AWS SDK for Rubyを使ったオブジェクトのコピー が良い出発点かもしれません。代わりにPythonを好むなら、同じことが ボット を通してももちろん実現できます。 copy_key() の中で、boto の S3 API ドキュメント .

PUT Object はファイルをコピーするだけなので、ファイルを削除するときは明示的に DELETE Object を介して明示的にファイルを削除する必要がありますが、バケツとファイル名を処理する全体的なスクリプトを用意すれば、それは別の数行で済みます (それぞれの例もあります。例えば リクエストごとに 1 つのオブジェクトを削除する ).