Amazon S3の特定の拡張子のファイルのコンテンツタイプを再帰的に変更する


12

(特に)静的.jsonファイルと.mdファイルを含むネストされた「フォルダー」構造を持つ大きなS3バケットがあります。これらのファイルはtext/plain、正しいapplication/jsonおよびではなく、S3によって提供されていますtext/markdown

バケットのデフォルトを更新して、新しいアップロードが正しいコンテンツタイプになるようにしました。

「ツリー」をたどり、特定の拡張子に一致するファイルのコンテンツタイプを更新する最良の方法は何ですか?

回答:


25

aws cliツールを使用してこれを行う方法の例を次に示します。cpツールでは再帰オプションを使用できますが、s3apiツールではできないと思います。この場合、私はたくさんのSVGを修正しています。解放する準備ができたら、--dryrunオプションを削除します。

aws s3 cp \
      --exclude "*" \
      --include "*.svg" \
      --content-type="image/svg+xml"  \
      --metadata-directive="REPLACE" \
      --recursive \
      --dryrun \
       s3://mybucket/static/ \
       s3://mybucket/static/

コマンドの基本概念を理解しています。しかし、これは置換ディレクティブであるため、ファイルのバージョンを削除しますか?バケットはバージョニングで構成されており、各ファイルにはいくつかのバージョンがあります。置換すると、すべてのバージョンが削除されて新しいファイルが作成されますか、または置換中にすべてのバージョンが考慮されますか?
ジョゼ

それは良い質問です。使い捨てバケツでテストする価値は間違いありません。私の希望は、メタデータだけを置換する要求がバージョンを吹き飛ばさないことですが、
...-t1m0

テストを行ったところ、バージョンはそのままですが、メタデータが変更されたバージョンが最新バージョンになり、古いバージョンには以前のメタデータがあります。私は...すべてのバージョンを一覧表示して、そのメタデータを修正する複雑なスクリプトを作成することなく、ある再帰的になりましたすべてのバージョンのメタデータを変更する方法を見つけることを試みている
JOZE

このコマンドはaclをリセットします。デフォルト以外の値が必要な場合は、追加します--acl=...
Vasiliy Zverev

3

boto / pythonまたは別のAWS APIを使用して手を汚したくない場合$ aws s3api copy-object--content-typeフラグを使用してオブジェクトを自分自身にコピーし、新しいコンテンツタイプを設定することをお勧めします。

これがs3api のドキュメントです。

言うまでもなく、バケット全体で再帰的に実行する前に、これを最初にテストする必要があります。


1
テストに関しては、Amazon CLIで「ドライラン」フラグを使用します。
バート

3

掘り下げた後、s3cmdツールでこれができることがわかりました。たとえば、JSONファイルをapplication / jsonに設定するには:

s3cmd --recursive modify --acl-public \
       --add-header='content-type':'application/json' \
       --exclude '' --include '.json' \
       s3://bucket/

3

前述のように、awsAmazonのツールを使用し、s3apiを使用してオブジェクトを自分自身にコピーし、使用metadata-directive=REPLACEしてコンテンツタイプを変更できます。

データベースに保存されているファイル名を繰り返し処理したい場合があるため、これをここに配置します。これは、cliを使用して実行する方法です。

aws s3api copy-object \
          --content-type="application/vnd.android.package-archive" \
          --metadata-directive="REPLACE" \
          --copy-source "MYBUCKET/FILE.apk" \
          --bucket "MYBUCKET" \
          --key "FILE.apk" \
          --acl public-read

これにより、1つのファイルのみが置き換えられます。.apkタイプのすべてのファイルに対してこのコマンドをどのように実行しますか?
バート

@bartは再帰的な方法についての私の答えを参照してください。
t1m0 16
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.