S3 수시로 업데이트되는 파일을 CloudFront 로 서비스 하려고 하고 있습니다….

S3 수시로 업데이트되는 파일을 CloudFront 로 서비스 하려고 하고 있습니다.
전세계 글로벌하게 서비스 해야 하는 파일이라 CloudFront 를 사용하려고 했습니다.

찾아보니, invalidation API 로 강제로 CloudFront 가 가져갈 수 있도록 할 수 있어 보이지만, 이 API 는 적용되는데 보통 10~15분 씩이나 걸린다고 나오네요. (당연해 보이긴 합니다만..)

이런 고민 많이 하셨으리라 생각됩니다만, 어떻게 하시나요?
고수님들의 조언 부탁 드립니다..

15 thoughts on “S3 수시로 업데이트되는 파일을 CloudFront 로 서비스 하려고 하고 있습니다….

  1. Cache-Control의 max-age 설정과 관계없이, 바로 갱신되도록 하려면, 파일이 바뀔 때마다 디렉터리명을 바꾸는 식으로 운영하면 편리합니다.

    일일이 invalidate 해줄 필요도 없고, 설정한 캐시 유지 시간이 지날때 까지 기다리지 않아도 됩니다.

    디렉터리명(경로)가 바뀌는 식으로 하면 거의 2~3초 길어도 1분안에 새 파일을 배포할 수 있습니다.

    이 방식은 AWS에서도 추천하는 방식이고, CF를 사용하는 사이트를 잘 둘러보시면 이 방식을 사용하는 곳이 많습니다.

  2. 1. 아무리 시간을 짧게 주어도 24시간이 걸린다고 들었는데… 바로 갱신이 되나요?
    2. invalidate는 횟수(1000번) 제한 및 과금이 되는 것 같습니다.
    3. 파일명 자체를 바꾸는 방법은 저도 사용하고 있습니다.

  3. SangUk Park http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/Expiration.html 여기 문서 보시면 Cache-Control: max-age로 설정할 수 있고요. 제가 실제로 실험도 해봤는데 정해진 max-age 이후에 캐시가 삭제됩니다.
    invalidate 횟수 제한은 없고요. 한번에 1000개의 파일을 invalidate 할 수 있습니다. “무효화를 요청한 초기 1,000개 파일에 대해서는 추가 요금이 부과되지 않습니다. 이를 초과하는 무효 요청에 대해서는 파일당 0.005 USD 요금이 부과됩니다.”
    http://aws.amazon.com/ko/cloudfront/pricing/

  4. SangUk Park 1. invalidate 사용.
    2. 앞에 제가 댓글에 쓴것 처럼 경로나 이름을 바꾸는 방법
    3. Forward Query String을 활용

    2, 3번은 index.html이나 파일 목록을 가지고 있는 파일을 한번은 invalidate를 해줘야 하고요.

    각자 상황에 맞게 1, 2, 3번을 적절히 활용하시는게 좋겠습니다.

  5. CF의 캐싱 동작에 대해서는 다음의 문서를 살펴 보시는것이 좋겠습니다. http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/Expiration.html RTMP 용도의 Streaming distribution 과 Web distribution 의 동작이 서로 다름에 주의하시구요. 유효하다면 파일이름을 바꾸는 동작이 좋을듯 합니다. S3 와 연동하는 경우의 기본은 Cache-control Max-age 의 적용입니다. 이름을 바꾸는 방법은 필요한 컨텐츠의 이름을 클라이언트가 적절하게 받아갈 수 있는 로직이 필요하겠네요. 또는 처음에는 낮은 TTL 을 사용하다가 컨텐츠의 이상 없음이 확인 되면 더 길게 가져가실 수도 있겠구요. 서비스에 도입 가능한 방법을 적용하시는것이 가장 좋겠습니다. 기능은 존재하지만 어떨때 어떤 방법으로 사용 할 것인지는 구현하시는 서비스마다 그때그때 다르니까요. 🙂

  6. 감사합니다.

    Web distribution 이고, 파일명은 항상 동일해야 해서.. Client 에 고정되어 있는 경우라서요..
    그래서 max-age 를 줄여 보려고 하고있습니다만,

    CloudFront caching—Objects are cached for the value of the Cache-Control s-maxage directive.
    Browser caching—Objects are cached for the value of the Cache-Control max-age directive.

    라고 되어 있네요..
    WebBrowser 에서 접속하는게 아니니.. s-maxage 도 함께 설정해야겠습니다. 많은 도움 되었습니다. ^^;

  7. John Kim (사소한 내용이지만) s-maxage를 별도로 지정하는 것은 CF 단과 End-browser 단의 max-age 를 다르게 지정하는 경우에만 해당합니다. max-age 만 설정하는 경우, 두 값이 같게 설정됩니다.
    Origin adds Cache-Control max-age directive to objects: CloudFront and browsers cache objects for the value of the Cache-Control max-age directive.

답글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.