대부분의 프로젝트는 동적 웹페이지 방식으로 배포를 한다.
하지만, 간혹 정적 웹페이지를 간단히 배포하여 사용할일이 있다. 그게 바로 오늘이다..
오늘 받은 요구사항을 요약하자면 아래와 같다.
- 일회성 프로젝트라 수정할 일이 없음
- 클라우드 프론트 주소가 아니라 깔끔한 도메인주소로 보일 것
이전에도 비슷한 경험이 있었는데, 그땐 순수 html,JS,CSS 만으로 구성된 코드였다. 순수 html은 폴더만 업로드하면 되므로 매우 간단했다.
그때와 달리 React.js, Next.js의 경우 모두 빌드하는 방법이 다르니 주의해야한다. 이번 프로젝트의 경우 Next.js 프로젝트 였으므로 이 경우만 설명하도록 한다.
또한, 기존 배포와 Next.js 환경하에서 배포하는 방법의 차이를 중점으로 설명할 것이기때문에 공통적인 부분은 빠르게 생략하고 넘어갈 것이다.
버킷 이름은 추후에 생성할 대체 도메인 주소와 동일하게 지어야 한다.
버킷만들기는 aws를 경험해본 사람들이라면 아주 익숙할 것이다.
하지만 클라우드프론트와 도메인을 연결할 때 아주 중요한 포인트가 있다.
그건 버킷이름을 꼭!!! 대체 도메인주소와 동일하게 만들어야 한다는 것이다.
다시 한번 강조, 또 강조하자면, 버킷은 수정이 불가능하기 때문에 다 만들고 이것때문에 삭제 후 재생성하는 실수를 많이 저지르기 때문이다.
정적 사이트 배포는 깃을 연결한다던가 이런 작업을 하지않고, 냅다 파일을 올려버린다.
이때 Next.js는 조금 다른 방식으로 배포를 해야한다.
next export
명령어를 이용하여.out
폴더에 모든 페이지를 정적 HTML 파일로 내보내기
관련된 자세한 내용은 Next.js 공식 문서의 정적 HTML 내보내기를 통해 확인할 수 있다.
https://nextjs.org/docs/advanced-features/static-html-export
아무튼 이렇게 생성된 .out 폴더를 버킷에 업로드 해주면되는데, 한가지 더 주의할 점은 파일추가, 폴더추가 버튼이 분리되어있다는 점이다.
(파일추가를 누른뒤, 모든 파일들을 선택해서 업로드를 했는데 에러가 뜨길래, 알고보니 폴더는 추가가 안됐더라; 오로지 파일만... 올라가있다. 그리고 분노하며 폴더를 올렸는데 이번엔 폴더는 하나씩 하나씩 눌러야한다.. 빠트린 파일이나 폴더가 없는지 잘 확인해야한다.. 아무튼 요약하자면..)
파일추가, 폴더추가 둘다 눌러서 빠트린 파일, 폴더 없도록 꼼꼼히 업로드 하기!
편집을 누르고 활성화해준다음 인덱스문서도 야무지게 적어준다.
(간혹 업로드한 폴더 시작점이 index가 아니라 상위폴더부터 시작할 경우 index가 인식이 안될 수 있으니, 주의해야한다.)
여기까지 했으면 속성의 제일 하단에서 정적 웹사이트 엔드포인트 주소가 생성된다.
클릭해서 잘 돌아가는지 확인해주고 다음 단계로 넘어간다.
권한, 정책 관련 부분은 aws를 다루며 자주했던 내용이니 생략한다.
생성 과정은 평소처럼 해주면되고..
대망의 대체 도메인 이름에 S3 버킷생성에 사용했던 동일한 이름으로 적어주면 된다.
대체 도메인 이름은 버킷이름과 동일하게 만들어야 함
모든 작업을 아무 문제 없이 끝냈는데 대체 도메인으로 접속이 안되는 문제가 발생했다..
클라우드 프론트주소나, 버킷주소로를 통해서는 잘만 돌아가는데 도대체 왜?! 대체 도메인만 안되는 건지 도무지 이유를 알수가 없었다.
혹시 오타가 있을까봐 버킷을 지웠다가 만들었다가.. 처음부터 다시 반복해보고 1시간을 끙끙 거리고 있었는데 문제의 해결방법은 아주 허탈했다.
기다리면 ... 된다
문제의 원인은 CloudFront의 캐시가 남아있어서였는데, 내 예상보다 아주 오래 지속되었고 캐시문제라고 전혀 생각하지 못했다.
이번 경험을 통해 TTL 설정에 관한 것도 공부가 필요하다는 것을 느꼈다.
신속하게 대응해야하는 경우도 있을텐데, 캐시가 삭제될때까지 하염없이 기다리기 보다 직접 삭제하는 방법(캐시무효화)을 익혀야할 것 같다.