S3 Originを使用したAWS CloudFrontからのファイルのCache-Controlヘッダーなし


27

Amazon AWSに移行しました。現在、うまく機能しているEC2インスタンスがあります。Nginxをフロントで、Apacheをバックエンドで実行しています。それもうまくいっています。すべてのサイトが適切に起動され、EC2から提供されるファイルのCache-Controlヘッダーが含まれます。

問題は、CloudFront CDNを介してアクセスされるAmazon S3に配置したすべての静的ファイルにあります。ファイルには問題なくアクセスできます(CORSには問題ありません)が、どうやら CloudFrontはCache-Controlヘッダーを持つファイルを提供しないようです。ブラウザのキャッシングを活用したい。

静的ファイルはS3 + CloudFrontによって直接処理されるため、EC2インスタンスはここでは役割を果たしません。リクエストはEC2のWebサーバーに送信されません。

私は完全に失われました。

質問:1)この場合、Cache-Controlを設定するにはどうすればよいですか?2)Cache-Controlを設定することはできますか?S3またはCloudFrontからですか?

注:個々のオブジェクトにS3でヘッダーを設定できるGoogleのいくつかのページにアクセスしました。私の場合はいくつかのオブジェクトについて話しているので、それは特別にそれを行うための生産的な方法ではありません。

ありがとう!


S3のオブジェクトのURLと、該当するCloudFront URLを投稿してください。あなたが自分自身を説明する行動を見たいです。両方のCURLを交互に投稿し、ヘッダーを表示します。
ティム

console.aws.amazon.com/cloudfront/homeで originを編集して、カスタムヘッダー「Expires:Sun、15 Oct 2027 13:46:07 GMT」を追加できました。しかし、うまくいかないようです。どうやってやったの?
マノロ

回答:


31

Googleでいくつかのページにアクセスして、個々のオブジェクトにS3のヘッダーを設定できます。私の場合はいくつかのオブジェクトについて話しているので、それは特別にそれを行うための生産的な方法ではありません。

まあ、「生産的」であるかどうかは、それが実際に動作するように設計されている方法です。

CloudFrontはヘッダーを追加 しませんCache-Control:

CloudFrontのは、通過 (特に構成しない限り、また点)Cache-Control:、この場合、S3であるオリジンサーバによって提供ヘッダー。

Cache-Control:オブジェクトの取得時にS3が提供するヘッダーを取得するには、オブジェクトがS3にアップロードされるか、後続のput + copy操作によってオブジェクトのメタデータに追加されるときにヘッダーを提供する必要があります。 S3、プロセスのメタデータを変更します。これは、オブジェクトメタデータを編集した場合に、舞台裏でコンソールが行うことです。

また、S3には、バケット内のすべてのオブジェクトにこれらのヘッダーを強制的に返すグローバル設定はありません(これは不思議な場合です)。これはオブジェクトごとの属性です。


更新: Lambda @ EdgeはCloudFrontの新機能であり、ビューアーとキャッシュの間、および/またはキャッシュとオリジンの間で、単純なリクエスト/レスポンスオブジェクト構造に対してNode.jsで記述されたコードを実行して、リクエストおよび/またはレスポンスに対してトリガーを起動できますCloudFrontによって公開されます。

この機能の主なアプリケーションの1つはヘッダーの操作です...そのため、上記はまだ正確ですが(CloudFront自体は追加しません)Cache-Control、CloudFrontから返される応答にLambda関数を追加することが可能になりました。

この例は、応答にヘッダーが既に存在しCache-Control: public, max-age=86400ない場合にのみ追加されますCache-Control

Origin Responseトリガーでこのコードを使用すると、CloudFrontがオリジンからオブジェクトをフェッチするたびにトリガーされ、CloudFrontがキャッシュする前にレスポンスを変更します。

'use strict';

exports.handler = (event, context, callback) => {
    const response = event.Records[0].cf.response;

    if(!response.headers['cache-control'])
    {
        response.headers['cache-control'] = [{ 
            key:   'Cache-Control', 
            value: 'public, max-age=86400' 
        }];
    }

    callback(null, response);
};

更新(2018-06-20):最近、機能リクエストをCloudFrontチームに送信して、静的リクエストヘッダーを追加できる方法と同様に、静的オリジンレスポンスヘッダーをオリジン属性として設定できるようになりました...ツイスト、各ヘッダーを条件付きで追加するように設定できるようにする(オリジンが応答でそのヘッダーを提供しなかった場合のみ)または無条件で追加する(ヘッダーを追加し、存在する場合はそのオリジンからヘッダーを上書きする)

機能のリクエストでは、通常、彼らが実際に新しい機能の実装を検討しているかどうかの確認を受け取りません...または、すでに機能していたかもしれないかどうかさえ...完了時に発表されます。したがって、これらが実装されるかどうかはわかりません。この機能はLambda @ Edgeを介して既に利用可能であるため、基本機能には必要ないという議論があります...しかし、私の反論は、基本機能は機能なしでは機能完全ではないということですシンプルで静的な応答ヘッダー操作を実行し、これがトリガーが必要な唯一の理由である場合、Lambdaトリガーを必要とすることは不必要なコストであり、財政的および追加のレイテンシーです(どちらも必ずしも異常なコストではありませんが)。


それはまだ迷惑です。
エリカケイン


1
多田、確かに、@ Kunal。これは、答えで「後続のput + copy操作によってオブジェクトのメタデータに追加された」と言った例です警告があるため、慎重に使用し、テストしてください。すべての日付スタンプがリセットされ、暗号化に影響する場合があります。また、オブジェクトのetagをマルチパートからシングルパート形式に変更することもありますが、これは別のアルゴリズムであり、将来の整合性チェックのためにetagを他の場所に保存したシステムを混乱させます。バケットでバージョン管理が有効になっている場合、古いバージョンをクリーンアップしない限り、ストレージコストは2倍になります。
マイケル-sqlbot

1
新しいLambda @ Edgeサービスは、Cache-Control応答ヘッダー(特に)をオンザフライで追加できるメカニズムも提供するようになりました。私はそれをどのように行うかの実例で答えを更新しました。
マイケル-sqlbot

1
@Broshiロールの「信頼ポリシー」は、ラムダサービスとエッジラムダサービスの両方をリストする必要があります。見てくださいdocs.aws.amazon.com/lambda/latest/dg/...を
マイケル-sqlbot
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.