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


123

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

回答:


208

これを行うには、AW​​Sコンソールコマンドライン、またはs3cmdコマンドラインツールの 3つの方法があります


AWSコンソールの手順

これが現在推奨されるソリューションです。簡単ですが、時間がかかる場合があります。

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

@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

バケット全体(--recursiveフラグに注意):

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の投稿を参照してください


それが役に立てば幸い!


6
正確に何をすべきかの実際の例をありがとう。ドキュメントを読むだけで何が可能かを見つけるのに苦労しました。
danneu 2015年

2
上記のいずれかのコマンドを実行すると、「不明なオプション:--metadata-directive、REPLACE」が表示されます。助けてください。
user3722785 2016

1
より簡単な方法が今あることに注意してください。AWSコンソールを介してバケット内のすべてのファイルのメタデータを変更できるようになりました。下記を参照してくださいCoderBoyの答え:stackoverflow.com/a/47072736/2538952
マーティンTschammer

1
--meta-directive REPLACEを使用すると、コマンドでコピーされなかった以前のメタデータが上書きされます。たとえば、「content-encoding gzip」は、cpコマンドに明示的に追加しないと削除されます。
Harmen Janssen

1
cp、ダウンロードと再アップロードすべてを?
mlissner

37

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

  • AWSマネジメントコンソールにログイン
  • S3バケットに入る
  • ルートごとにすべてのファイルを選択
  • メニューから[もっと見る]を選択します
  • 「メタデータの変更」を選択します
  • [Key]フィールドで、ドロップダウンメニューから[Cache-Control]を選択します
  • 値にmax-age = 604800Enter(7日)
  • 「保存」ボタンを押します

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


6
「すべてのファイルをルートで選択する」とはどういう意味ですか?
Tamzin Blake 2018

1
メタを設定するディレクトリからすべて/一部のファイルを選択します
biplob

返事が遅れて申し訳ありません。いいえ、ありません。アプリケーションから設定する必要があります。
biplob

これは以前のメタデータを置き換えますか、それとも追加しますか?(すべてのコンテンツタイプを失いたくない!)
Chris

既存の値が削除されないことを確認しました。指定したキーのみを設定します(存在する場合はキーを上書きします)
rynop

21

ステップ

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

超解答。ありがとうございました!このヘッダー設定がまだないもののみを更新する方法はありますか?
PKHunter 2017

誰かがウィンドウのS3Expressで使用するための同様のソリューションを持っていますか?
Joe

12

私の評判スコアが50を超えていたら、コメントします。しかし、それは(まだ)ではないので、ここで別の完全な答えを示します。


私はしばらくの間、この問題に頭を悩ませてきました。ドキュメントを見つけて読むまで。他の人を助ける場合に備えて、ここでそれを共有します。

結局、私のために確実に機能したのは、このコマンドでした。期待される結果を確認するために、テストに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 REPLACEcp」が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

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

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

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


Geoffに感謝します。(1)については知っていましたが、(2)については知りませんでした。私が望んでいたものではありません(それは不可能ではないかと恐れていますが)
thattommyhall

#1の実行方法に関するAWS CLIコマンドの例はありますか? docs.aws.amazon.com/cli/latest/reference/s3/cp.html
dpegasusm

3

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

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

更新:

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


このランバの作り方についてもう少し詳しく教えてもらえますか?素晴らしいソリューションのように聞こえます。
Wouter 2017

1
@Wouter確かに、実際に簡単にアクセスできるリンクを見つけました。aaronfagan.ca/ blog / 2017 /… ヘルプやサポートが必要な場合は、喜んでお手伝いさせていただきます。
Ibrahim Bou Ncoula 2017

私はこれが古いことを知っていますが、このリソースは私が探していたものに役立つことがわかりました。これありがとう。私の男のためにあなたに賛成投票!
castaway2000 2018

1

ダンの答えを使用しようとしてエラーが発生した場合:

「不明なオプション:--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を使用しなければならなかったことです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.