CloudFront ディストリビューションでカスタムオブジェクトキャッシングを設定しました。ディストリビューションがオリジンのキャッシュ設定を使用しているのはどうしてですか?

所要時間2分
0

Amazon CloudFront ディストリビューションでキャッシュ動作の [object caching] を [Customize] に設定しているのにかかわらず、ディストリビューションはオリジンのキャッシュ設定を使用したままです。どうすれば解決できますか?

簡単な説明

オブジェクトキャッシングをカスタマイズする場合は、[Default TTL]、[Minimum TTL]、および [Maximum TTL] を設定します。CloudFront はオリジンがキャッシングヘッダーを返すかどうかに基づいて、これらのパラメーターを使用します。

  • オリジンがキャッシングヘッダー,を返さない場合は、ディストリビューションはデフォルト TTL を使用します。
  • オリジンが最小 TTL を下回るキャッシングヘッダーを返す場合は、ディストリビューションは最小 TTL を使用します。。
  • オリジンが最大 TTL を上回るキャッシングヘッダーを返す場合は、ディストリビューションは最大 TTL を使用します。

注: クライアントに対するレスポンスには、CloudFront が最小 TTL または最大 TTL に基づいてレスポンスをキャッシュする場合であっても、オリジンのキャッシングヘッダーが含まれます。オリジンのキャッシングヘッダーは、ブラウザやプロキシのようなプライベートキャッシュにも使用される場合があります。

CloudFront ディストリビューションがキャッシュ動作で設定したカスタム値に基づいてキャッシュしない場合は、オリジンを確認します。オリジンからのキャッシングヘッダーで競合が発生していないかを検証してください。

解決方法

オリジンのキャッシングヘッダーが使用しているディストリビューションのカスタムオブジェクトキャッシングと競合しないか検証するには、発生している問題に基づいて、以下の指示に従ってください。

最小 TTL およびデフォルト TTL が 0 に設定されているのに、依然として CloudFront からヒットがある

リクエスト URI が、最小 TTL およびデフォルト TTL が 0 に設定されたキャッシュ動作パスに一致しているときでも CloudFront からヒットがある場合は、CloudFront からのレスポンスを確認します。レスポンスが X-Cache ヘッダーを「Hit from cloudfront」または「RefreshHit from cloudfront」と示しているかどうかを確認します。

< HTTP/1.1 200 OK
< Content-Type: text/html
< Content-Length: 437
< Connection: keep-alive
< Date: Sat, 03 Feb 2018 19:26:45 GMT
< Last-Modified: Sat, 03 Feb 2018 19:25:24 GMT
< ETag: "example12345abcdefghijklmno54321"
< Cache-Control: max-age=300, Public
< Accept-Ranges: bytes
< Server: AmazonS3
< Age: 14
< X-Cache: Hit from cloudfront

X-Cache ヘッダーが「Hit from cloudfront」または「RefreshHit from cloudfront」であった場合は、リクエストはエッジロケーションのキャッシュから発生したことになります。

レスポンスの残りの Cache-Control、Expires および Age ヘッダーを確認します。Cache-Control および Expires ヘッダーは、中間 (CloudFront) キャッシュまたはプライベート (ブラウザ) キャッシュにリクエストの保存方法を伝える動作キャッシングヘッダーです。Age ヘッダーはレスポンスがキャッシュされる時間を示します。

Cache-Control の max-age 値が Age の値を上回る場合は、キャッシュされたレスポンスは新しいものとみなされ、エッジロケーションから発生したことになります。Expires の日付が将来の日付である場合にも、キャッシュされたレスポンスは新しいものとみなされます。これは、キャッシュ動作パスが最小 TTL およびデフォルト TTL を 0 に設定されている場合であっても、発生します。

最大 TTL およびデフォルト TTL が 0 を上回っているのに、CloudFront からミスが生じる

リクエスト URI が、最大 TTL およびデフォルト TTL が 0 を上回る値に設定されたキャッシュ動作パスに一致しているときでも CloudFront からミスが発生する場合は、CloudFront からのレスポンスを確認します。レスポンスが X-Cache ヘッダーを「Miss from cloudfront」と示しているかどうかを確認します。

< HTTP/1.1 200 OK
< Content-Type: text/html
< Content-Length: 437
< Connection: keep-alive
< Date: Sat, 03 Feb 2018 19:26:45 GMT
< Last-Modified: Sat, 03 Feb 2018 19:25:24 GMT
< ETag: "example12345abcdefghijklmno54321"
< Cache-Control: no-cache, no-store
< Accept-Ranges: bytes
< Server: AmazonS3
< X-Cache: Miss from cloudfront

X-Cache ヘッダーが「Miss from cloudfront」であった場合は、リクエストはオリジンから取得されており、キャッシュから発生したものではありません。

レスポンスの Cache-Control ヘッダーを確認します。Cache-Control の値が「no-store」である場合は、ヘッダーは CloudFront にレスポンスをキャッシュしないように指示しています。Cache-Control の値が「no-cache」である場合は、キャッシュされたレスポンスを返す前にヘッダーが CloudFront にオリジンで検証するように指示しています。この指示は、最大 TTL およびデフォルト TTL の CloudFront 設定よりも優先されます。

注: キャッシュからではないレスポンスに Age ヘッダーはありません。

CloudFront がエラーレスポンスをキャッシュしている

デフォルトでは CloudFront はエラーレスポンスをオリジンからクライアントへ転送します。CloudFront はさらに、オリジンのエラーレスポンスをデフォルトで 10 秒間キャッシュします。

オリジンからのエラーレスポンスが Cache-Control ヘッダーを含む場合は、CloudFront はデフォルトの 5 分ではなく、適切な TTL に従ってエラーをキャッシュします。CloudFront は custom error response に別途指定されていない限り、自身のエラーレスポンスをキャッシュしません。

エラーレスポンスがオリジンからのものか、CloudFront からのものか判断するには、サーバーヘッダーを確認します。エラーがキャッシュされたレスポンスであるか判断するには、Age ヘッダーを、つまりキャッシュされたレスポンスが Age ヘッダーを含むか確認します。

以下は、キャッシュされたレスポンスである Amazon Simple Storage Service (Amazon S3) オリジンからのエラーの一例です。

< HTTP/1.1 403 Forbidden
< Content-Type: application/xml
< Transfer-Encoding: chunked
< Connection: keep-alive
< Date: Sat, 03 Feb 2018 21:07:51 GMT
< Server: AmazonS3
< Age: 12
< X-Cache: Error from cloudfront

以下は、キャッシュされたレスポンスではない CloudFront からのエラーの一例です。

< HTTP/1.1 403 Forbidden
< Server: CloudFront
< Date: Sat, 03 Feb 2018 21:14:53 GMT
< Content-Type: text/xml
< Content-Length: 146
< Connection: keep-alive
< X-Cache: Error from cloudfront

キャッシングヘッダーの競合を特定した後、オリジンを更新する

どのキャッシングヘッダーをディストリビューションのカスタムオブジェクトキャッシングに優先させるか決定したら、次のステップに従います。

  1. ヘッダーがウェブサーバー設定のどこに適用されたか特定します。
  2. ヘッダーが適用された行を削除します。
  3. サーバーを再起動します。
  4. キャッシングヘッダーがレスポンスで返されることがないか確認するために、オリジンを直接テストします。
  5. この変更が適用されるように、使用している CloudFront ディストリビューション全体で無効化を実行します。

関連情報

リクエストヘッダーに基づくコンテンツのキャッシュ

AWS公式
AWS公式更新しました 2年前