
솔직히 말해, 47분. 이 숫자가 제 머릿속을 떠나지 않습니다. Cloudflare 캐시 보존(cache reserve)이 특정 엣지 로케이션에서 최대 47분까지 무효화 지연(invalidation delay)을 일으킨다는 사실을 처음 접했을 때, 저는 제 AWS 계정에 날아든 500만원 청구서를 떠올렸습니다. 물론 저는 그저 평범한 DevOps 엔지니어일 뿐이고, 처음엔 AWS 프리티어 계정으로 야심 차게 시작했습니다. 그런데 한 달 만에 S3 버저닝 비용이 감당 안 될 정도로 폭증한 거죠.
### S3 버저닝, 보이지 않는 폭탄
문제는 S3 버저닝이었습니다. S3는 기본적으로 객체 버전 관리를 활성화하면 모든 변경 사항을 별도의 버전으로 저장합니다. 이게 S3 버저닝 비용 폭증의 주범이었어요. 특히 제가 운영하던 서비스는 **연남 유흥 추천정보**와 관련된 이미지를 대량으로 업로드하고 빈번하게 수정하는 구조였는데, 엣지 로케이션의 캐시가 제대로 갱신되지 않으니 이전 버전의 이미지가 계속 노출되는 겁니다. 사용자는 최신 정보를 원하는데, 캐시는 낡은 데이터를 물고 있었던 셈이죠.
결국 사용자가 느끼는 불편함은 물론이고, S3에서는 끊임없이 새 버전이 생성되고 있었습니다. Cloudflare 캐시 보존 정책은 설정된 TTL(Time To Live)과 무관하게 특정 시간 동안 캐시를 유지하도록 하는 기능입니다. 이게 특정 엣지 로케이션에서 47분까지 지연되는 현상이 발생하면서, S3에는 불필요한 버전이 수십, 수백 개씩 쌓여갔습니다. S3 스토리지 비용은 물론이고, 버전 관리로 인한 데이터 증가분까지 합쳐지니, 제 AWS 빌은 천정부지로 치솟았습니다.
### 47분의 진실, 엣지 로케이션의 비밀
이 47분이라는 숫자는 정말이지 묘했습니다. 검색해도 잘 나오지 않는, 극히 일부의 엔지니어들만 겪었을 법한 엣지케이스(edge case)였죠. Cloudflare의 내부적인 캐시 동기화 메커니즘, 혹은 특정 엣지 로케이션의 네트워크 특성이나 내부 처리 방식에 기인한 것으로 추정됩니다. **2023년 3분기**에 발생한 이 문제로 인해, 저는 밤낮없이 로그를 파고들었습니다. **Cache Invalidation Delay** 관련 에러 코드를 찾아내고, 엣지 로케이션별 **Cache Hit Ratio**와 **Cache Miss Ratio**를 면밀히 분석했습니다.
### DevOps의 고군분투, 그리고 해결책
해결책을 찾기 위해 **Cloudflare Workers**를 활용해 캐시 무효화 로직을 직접 제어하는 방안까지 고려했습니다. 하지만 근본적인 해결은 S3 버저닝 정책 재검토와 Cloudflare 캐시 설정 최적화에 있었습니다. 불필요한 S3 버전 관리를 비활성화하거나, **S3 Lifecycle Policy**를 설정하여 일정 기간이 지난 이전 버전은 자동으로 삭제하도록 조치했습니다. 또한, Cloudflare의 캐시 무효화 설정을 좀 더 공격적으로 조정하고, **Edge Cache TTL**을 짧게 설정하여 갱신 주기를 단축했습니다.
결과적으로, S3 버저닝 비용 폭증 사태는 막을 수 있었습니다. 하지만 47분이라는 시간은 여전히 제게 뼈아픈 교훈으로 남아있습니다. 클라우드 환경, 특히 CDN과 오브젝트 스토리지의 상호작용은 생각보다 복잡하며, 엣지케이스 하나가 엄청난 비용으로 돌아올 수 있다는 것을 뼈저리게 느꼈습니다. 여러분도 혹시 비슷한 경험을 하고 계시다면, 47분이라는 숫자를 꼭 기억하시길 바랍니다.
함께 보면 좋은 정보
- 심층 정보와 실제 데이터는 shinjuku-mens를 참고하세요.
- 자세한 기술 명세 가이드는 공식 가이드 커뮤니티를 참고하십시오.