既存のファイルと将来のファイルの両方のs3バケット全体にcache-controlヘッダーを設定する必要があり、それをバケットポリシーで行うことを望んでいました。既存のものを編集できることは知っていますし、自分でアップロードする場合はそれらを指定する方法を知っていますが、残念ながらそれらをアップロードするアプリはそこにファイルをコピーするためにs3fsを使用するためヘッダーを設定できません。
これを行うには、3つの方法があります:AWSコンソール経由、コマンドライン経由、またはs3cmdコマンドラインツールを介して。
これが現在推奨されるソリューションです。簡単ですが、しばらく時間がかかります。
( @ biplobに感謝-彼にいくつかの愛を与えてください )
もともと、このバケットポリシーを作成したときは手間がかかりませんでしたので、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は「Amazon S3およびCloudFrontサービスを管理するためのコマンドラインツール」です。このソリューションにはgit pullが必要ですが、よりシンプルで包括的なソリューションかもしれません。
完全な手順については、 以下の@ ashishyadaveee11の投稿を参照
それが役に立てば幸い!
現在、AWSコンソールから簡単に変更できます。
バケットファイルによっては、実行に時間がかかります。誤ってブラウザを閉じてしまった場合は、最初からやり直してください。
ステップ
git clone https://github.com/s3tools/s3cmd
s3cmd --configure
を実行します(確認メールまたはAmazonアカウントページから2つのキーをコピーして貼り付けます。コピーするときは注意してください!大文字と小文字が区別されるため、正確に入力する必要があります。無効な署名などに関するエラーが引き続き発生します。キーにs3:ListAllMyBuckets
パーミッションを追加することを忘れないでください。そうしないと、アクセスのテスト中にAccessDenied
エラーが発生します。./s3cmd --recursive modify --add-header="Cache-Control:public ,max-age= 31536000" s3://your_bucket_name/
私の評判スコアが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
これをバケットレベルで指定できるとは思いませんが、いくつかの回避策があります。
コピー操作に適切なcache-control
ヘッダーを設定して、S3でオブジェクトをそれ自体にコピーします。
ファイルへのURLに応答ヘッダーを指定します。これを機能させるには、事前に署名されたURLを使用する必要がありますが、cache-control
やexpires
などの特定の応答ヘッダーをクエリ文字列に指定できます。利用可能なオプションの完全なリストについては、以下を参照してください: http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTObjectGET.html?r=5225
ダンの答えを使おうとしてエラーを受け取った人へ:
「不明なオプション:--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を使用しなければならなかったことです。
S3のPUTOBJECTでトリガーを使用してラムダをいつでも構成できます。ラムダは、置かれたこの特定のオブジェクトのヘッダーを変更するだけです。
次に、上記のcopyコマンドを最後に実行すると、すべての新しいオブジェクトがラムダによって修正されます。
ここから始めるのが良い場所です: https://www.aaronfagan.ca/blog/2017/how-to-configure-aws-lambda-to-automatically-set-cache-control-headers-on -s3-objects /