web-dev-qa-db-ja.com

S3バケット全体のキャッシュ制御を自動的に設定します(バケットポリシーを使用しますか?)

既存のファイルと将来のファイルの両方のs3バケット全体にcache-controlヘッダーを設定する必要があり、それをバケットポリシーで行うことを望んでいました。既存のものを編集できることは知っていますし、自分でアップロードする場合はそれらを指定する方法を知っていますが、残念ながらそれらをアップロードするアプリはそこにファイルをコピーするためにs3fsを使用するためヘッダーを設定できません。

101
thattommyhall

これを行うには、3つの方法があります:AWSコンソール経由コマンドライン経由、またはs3cmdコマンドラインツールを介して


AWSコンソールの手順

これが現在推奨されるソリューションです。簡単ですが、しばらく時間がかかります。

  • AWSマネジメントコンソールにログインします
  • S3バケットに移動します
  • ルートごとにすべてのファイルを選択する
  • メニューから「その他」を選択します
  • 「メタデータの変更」を選択します
  • [キー]フィールドで、ドロップダウンメニューから[キャッシュコントロール]を選択しますmax-age = 604800ValueにEnter(7 days)
  • 「保存」ボタンを押します

@ biplobに感謝-彼にいくつかの愛を与えてください


AWSコマンドラインソリューション

もともと、このバケットポリシーを作成したときは手間がかかりませんでしたので、aws-cliを使用してそれを行う方法を考えましたが、非常に滑らかです。調査中に、私は実例が見つからなかったので、困っている人を助けるために自分の解決策をいくつか投稿すると思いました。

注:デフォルトでは、aws-cliは、新しいメタデータを指定した場合でも、ファイルの現在のメタデータのみをコピーします。

コマンドラインで指定されたメタデータを使用するには、「-metadata-directive REPLACE」フラグを追加する必要があります。以下に例を示します。

単一ファイルの場合

aws s3 cp s3://mybucket/file.txt s3://mybucket/file.txt --metadata-directive REPLACE \
--expires 2034-01-01T00:00:00Z --acl public-read --cache-control max-age=2592000,public

バケット全体の場合(-再帰フラグに注意):

aws s3 cp s3://mybucket/ s3://mybucket/ --recursive --metadata-directive REPLACE \
--expires 2034-01-01T00:00:00Z --acl public-read --cache-control max-age=2592000,public

特定のファイルタイプにのみ適用する場合は、すべてのファイルを除外してから必要なファイルを含める必要があります。

jpgとpngのみ:

aws s3 cp s3://mybucket/ s3://mybucket/ --exclude "*" --include "*.jpg" --include "*.png" \
--recursive --metadata-directive REPLACE --expires 2034-01-01T00:00:00Z --acl public-read \
--cache-control max-age=2592000,public

詳細が必要な場合は、マニュアルへのリンクをいくつかご紹介します。

既知の問題:

"Unknown options: --metadata-directive, REPLACE"

これは、古いawscliによって引き起こされる可能性があります- @ eliotRosewaterの以下の回答 を参照してください


S3cmdツール

S3cmdは「Amazon S3およびCloudFrontサービスを管理するためのコマンドラインツール」です。このソリューションにはgit pullが必要ですが、よりシンプルで包括的なソリューションかもしれません。

完全な手順については、 以下の@ ashishyadaveee11の投稿を参照


それが役に立てば幸い!

161
Dan Williams

現在、AWSコンソールから簡単に変更できます。

  • AWSマネジメントコンソールにログインします
  • S3バケットに移動します
  • ルートごとにすべてのファイルを選択する
  • メニューから「その他」を選択します
  • 「メタデータの変更」を選択します
  • [キー]フィールドで、ドロップダウンメニューから[キャッシュコントロール]を選択します。
  • max-age = 604800Valueに入力(7日)
  • 「保存」ボタンを押します

バケットファイルによっては、実行に時間がかかります。誤ってブラウザを閉じてしまった場合は、最初からやり直してください。

28
biplob

ステップ

  1. git clone https://github.com/s3tools/s3cmd
  2. s3cmd --configureを実行します(確認メールまたはAmazonアカウントページから2つのキーをコピーして貼り付けます。コピーするときは注意してください!大文字と小文字が区別されるため、正確に入力する必要があります。無効な署名などに関するエラーが引き続き発生します。キーにs3:ListAllMyBucketsパーミッションを追加することを忘れないでください。そうしないと、アクセスのテスト中にAccessDeniedエラーが発生します。
  3. ./s3cmd --recursive modify --add-header="Cache-Control:public ,max-age= 31536000" s3://your_bucket_name/
20

私の評判スコアが50を超えていたら、ただコメントしたいと思います。しかし、(まだ)そうではないので、もう1つの完全な答えがあります。


私はしばらくの間、この問題に頭を打ち続けてきました。ドキュメントを見つけて読むまで。他の人に役立つ場合に備えて、ここで共有してください:

私にとって確実に機能するようになったのは、このコマンドでした。予想される結果を確認するために、テストに1秒の有効期限を選択しました。

aws s3 cp \
  --metadata-directive REPLACE \
  --cache-control max-age=1,s-maxage=1 \
  s3://bucket/path/file \
  s3://bucket/path/file
  • --metadata-directive REPLACEは、「cp」がS3の既存のファイルのメタデータを変更するときに必要です
  • max-ageはブラウザのキャッシュ期間を秒単位で設定します
  • s-maxageはCloudFrontキャッシュを秒単位で設定します

同様に、S3へのアップロード中にファイルにこれらのCache-Controlヘッダー値を設定すると、コマンドは次のようになります。

aws s3 cp \
  --cache-control max-age=1,s-maxage=1 \
  /local/path/file \
  s3://bucket/path/file
8
roens

これをバケットレベルで指定できるとは思いませんが、いくつかの回避策があります。

  1. コピー操作に適切なcache-controlヘッダーを設定して、S3でオブジェクトをそれ自体にコピーします

  2. ファイルへのURLに応答ヘッダーを指定します。これを機能させるには、事前に署名されたURLを使用する必要がありますが、cache-controlexpiresなどの特定の応答ヘッダーをクエリ文字列に指定できます。利用可能なオプションの完全なリストについては、以下を参照してください: http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTObjectGET.html?r=5225

7
Geoff Appleford

ダンの答えを使おうとしてエラーを受け取った人へ:

「不明なオプション:--metadata-directive、REPLACE」

私は問題に遭遇し、問題は私が使用してawscliをインストールしたことでした

Sudo apt-get install awscli

これにより、--metadata-directiveコマンドが欠落しているawscliの古いバージョンがインストールされました。そこで、Sudo apt-get remove awscliを使用して削除しました。

次に、Amazonの手順に従って再インストールします。 http://docs.aws.Amazon.com/streams/latest/dev/kinesis-tutorial-cli-installation.html

唯一の違いは、他の人も遭遇する可能性のある許可の問題のために、Sudo -Hを使用しなければならなかったことです。

1
eliotRosewater

S3のPUTOBJECTでトリガーを使用してラムダをいつでも構成できます。ラムダは、置かれたこの特定のオブジェクトのヘッダーを変更するだけです。

次に、上記のcopyコマンドを最後に実行すると、すべての新しいオブジェクトがラムダによって修正されます。

更新:

ここから始めるのが良い場所です: https://www.aaronfagan.ca/blog/2017/how-to-configure-aws-lambda-to-automatically-set-cache-control-headers-on -s3-objects /

1