기존에 CloudFlare R2 서비스를 사용해서 이미지를 제공하고 있었는데, 로드 속도가 최소 300ms ~ 600ms로 엄청 느려서 S3로 갈아탔다.
S3 버킷을 만들고, CloudFront와 도메인을 연결하고, HTTPS/CORS를 설정했다.
image-lechros로 이름을 지었다. 이름이 다른 버킷과 안겹치게 잘 지어보자. (버킷 이름 지정 규칙)


{버킷명}.s3.ap-northeast-2.amazonaws.com을 선택한다.





img 태그는 따로 cross-origin을 설정하지 않으면 CORS 헤더가 없어도 잘 작동하므로 필요 없다면 이 부분은 넘어가도 된다. 나는 XHR로 이미지를 요청하는 경우가 있어서 설정했다. (처음에 설정 안했다가 누가 사이트에 이미지 안보이는 오류가 있다고 제보가 와서 급하게 추가)



Route53을 쓰면 아마존이 또 친절하게 알려줄 것 같은데, 아쉽게도 CloudFlare DNS를 사용해서 직접 설정했다. 먼저 도메인에 사용할 SSL 인증서를 발급받아야 한다.






다시 버킷으로 돌아와서 아무 이미지나 추가한다. 나는 linesticker1를 추가했다.

잘 접속된다. https으로 자동으로 리디렉션도 된다.
파일이 몇 개 없다면 콘솔로 넣어도 되지만 사이트에 필요한 이미지가 대충 55000개라서 AWS CLI를 사용해서 업로드했다.
| https://aws.amazon.com/ko/cli/
aws s3 sync myfolder s3://image-lechros/myfolder
업로드하면서 캐시 헤더를 설정할 수도 있다.
aws s3 sync myfolder s3://image-lechros/myfolder --cache-control max-age=86400,s-maxage=604800
max-age=86400: 브라우저 캐시에 86400초(1일) 간 저장
s-maxage=604800: CloudFront 캐시에 604800초(7일) 간 저장
max-age로 설정한 기간만큼 브라우저 캐시에 저장된다. 이걸 없애려면 기다리거나, 브라우저 캐시를 날려달라고 사용자한테 부탁하거나 (!), 요청 파일명을 바꿔야 한다. 그러므로 같은 경로의 내용이 변경될 가능성이 있는 경우 너무 길게 가져가지 말자.s-maxage는 CloudFront가 사용하는 캐싱 기간이다. CDN한테 캐시를 날려달라고 부탁하는게 사용자한테 부탁하는 것보다 쉽기 때문에 이건 좀 더 길게 가져가도 된다.Etag로 브라우저의 마지막 요청 시점에서 파일이 변경되지 않았다면 304 Not Modified를 반환할 수 있다. 왕복 딜레이는 있지만 파일 크기가 큰 경우 데이터를 아낄 수 있다.X-Cache: Hit from cloudfront가, 미스되면 X-Cache: Miss from cloudfront가 포함된다. 아주 작은 S3 파일 기준 Hit은 약 10ms, Miss는 약 100ms의 요청 시간을 기록했다.