CloudFront가 S3의 최신 HTML 파일을 통과하도록 강제


13

배경

CloudFront가 맨 위에있는 S3에서 정적 사이트를 호스팅하고 있습니다. 내가 가진 문제는 HTML 파일과 관련이 있습니다.

CloudFront의 FAQ 에 따르면 :

Amazon CloudFront는 이러한 캐시 제어 헤더를 사용하여 해당 파일의 업데이트 된 버전에 대한 출처를 확인해야하는 빈도를 결정합니다.

내가 지금까지 한 일

이를 염두에두고 S3 Bucket에서 HTML 파일을 설정하여 다음 헤더를 추가했습니다.

Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Expires: Fri, 01 Jan 1990 00:00:00 GMT

내에 대한 첫 번째 호출 samplefile.htm에서 다음과 같은 응답 헤더가 표시됩니다 (예를 들어 명백한 헤더를 제외했습니다 (예 Content-Type:).

Cache-Control:no-cache, no-store, max-age=0, must-revalidate
Date:Sat, 10 Dec 2011 14:16:51 GMT
ETag:"a5890ace30a3e84d9118196c161aeec2"
Expires:Fri, 01 Jan 1990 00:00:00 GMT
Last-Modified:Sat, 10 Dec 2011 14:16:43 GMT
Server:AmazonS3
X-Cache:Miss from cloudfront

보시다시피 내 Cache-Control헤더가 있습니다. 문제는이 파일을 업데이트하고 새로 고치면 최신 파일이 아닌 캐시 된 컨텐츠를 가져오고 CloudFront가 응답 헤더를보고 캐시 된 버전을 제공하고 있음을 알 수 있습니다.

X-Cache:Hit from cloudfront

요약 / 질문

위의 사항을 염두에두고 CloudFront를 사용할 때 최신 HTML을 자동으로 검색하려면 어떻게해야합니까?

FAQ에 따라 Cache-Control 헤더 로이 작업을 수행 할 수 있어야하지만이 작업을 수행 할 수없는 것 같습니다.

아래 답변에 따라

결국 나는 S3 버킷을 직접 가리 키도록 www CNAME을 변경하기로 결정했습니다. 그런 다음 "static"이라는 새 CNAME을 추가하여 CloudFront를 가리 킵니다.

즉, HTML은 S3에서 직접 가져온 것으로 static.mydomain.com을 가리키는 모든 CSS / JS / IMG 참조가 있습니다.

답변:


6

첫째, Cloudfront의 요점은 캐시 된 콘텐츠를 제공하는 것입니다. Cloudfront에서 캐시되지 않은 콘텐츠를 제공하려고하면 거의 모든 경우에 스트리밍 콘텐츠와 같은 것이 예외 일 수 있습니다. Cloudfront에서 콘텐츠를 제공하기 위해 필요한 작업을 잠시 고려하십시오. 원본 서버에서 사용자와 지리적으로 가까운 위치로 검색해야합니다. 즉, Cloudfront가 원본 서버에서 콘텐츠를 검색해야하는 요청의 경우 요청에 지연 시간을 추가하면 사용자가 콘텐츠를 더 느리게받습니다. 후속 요청이 더 빠른 것은 에지 위치에서 컨텐츠를 사용할 수있는 경우에 한 번입니다.

이 문제에 대한 가장 좋은 방법은 페이지를 업데이트 할 때 파일 이름을 변경하는 것입니다. 이렇게하면 Cloudfront에서 새 콘텐츠를 검색하게됩니다. Cloudfront는 일반적으로 미디어 파일 (이미지 포함) 및 스타일 / 자바 스크립트에 사용되며 HTML에는 그다지 중요하지 않습니다. 본질적으로 S3에는 HTML이 있고 Cloudfront에는 이미지가 있습니다. 변경 사항이 있으면 Cloudfront에서 파일 이름을 변경할 수 있습니다 (예 : file-v1.jpg, file-v2.jpg 등). 또 다른 일반적인 방법은 버전 정보가 포함 된 쿼리 문자열을 포함하는 것입니다.

또한 Cloudfront는 gzip으로 압축 된 콘텐츠를 제공하지 않으므로 일반 서버보다 응답 속도가 느려질 수 있습니다 (귀하의 경우 S3는 gzip 가능 브라우저도 식별하지 않음).

마지막으로, 원하는 경우 무효화를 사용하여 Cloudfront가 기존 사본을 삭제하고 원본 서버에서 새 사본을 가져 오도록 할 수 있습니다. 그러나 Cloudfront는 매월 1000 건의 무료 무효화를 제공하며 그 이후 비용은 $ 0.005 / 유효화입니다.

Cloudfront에서 콘텐츠를 유지하는 가장 낮은 시간은 1 시간 이지만 기본값은 24 시간입니다. 따라서 최대 연령을 3600 이상으로 설정하려고합니다. s-maxage 헤더 (예 : 공유 된 콘텐츠의 경우)도 고려하십시오. Amazon 은이 캐싱 자습서를 권장 합니다 .

며칠 전에 수정 된 최근 문제 가있었습니다.


S3보다 CF를 고수 한 이유는 Werner Vogels의 블로그 게시물 allthingsdistributed.com/2011/02/website_amazon_s3.html 에서 언급 한 것 입니다. 당신이 말하는대로 s3에서 직접 HTML을 라우팅하는 것을 고려할 수 있습니다. 한 가지 참고 사항 : 캐시 버스 팅을 위해 파일 끝에 쿼리 ​​문자열을 추가하는 것은 좋지 않습니다. 일부 프록시는 캐시하지 않을 수 있습니다.
isNaN1247

이 사람은 잔인한 것 같다 모든 업로드에 무효화를 사용하는 것 jmlacroix.com
isNaN1247

1
쿼리 문자열은 Cloudfront에서 작동하지 않습니다. 파일을 캐시하지는 않지만 콘텐츠를 직접 제공하는 경우 효과적입니다. S3의 HTML이 가장 좋습니다. 업로드 할 때마다 모든 것을 무효화하고 싶지는 않지만 변경된 파일을 무효화하는 것이 장점이없는 경우도 있습니다. Cloudfront의 장점은 트래픽이 많은 사이트에만 관련이 있습니다. 평균적인 사이트의 경우 S3는 더 나은 성능을 제공 할 수도 있습니다 (두 가지 모두 시도해보십시오. 특히 작은 개체는 Cloudfront가 느릴 수 있음).
cyberx86

2
Cloudfront는 이제 Gzip 압축을 지원합니다. 여기에서 발표합니다 .
Greg Sadetsky 2016 년

@ cyberx86 한도는 현재 다릅니다 : The minimum expiration time CloudFront supports is 0 seconds for web distributions and 3600 seconds for RTMP distributions. docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/…
xvga

20

Cloudfront는 이제 최소 TTL 0을 지원하고 캐시 에이지 = 0을 사용하는 OP의 원래 시도가 이제 작동하므로 지금까지 정확한 답변은 현재 구식입니다.

찾고있는 결과를 생성할지 여부와 관련하여 다른 캐시 제어 헤더를 사용할지 여부를 조사하려고합니다. max-age 만 필요할 수 있습니다. Cloudfront에서 S3를 확인하여 HTML 파일이 변경되었는지 확인하는 것이 좋습니다. 있는 경우 Cloudfront는 새 파일을 가져 와서 반환 할 수 있습니다. 그렇지 않은 경우 기존 캐시에서 클라이언트에 서비스를 제공 할 수 있습니다 (S3 대역폭을 유지하고 클라이언트를 더 빠르고 더 로컬에 제공).

Cloudfront의 요점은 예, 캐시 된 콘텐츠를 제공하는 것이지만 이제는 때때로 변경되는 콘텐츠가 포함되지만 변경되지 않은 경우 캐시 될 수 있습니다.

Ps 쿼리 문자열은 이제 Cloudfront에서 작동하지만 (관련 원점에 대한 '행동'을 구성하는 경우-또 다른 새로운 기능) 일부 프록시는 여전히 쿼리 문자열이있는 파일을 캐시하지 못할 수 있습니다.

Amazon 개발자 안내서 : 만료 1


-1

CloudFront가 사용자의 헤더를 어떻게 취급하는지 확실하지 않지만 헤더를 지정하지 않으면 객체를 새로 고치는 기본 시간은 24 시간입니다.

개체를 새로 고치기 위해 수행 할 수있는 작업 중 하나는 콘텐츠를 무효화하는 것입니다. 자세한 정보는 아래 링크를 확인하십시오. http://blog.cloudberrylab.com/2010/08/how-to-manage-cloudfront-object.html

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.