0%

aws S3, cloudflare R2 속도 비교 (with. cloudfront)

aws VS cloudflare

필자는 2022년에 cloudflare를 알고 난 후 착한 가격 정책에 매료되어 현재 까지도 사용하고 있습니다. 최근 서비스 배포를 준비하면서 aws의 S3 + cloudfront와 cloudflare의 R2를 비교하게 되었고, cloudflare에 대한 애착(가격) 때문에 R2에 마음이 기울여졌습니다. 하지만 가격 차이 외에도 성능 차이가 궁금했기 때문에 직접 실험해 보기로 했습니다.

이 글에서는 버킷과 CDN에 대한 설명은 생략합니다.

가격 비교

성능과는 별개로 가격 정책에서는 cloudflare가 매우 매력적입니다.
cloudflare 가격
Free Tier에서는 cloudflare가 압도적이고, 이후 추가 요금에서도 모든 면에서 cloudflare가 더 저렴합니다. 특히 cloudflare는 데이터 전송 수수료가 무료인게 인상적입니다.

또한 R2는 S3의 API를 사용할 수 있습니다. 따라서 손쉽게 마이그레이션 할 수 있습니다.

하지만 cloudflare는 리전을 선택할 수 없는것은 아쉽습니다.

실험 환경

  • 서버: OCI (Oracle Cloud Infrastructure)

    • Region: South Korea Central (Seoul)
    • CPU: 4 OCPU
    • RAM: 24GB
    • OS: Ubuntu 22.04
    • 대역폭: 4Gbps
  • 파일:

    • 255MB mp4 파일 (용량이 큰 파일)
    • 113.14kB JPG 파일 (용량이 작은 파일)
  • 실험 방법: 서버에서 파일을 다운로드 받는 시간을 측정합니다. wget을 사용했습니다.

  • 실험 대상:

    • aws S3 (region: ap-northeast-2)
    • aws S3 + cloudfront
    • cloudflare R2
    • cloudflare R2 + CDN
  • 주의 사항:

    • 시간대 별로 다른 결과가 나올 수 있습니다.
    • wget을 사용하여 브라우저에서 다운로드 받는 것과는 다른 결과가 나올 수 있습니다.
    • S3를 public으로 설정하는 것은 aws에서 권장하지 않습니다. 따라서 실험을 위해 public으로 설정했지만, 실제 서비스에서는 private으로 설정하는 것이 좋습니다.

기타

  • R2 CDN 서버 위치: HKG(Hong Kong)
    cloudflare R2

  • cloudflare R2에서 캐시를 사용 하지 않는 방법은 Public access를 허용하는 것입니다. public access

캐싱 확인

여담으로 CDN에 캐싱이 됐는지 확인하는 방법은 HTTP 헤더를 확인하는 것입니다.

cloudflare R2

cloudflare R2

CF-RAY는 방문자의 요청과 데이터 센터의 해시 값 입니다. 데이터 센터가 ICN(Seoul)인 것을 알 수 있습니다.

cloudflare R2 + CDN

cf-cache-status가 HIT이면 캐싱이 된 것입니다.
cloudflare R2 + CDN
데이터 센터가 HKG(Hong Kong)인 것을 알 수 있습니다.

aws S3

aws S3

aws S3 + cloudfront

x-cache: Hit from cloudfront가 있으면 캐싱이 된 것입니다. 아래 사진은 캐싱이 안된 경우입니다.
aws S3 + cloudfront

실험 결과

255MB mp4 파일

cloudflare R2

1회 (3.5s)

cloudflare R2

2회 (3.8s)

cloudflare R2

cloudflare R2 + CDN

cloudflare R2 + CDN은 일정 시간이 지나고 접근이 가능했습니다. 따라서 1회차에 이미 캐시가 되어 있을 수 있습니다.

1회 (23s)

cloudflare R2 + CDN

2회 (23s)

cloudflare R2 + CDN

aws S3

s3는 2.5 ~ 심하면 7초 정도 걸렸습니다. 다만 대부분 3초 내외로 걸렸습니다.

1회 (4.7s)

aws S3

2회 (2.7s)

aws S3

aws S3 + cloudfront

파일에 접근이 가능한지 확인을 해서 1회에 살짝 캐시가 되어 있을 수 있습니다.

1회 (3.1s)

aws S3 + cloudfront1

2회 (0.7s)

aws S3 + cloudfront2

113.14 kB JPG 파일

용량이 작은 파일이라 여러번 확인 했습니다. 캐싱은 이미 된 상태입니다.

cloudflare R2 (0.002s ~ 0.1s)

값이 일정하지 않습니다.
cloudflare R2

cloudflare R2 + CDN (0.3s)

cloudflare R2 + CDN

aws S3 (평균 0.01s)

aws S3

aws S3 + cloudfront (평균 0.005s)

aws S3 + cloudfront

요약

cloudflare R2 cloudflare R2 + CDN aws S3 aws S3 + cloudfront
255MB mp4 파일 (1회) 3.5s 23s 4.7s 3.1s
255MB mp4 파일 (2회) 3.8s 23s 2.7s 0.7s
113.14 kB JPG 파일 0.002s ~ 0.1s 0.3s(동일) 평균 0.01s 평균 0.005s

결론

대한민국 국내에서는 망사용료 이슈 때문에 cloudflare의 CDN을 사용하는 경우 CDN을 사용하기 위해서 요청이 해외로 나갔다가 돌아오는 기형적인 상황을 목격할 수 있었습니다. 현재 실험에서는 홍콩으로 서버를 배정받았지만, 더 먼곳으로 배정받는 경우 더 큰 속도 저하가 발생할 수 있습니다.

따라서 특수한 상황을 제외하고는 aws S3 + cloudfront가 적절한 선택일것입니다. 하지만 R2를 사용하게 된다면 CDN을 사용하지 않는 선택지도 고려해야 할 것 같습니다.