bugfix> amazon-web-services > 投稿

CloudFront TTL設定を介してCloudFrontがオリジンのオブジェクトを期限切れにするときと、呼び出しが無効になるときの実際の違いは何ですか?

回答 2 件
  • 一般的な考え方は、TTLを使用して、CloudFrontが使用するポリシーを設定し、個々のオブジェクトがオリジンとの対話なしでCloudFrontキャッシュから提供される可能性がある最大時間を決定することです。

    デフォルトTTL:関連する Cache-Control がない場合に、オブジェクトが古いと見なされることなくCloudFrontキャッシュに保持できる最大時間  ディレクティブはオリジンによって提供されます。 Cache-Control なし  ヘッダーはCloudFrontによってレスポンスに追加されます。

    最小TTL:オリジンがこれより小さいCache-Control:s-maxage値(または存在しない場合はCache-Control:max-age値)を提供する場合、CloudFrontはそれを無視し、オブジェクトをキャッシュ内に保持できると想定しますこれより長くありません。たとえば、最小TTLが900に設定されているが、応答に Cache-Control: max-age=300 が含まれている場合 、CloudFrontは300を無視し、最大900秒間オブジェクトをキャッシュできます。ザ・ Cache-Control  ヘッダーは変更されず、受信したとおりにビューアに返されます。

    最大TTL:オリジンが Cache-Control を提供する場合  オブジェクトをこれより長くキャッシュできることを示すディレクティブ。CloudFrontはディレクティブを無視し、オブジェクトが最大TTLを超えてキャッシュから提供され続けることはないと想定します。

    Amazon CloudFront開発者ガイドの「CloudFrontエッジキャッシュにオブジェクトを保持する期間の指定(有効期限)」を参照してください。

    そのため、これらの3つの値は、キャッシュされた応答が後続のビューアに返される「十分に新鮮」であるかどうかを判断するためにCloudFrontが使用するものを制御します。 TTLの有効期限が切れた後、CloudFrontがキャッシュされたオブジェクトをパージするという意味ではありません。代わりに、CloudFront五月 オブジェクトを保持しますが、最初にオリジンにリクエストを送信してオブジェクトが変更されたかどうかを確認するまで、有効期限を過ぎてオブジェクトを提供しません。

    CloudFrontは、期限切れになったオブジェクトの新しいバージョンの発生源を事前にチェックしません。キャッシュ内にある間に再度リクエストされ、期限切れになったと判断された場合にのみチェックします。これを行う場合、通常は If-Modfied-Since などのディレクティブを使用して条件付きリクエストを送信します 。これにより、元に 304 Not Modified に応答するオプションが与えられます。、CloudFrontにキャッシュされたオブジェクトがまだ使用可能であることを伝えます。

    時々表面化する誤解は、TTLがCloudFrontにオブジェクトをキャッシュする期間を指示することです。それはそうではありません。 CloudFrontにどれくらいの長さかを伝えます許可された オリジンに対する再検証なしで応答をキャッシュします。 CloudFront内のキャッシュストレージには関連料金がなく、定義によるキャッシュは一時的なものであるため、めったにリクエストされないオブジェクトは、TTLが期限切れになる前にキャッシュから削除される場合があります。

    If an object in an edge location isn't frequently requested, CloudFront might evict the object—remove the object before its expiration date—to make room for objects that have been requested more recently.

    https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/Expiration.html

    次のリクエストで、CloudFrontはオリジンからオブジェクトを再度リクエストします。

    もう1つの誤解は、CloudFrontのキャッシュがモノリシックであるということです。そうではありません。各グローバルエッジには独自の独立したキャッシュがあり、オブジェクトが要求されているエッジにオブジェクトをキャッシュします。各グローバルエッジには、オブジェクトも格納されるアップストリームリージョナルキャッシュ(最も近いEC2リージョン;リージョンごとに複数存在する可能性がありますが、文書化されていません)もあり、他の近くのグローバルエッジがオブジェクトを見つけることができます最も近いリージョナルキャッシュですが、CloudFrontはキャッシュされたオブジェクトを内部でそれ以上検索しません。パフォーマンスのために、キャッシュミスでオリジンに移動します。

    CloudFrontがリージョナルエッジキャッシュと連携する仕組みをご覧ください。

    無効化は完全に異なり、控えめに使用することを目的としています-最初の1000個の無効化のみパス AWSアカウントから毎月送信されるのは無料です。 (パスは多くのファイルと一致する可能性があり、パス /*  ディストリビューション内のすべてのファイルに一致します)。

    無効化リクエストには、無効化が作成されたときのタイムスタンプがあり、すべてのリージョンにメッセージを送信して、これらの行に沿って何かを行うよう指示します(正確なアルゴリズムは文書化されていませんが、これは正確に最終的な効果を説明します):

    ${path} に一致するファイルを削除します   ${timestamp} より前にキャッシュされた場合、キャッシュから  そして

    一方、それには時間がかかる可能性があるため、 ${path} に一致するファイルのリクエストを受け取った場合   ${timestamp} より前にキャッシュされたもの 、キャッシュファイルは使用できなくなるため、使用しないでください。

    無効化リクエストは、ネットワーク全体がメッセージを受信するとすぐに完了したとみなされます。無効化は、実際には存在しないファイルを無効にすることはエラーではないという意味で、本質的にi等のアクションです。無効化は、そのようなファイルを無効にするようエッジに指示しているためです。もし それらが存在します。

    これから、正しい行動方針はどちらかを選択することではなく、必要に応じて両方を使用することであることは明らかです。 TTLを設定し(または「オリジンキャッシュヘッダーを使用する」を選択し、適切な値で常に返すようにオリジンサーバーを構成します)、必要に応じて無効化を使用して、選択したコンテンツまたはすべてのコンテンツのキャッシュをパージします。エラーを起こしたか、サイトに大幅な変更を加えました。

    ただし、ベストプラクティスは、無効化に頼るのではなく、オブジェクトが変更されたときにキャッシュ無効化手法を使用することです。キャッシュの無効化とは、要求されている実際のオブジェクトを変更することです。たとえば、最も単純な実装では、新しい画像が必要なときに新しい画像を/pics/cat1.pngとして保存するのではなく、HTMLで/pics/cat1.pngを/pics/cat2.pngに変更することを意味します。同じURLで1つのファイルを別のファイルに置き換える際の問題は、ブラウザーにもキャッシュがあり、古いイメージが表示され続ける可能性があることです。

    オブジェクトの無効化も参照してください。

    また、メインTTLはエラー応答に使用されないことに注意してください。デフォルトでは、 404 Not Found のような応答  5分間キャッシュされます。これはエラーキャッシングの最小TTLであり、オリジンサーバーが、数分間だけ失敗し続ける可能性のあるリクエストを受信することを緩和するように設計されています。

  • 実際の違いを見ている場合:

    CloudFront TTL:CloudFrontが別のリクエストをオリジンに転送する前にオブジェクトがCloudFrontキャッシュに保持される時間を制御できます。

    無効化:エッジキャッシュからオブジェクトを無効化します。ビューアが次にオブジェクトを要求すると、CloudFrontはオリジンに戻り、オブジェクトの最新バージョンを取得します。

    主な違いは速度です。アプリケーションの新しいバージョンをデプロイする場合、すぐに無効化することができます。

あなたの答え