既存のファイルと将来のファイルの両方のs3バケット全体にキャッシュ制御ヘッダーを設定する必要があり、バケットポリシーで設定することを望んでいました。既存のものを編集できることはわかっています。自分でアップロードする場合は、プットでそれらを指定する方法を知っていますが、残念ながら、それらをアップロードするアプリは、s3fsを使用してそこにファイルをコピーするため、ヘッダーを設定できません。
10 に答える
これを行うには、AWS コンソール経由、コマンドライン経由、またはs3cmd コマンドライン ツール経由の3 つの方法があります。
AWS コンソールの説明
これが現在推奨されるソリューションです。簡単ですが、時間がかかる場合があります。
- AWS マネジメント コンソールにログインします。
- S3バケットに入る
- ルートごとにすべてのファイルを選択
- メニューから「その他」を選択
- 「メタデータの変更」を選択
- [キー] フィールドで、ドロップダウン メニューから [Cache-Control] を選択します max-age=604800 [値] に (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
詳細情報が必要な場合は、マニュアルへのリンクを次に示します。
- http://docs.aws.amazon.com/cli/latest/userguide/using-s3-commands.html
- http://docs.aws.amazon.com/cli/latest/reference/s3/cp.html#options
既知の問題点:
"Unknown options: --metadata-directive, REPLACE"
これは、古い awscli が原因である可能性があります。以下の @eliotRosewater の回答を参照してください。
S3cmd ツール
S3cmd は、「Amazon S3 および CloudFront サービスを管理するためのコマンドライン ツール」です。このソリューションには git pull が必要ですが、よりシンプルで包括的なソリューションになる可能性があります。
詳細な手順については、以下の @ashishyadaveee11 の投稿を参照してください。
それが役に立てば幸い!
これをバケット レベルで指定することはできないと思いますが、いくつかの回避策があります。
cache-control
コピー操作に適切なヘッダーを設定して、S3でオブジェクトをそれ自体にコピーします。ファイルへの URL に応答ヘッダーを指定します。これを機能させるには、事前に署名された URL を使用する必要がありますが、クエリ文字列で特定の応答ヘッダーを指定でき
cache-control
ますexpires
。利用可能なオプションの完全なリストについては、http: //docs.amazonwebservices.com/AmazonS3/latest/API/RESTObjectGET.html?r=5225を参照してください。
S3 の PUTOBJECT でトリガーを使用してラムダをいつでも構成できます。ラムダは、配置されたばかりのこの特定のオブジェクトのヘッダーを変更するだけです。
次に、上記のコピー コマンドを最後にもう一度実行すると、すべての新しいオブジェクトがラムダによって修正されます。
アップデート:
ここから始めるのが良い場所です: https://www.aaronfagan.ca/blog/2017/how-to-configure-aws-lambda-to-automatically-set-cache-control-headers-on-s3-objects /
ダンの答えを使用しようとしてエラーが発生した場合:
「不明なオプション: --metadata-directive、REPLACE」
問題が発生しました。問題は、awscli を使用してインストールしたことです。
sudo apt-get インストール 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 を使用する必要があったことです。これは、他のユーザーが遭遇する可能性のあるアクセス許可の問題のためです。
以前の回答が私を誤解させたので、使用法を共有したいと思いました。AWS CLI での 2 つのコマンドのみ:
aws s3 cp s3://bucketname/ s3://bucketname/ --cache-control max-age=12345 --recursive
cpを使用して、既存のものについては以上です。そのような設定--cache-control
は有効なオプションです。
アップロードしている場合は、syncを使用することもできます。コマンドは次のとおりです。
aws s3 sync z:\source\folder s3://bucketname/folder --delete --cache-control max-age=12345 --acl public-read
まったく使用していないことに注意して--metadata-directive
ください。これを使用すると、推測したコンテンツ タイプが失われ、画像のようなものがブラウザに表示されず、すぐにダウンロードされるからです。私のソリューションは、推測された値を保持し、同期による推測を可能にします。