-
Notifications
You must be signed in to change notification settings - Fork 5
[FE] 프론트엔드 배포
이 페이지는 스탬프크러쉬팀의 프론트엔드 배포 과정에 대해 설명합니다.
현재 팀 내의 인스턴스는 우아한테크코스 aws에서 개인 aws로 이관한 상태입니다.
따라서 기존에 Jenkins를 사용해 CD를 진행해 왔지만, 누락된 상황입니다. 따라서 현재 이 글에서는 수동으로 빌드하고 배포하는 과정을 서술합니다.
대략적인 배포 플로우는 다음과 같습니다. 매우 간단합니다.
- 프로젝트 빌드
- 빌드파일 nginx 공유 디렉토리로 이동
하지만 배포 문서를 참고하는 시점은 초기에 참고하는 경우가 빈번하므로 초기 인스턴스에서 해야할 일부터 서술하도록 하겠습니다.
node를 설치합니다. node를 설치하는 과정은 다양한데, 공식문서에 기반해 설치를 하는 방법을 추천합니다.
- https://github.com/nodejs/help/wiki/Installation#how-to-install-nodejs-via-binary-archive-on-linux
- https://nodejs.org/en/download/package-manager
node가 잘 설치되었는지 확인합니다.
node -v
npm -v
- 스탬프크러쉬에서 사용하는 노드의 버전은 18이상입니다. 가급적 최신버전(v20.9.0)을 설치하시기를 권장합니다.
- 인스턴스 내에서 다른 노드 버전을 사용해야한다면 nvm을 설치해주세요.
이 위키가 있는 저장소를 클론해옵니다. 현재 위치는 홈 디렉토리라고 가정합니다.
git clone <스탬프크러쉬 원본 remote 주소>
저장소를 가져온 이후에는 frontend
디렉토리로 이동합니다.
cd 2023-stamp-crush/frontend
저장소가 기존에 있는 상황이라면, 브랜치의 최신 내용을 바라보게 업데이트 해줍니다.
git pull <원본 remote 주소의 별칭> <배포하려는 브랜치>
node_modules
를 설치합니다.
npm install
npm 설치가 완료되었으면 빌드를 실행합니다.
# 작업 위치: ~/2023-stamp-crush/frontend
npm run build
빌드가 완료 되었으면 frontend
디렉토리에 dist
가 생성됩니다. 이 디렉토리가 빌드된 내용물이 있는 파일입니다.
이 파일을 서빙해주기 위해 nginx를 사용합니다. 먼저, nginx 설정을 프로젝트에 맞게 설정해줍니다.
vi /etc/nginx/sites-enabled/default
...
location / {
gzip_static on;
root /usr/share/nginx/dist;
index index.html index.htm;
try_files $uri $uri/ $uri /index.html;
}
이 파일의 설정에 맞게 빌드 파일을 옮긴다면, nginx 설정의 root 디렉토리로 옮겨야합니다. 따라서 cp 명령어로 빌드된 파일을 옮겨줍니다.(mv를 써도 무방합니다.)
# 작업 위치: ~/2023-stamp-crush/frontend
sudo cp dist/ /usr/share/nginx
nginx를 재시작 해줍니다.
sudo systemctl restart nginx.service
- nginx 설정은 상황에 따라 변경해서 사용할 수 있으므로 이 항목에서 설명한 내용은 프로젝트별로 상이할 수 있습니다.
먼저, S3를 생성합니다. 버킷을 사용할 지역에 맞게 지역을 설정해줍니다.

객체 소유권과 퍼블릭 엑세스 차단 설정을 진행합니다. 계정과 팀 권한에 맞게 설정합니다. 스탬프 크러쉬는 기본 설정을 따릅니다.
AWS CloudFront에 접속해 "배포 생성"을 클릭하고 새로운 CloudFront를 생성합니다.
- 원본 도메인 : S3 버킷을 선택합니다.
- 원본 경로 : S3내에 index.html의 위치를 표시합니다.
- 이름 : CloudFront의 이름을 설정합니다.
- 사용자 정의 헤더 추가 - 선택 사항: 정책에 따라 추가하나 현재는 필요없습니다.
- Origin Shield 활성화: 비용절감을 위해 "아니오"를 선택합니다.
- 자동으로 객체 압축 : Yes. 항상 압축해 보냅니다. 네트워크 비용을 절감할 수 있습니다.
- 뷰어 프로토콜 정책 : Redirect HTTP to HTTPS. http 요청을 https 로 잇습니다.
- 허용된 HTTP 방법, 뷰어 액세스 제한: 정책에 따라 추가하나 현재는 필요없습니다.
- aws에서 추천하는 방식 혹은 팀 정책에 따라 설정합니다.
- 팀의 aws 비용과... 정책에 맞게 설정합니다. (아니면 기본)
CloudFront에서 S3 버킷 내 객체를 접근하게 하려면 S3의 정책을 설정해주어야 합니다.
CloudFront에서만 S3 버킷 내 객체를 접근하게 하려면 s3:GetObject
속성에 cloudFront의 arn을 넣어줍니다.
{
"Version": "2xxx-xx-xx",
"Id": "PolicyForCloudFrontPrivateContent",
"Statement": [
{
"Sid": "AllowCloudFrontServicePrincipal",
"Effect": "Allow",
"Principal": {
"Service": "cloudfront.amazonaws.com"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::s3_bucket_name/*",
"Condition": {
"StringEquals": {
"AWS:SourceArn": [
"arn:aws:cloudfront::123456789012:distribution/ABCD1234ABCDE",
"arn:aws:cloudfront::123456789012:distribution/ABCD1234ABCDE"
]
}
}
}
]
}
리액트는 CRA이므로 주소창에 경로를 입력하면 index.html을 주어야 합니다. S3 같은경우 객체접근에 실패한다면 403 Forbidden을 반환하므로, S3에서 찾을 수 없는 경로(리액트 라우터 내의 경로)로 접근할 때 403 대신 index.html과 200 OK를 반환할 수 있도록 해줍니다.

S3에 빌드 파일을 업로드합니다. CloudFront에 작성한 원본경로에 맞게 파일을 세팅해주세요.
- 현재 S3 + CloudFront 이관 준비중입니다. 따라서 이 문서는 deprecated 될 수 있습니다.
