1. 기본 작동 원리
- request를 보내면 cloudFront에서 S3에 접근하고 바로 api server에 request를 보낸다.
- 그래서 브라우저는 캐싱되지 않은 데이터, json 데이터나 해당 하는 페이지에서 필요한 데이터만 가져오면 된다.

- 이렇게 cloudFront에 캐싱된 static data에서 api 서버에 따로 요청이 된다면 요청된 해당 데이터만 가져오게 된다.
2. 문제점
- reload 시 해당 url path를 cloudFront에서 인식하지 못해서 S3로 요청이 간다. public이 아니니 당연히 permission denied 에러 발생.
- if you reload the page, http://mywebsite.com/stats will be sent to S3 as your browser does not know that you are running a front(angular, react etc..) application.


3. 해결책
- S3에서 받는 에러코드 403을 에러 페이지 기본 경로로 리턴한다.
- 그러면 해당 내용이 cloudFront로 가고 403에러를 받아 에러 페이지 기본 경로로 내보낸다.
- 그러면 브라우저는 해당 페이지를 띄우기 위한 정적 리소스와 서버 리소스를 모두 받아 데이터를 보여준다.
- reload 시 에러 발생하는 이유는 cloud front가 아닌 s3로 request를 보내기 때문이다.
- 이때, error document를 index.html로 지정해주면 S3가 CloudFront로 해당 내용을 전달한다.
- 그 후 CloudFront에서 해당 에러 처리 내용을 적절히 오류 페이지에 설정을 해주면, end user에게 에러가 아닌 reload한 상태 값을 리턴해줄 수 있다.
1) S3 버킷 > 속성 > 정적 웹 사이트 호스팅 편집(Optional)
- S3 버킷으로도 정적 웹사이트를 호스팅하고 있다면 해당 부분도 수정해야지만, CloudFront의 도메인으로 웹사이트를 제공한다면 해당 부분은 설정하지 않아도 된다.

- 오류 문서 - 기본 페이지 설정 - index.html
2) CloudFront > 오류 페이지 > 사용자 정의 오류 응답 생성 클릭

- 이렇게 reload 시 받는 에러 코드를 설정하고 응답 페이지 경로를 기본 페이지로 선택해주면, 필요한 정적 리소스를 모두 브라우저에 전송 가능하다.

- 그 후 reload 시 정상적으로 작동하는 것을 확인할 수 있다.
ps. 응답 페이지 경로를 모두 index.html로 하는 이유는
" Angular 앱이 동작해야 하는 경우는 모두 index.html로 보내야 합니다." 라고 공식 문서를 확인해보면 나와 있다. 아마 typescript는 거의 비슷하지 않을까 생각한다. 왜냐하면 SPA(Single Page Application)의 특징이기 때문이다.
ps. 해당 문제는 SPA여서 나타나는 문제이다.
일반적으로 정적 서버는 http://www.mysite.com과 같은 요청을 받았을 때 index.html을 반환합니다. 하지만 http://www.mysite.com/heroes/42라는 요청을 정적 서버가 받으면 index.html을 보내도록 따로 설정하지 않은 이상 404 - Not Found를 반환합니다.
references
https://tecadmin.net/s3-cloudfront-404-error-on-page-reload/
https://stackoverflow.com/questions/59160472/how-to-solve-x-cache-error-from-cloudfront-on-spa
https://newbedev.com/how-to-solve-x-cache-error-from-cloudfront-on-spa
'AWS' 카테고리의 다른 글
[CI/CD] S3 + CloudFront + Route 53 전체 구조 (0) | 2022.08.26 |
---|---|
[SAA] AWS Solutions Architect Associate 합격 후기 (0) | 2022.08.24 |
S3 정적 파일 업로드 + CloudFront + Route 53 연동 (0) | 2022.08.11 |
IAM 계정 설정 (0) | 2022.07.25 |
[Github Action] Application Load Balancer 상태 확인이 실패하는 문제를 수정 및 해결 방법(추가 배치를 사용한 롤링) (0) | 2022.07.18 |