개발

Cloudfront url 접속하면 S3 url로 리다이렉트되는 문제. Redirect CloudFront Url to S3 location problem

mycloudy 2021. 6. 9. 15:38

SPA 배포하고 S3를 정적 웹서버로 사용할 일이 있어서

Route53 --> Cloudfront (CDN) --> S3  조합으로 사용했습니다

 

Cloudfront url로 접속하면 s3 url로 redirect 되는 문제가 있었습니다

 

https://stackoverflow.com/questions/38735306/aws-cloudfront-redirecting-to-s3-bucket

https://forums.aws.amazon.com/thread.jspa?threadID=216814 

 

위의 링크에서 관련 내용을 찾아보니

 

s3 버킷을 만들면 default endpoint인 US Standrd region에 만들어진 뒤에 다른 region으로 propagation 됩니다

다른 리전에서 해당 다른 리전에 접속하면 아직 그 리전까지 propagation이 되지 않아서 default region으로 redirect된다고 합니다

 

위의 내용을 보면 S3에 global domain이 있고 regional domain이 있다라고 설명합니다

제가 설정한 Cloudfront의 S3 distribution 설정은 global domain이 설정되어 있습니다

그래서 cloudfront url로 접속했을 때 s3의 글로벌 도메인으로 접속했고 글로벌 리전까지 아직 propagation 되지 않아서

fallback으로 default region인 서울 리전으로 307 되었습니다

 

S3, Cloudfront가 등록되는 순서와 두개를 연결했을 때 어떻게 동작하는 지 알아보면 좀 더 이해할 수 있습니다

 

### S3가 등록되는 순서

서울 리전에서는 정상적으로 접근이 됩니다
N. Virginia(us-east-1) 리전에는 아직 전파가 안되서 접근이 안되고 서울 리전으로 요청을 보내라는 메시지가 뜹니다
글로벌 리전에 접속하면 아직 전파가 다 안되었기 때문에 default endpoint로 307 Temporary Redirect 시킵니다

 

위에 과정들을 보면 서울리전에서 생성한 S3는 서울 리전(ap-northesst-2)이 기본 endpoint로 등록되고 다른 리전으로 전파되는 것을 알 수 있습니다.

생성한 리전이 default endpoint로 먼저 등록된 뒤에 다른 리전들로 propagation 됩니다.

 

### Cloudfront 등록 순서

Cludfront는 글로벌 리전만 존재합니다

그러면 N. Virginia(us-east-1) 리전이 deault endpoint로 등록이되고 다른 리전으로 전파되는 것으로 생각할 수 있습니다

 

 

### Cloudfront --> S3 과정

Cloudfront는 자신이 파일을 가지고 있는지 확인한 후 없으면 파일을 요청해 가지고 온 뒤에 캐싱하고 전송하는 과정을 거칩니다

요청했을 때 파일이 없기 때문에 S3에 접근해서 파일을 요청합니다

S3의 글로벌 리전으로 요청을 보내는 과정에서 글로벌 리전은 아직 모든 곳에 propagation을 못했기 때문에 default endpoint인 서울 리전(ap-northeast-2)으로 fallback을 보냅니다 이 때 307이 일어납니다

Cloudfront는 S3 글로벌 도메인에 연결되어 있습니다
https://d3th5ypv9edca5.cloudfront.net로 접근하면 307 Temporary Redirect가 발생해 s3로 redirect가 됩니다

### 해결방법

리전별로 등록되는 시간과 다른 리전으로 propagation되는 시간의 차이로 발생하는 문제입니다

찾아보면 별도의 방법으로 리전을 설정해서 문제를 해결하거나 기타 방법으로 해결하는 것도 가능해보입니다

당장 급한게 아니라면 Convention over configuration에 따라 코딩하는 게 좋아서 (코딩은 아니지만)

기본값을 변경하지 않는게 좋은 거 같아 기다리는 선택을 했습니다

경험적으로 3~4시간 정도면 동작했던 걸로 기억합니다