안녕하세요, 코린이의 코딩 학습기 채니 입니다.
개인 포스팅용으로 내용에 오류 및 잘못된 정보가 있을 수 있습니다.
Next.js 프로젝트 서버리스로 배포하기
Next.js 프로젝트를 서버리스로 배포할 일이 생겼다.
어떻게 배포하는지 열심히 서치하고 아티클을 찾아서 정리했는데.. Next.js 13에서는 지원이 안됐다.🤦🏻♀️
@sls-next/serverless-component 로 배포하는 방식이였는데, 우선 열심히 삽질한 내역을 공유하려고 한다.
@sls-next/serverless-component 로 NextJS 프로젝트 배포하기
⚠️ Next13 버전 이상부턴 지원되지 않음!!!!!!
참고 사이트
* https://2nnovate.github.io/next.js/ssr/serverless/deploy-next-ssr-app-by-severless/
* https://falsy.me/%EC%83%88%EB%A1%9C%EC%9A%B4-%EB%B2%84%EC%A0%84-serverless-framework%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC-nextjs-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8%EB%A5%BC-aws-lambda%EB%A5%BC-%ED%86%B5/
* https://github.com/serverless-nextjs/serverless-next.js#readme
* https://velog.io/@ghenmaru/Next-next-serverless-%EB%B0%B0%ED%8F%AC-%EA%B5%AC%EC%A1%B0-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0
* https://aerolabs.tistory.com/357
1. 배포환경 만들기
✅ Node12 이상
✅ Serverless Framework 설치
2. 도메인 등록
- 도메인 생성해서 Route 53에 등록
- 커스텀 도메인 설정을 하지 않으면 serverless에서 생성
3. serverless.yml 파일 생성
sample:
component: "@sls-next/serverless-component"
inputs:
# cloudfront 설정
cloudfront:
distributionId: SAMPLE # cloudfront id 값
# 커스텀 도메인 설정
domain: "sample.com" # www는 기본값, domain이 sample.com이라고 가정
bucketName: sample-dev # 정적파일들이 담길 S3 bucket명 지정
bucketRegion: ap-northeast-2
runtime:
defaultLambda: "nodejs18.x"
imageLambda: "nodejs18.x"
# 람다이름 정의
name:
defaultLambda: sampleDefaultLambda
imageLambda: sampleImageLambda
- regionless이기 때문에 별도의 region 설정이 없어도 됨 (CloudFront를 통해 엣지 로케이션으로 전파)
설정 옵션 설명
component
- @sls-next/serverless-component 패키지 설치는 필요하지 않음
- Serverless가 npm에서 자체적으로 가져오는 데 사용되므로 패키지 설치하면 정상적으로 작동하지 않음
- @sls-next/serverless-component@{verison}로 버전을 지정해줄 수 있지만, 지정하지 않으면 알아서 최신 안정 버전이 설치
domain
- 커스텀 도메인 설정
- 커스텀 도메인 설정 시 아래 두가지 조건 만족해야 함
- Route 53에 도메인에 대한 호스팅 영역 포함
- 도메인 레지스터에 나열된 네임서버를 새로운 호스팅 영역에 제공된 네임서버로 갱싱
- 자동으로 SSL 인증서 생성, CloudFront 배포를 가리키는 새 레코드 생성
cloudfront
- 커스텀 cloudfront 설정
- cloudfront 배포 당 최대 25개로 제한 → 모든 경로에 대한 별도의 캐시 동작을 생성하는 것은 좋지 않음
https://github.com/serverless-nextjs/serverless-next.js?tab=readme-ov-file#custom-cloudfront-configuration
AWS Permissions
- 기본적으로 Lambda@Edge에서는 AWSLambdaBasicExecutionRole을 사용하여 실행됨
(CloudWatch에 로그 업로드만 허용) - 필요한 권한이 있다면 추가해야함
https://github.com/serverless-nextjs/serverless-next.js?tab=readme-ov-file#aws-permissions
inputs:
roleArn: "arn:aws:iam::123456789012:role/MyCustomLambdaRole"
혹은
inputs:
policy: "arn:aws:iam::123456789012:policy/MyCustomPolicy"
memory
- default, api, image edge lambda는 기본적으로 512mb 제공
- 메모리 늘리려면 설정 필요
inputs:
memory: 1024
bucket
- S3 bucket 이름 설정
inputs:
bucketName: sample-dev
4. AWS 자격 증명 환경변수 설정
AWS_ACCESS_KEY_ID=""
AWS_SECRET_ACCESS_KEY=""
5. Next.js 빌드 타겟 세팅
- nextjs를 serverless 빌드하겠다고 정의
next.config.js
module.exports = {
target: "serverless"
}
6. 배포
$ serverless
⚠️ $ serverless deploy로 배포하면 오류 발생
총 6단계를 거쳐서 NextJS를 serverless로 배포할 수 있다는 것을 알게 되었다.
기술 검토를 하며 AWS에 대해 배운 내용들을 정리하려고 한다.
AWS CloudFront
- AWS의 CDN 서비스
- CDN 서비스란?
Client의 콘텐츠 요청으로 서버에서 받아온 콘텐츠를 캐싱하고, 이후 같은 요청이 왔을 때 캐싱해둔 것을 제공하는 서비스
- CDN 서비스란?
- 물리적으로 거리가 먼 곳에서도 빠르게 요청 가능 → 서버 부하를 낮춤
Edge Location
- CloudFront 서비스가 콘텐츠를 캐싱하고, Client에게 제공하는 지점 혹은 캐시 서버
Lambda@Edge
- CloudFront용 Lambda
이렇게 공부를 했는데..! 엄청난 삽질이였다 ㅎ
왜냐면? @sls-next/serverless-component는 서비스가 중단되었고, 그로 인해 Next.js13에서는 지원이 안되기 때문이다.
하지만 엄청난 삽질을 통해 배운 지식들이 있다.
1️⃣ AWS CloudFront, Edge Location, Lambda@Edge
당시 Lambda만 깔짝깔짝 해본 나는 저게 뭐야..? 했었는데, 이번 계기를 통해 확실히 알게 되었다.
2️⃣ 기술검토 검색 시, 버전 검색 필수
내가 왜 이걸 놓쳤을까? 생각해보면 검색 할 때 "nextjs serverless deploy" 이런 식으로 검색했었다.
바보 ㅠ 완전 바보!!! 부랴부랴 "nextjs13 serverless deploy"로 검색해봤는데 바로 지원 안된다는 아티클을 발견해서 슬펐다.
3️⃣ github issue 탭 확인하기
매번 패키지 설치하고 사용 방법 확인 후 바로 프로젝트에 적용하던 습관이 여기서 발목을 잡았던 것 같다.
이슈 탭을 한 번이라도 확인했더라면, 바로 NextJS13과 호환이 안된다는 걸 확인할 수 있었을 것이다.
이슈 탭에 들어가니 처음 나오는 이슈 제목이 "Is Serverless Next.js Dead? Seeking Alternatives for Next.js 13" 였다.. ㅋㅋ
아무튼 여러모로 배운 게 많았던 삽질이라서 시간이 아깝진 않았다.
그렇다면 NextJS 13을 serverless로 어떻게 배포할 수 있을까?
다음 아티클에서 SST에 대해 정리해보겠다.
'JavaScript > Next.js' 카테고리의 다른 글
Next.js) Next.js SST 이용하여 AWS에 배포하기 (0) | 2024.04.12 |
---|