| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
- 백준구현
- 다이나믹프로그래밍
- 자바스크립트
- 프로그래머스코테
- CSS
- HTML
- dp알고리즘
- 백준골드
- 알고리즘
- JS프로그래머스
- 코테
- JS
- 안드로이드 스튜디오
- HTML5
- 리액트커뮤니티
- 프로그래머스JS
- 코딩테스트
- 리액트댓글기능
- 리액트
- 백준nodejs
- 백준
- 몽고DB
- 익스프레스
- css기초
- 백준js
- 포이마웹
- 백준알고리즘
- js코테
- 백준구현문제
- 프로그래머스
- Today
- Total
개발새발 로그
[NestJS] AWS S3로 배포하기 본문
📖들어가며..
이제 만들어진 NestJS 프로젝트를 AWS로 배포해보려고한다.
AWS S3에서도 배포하는 방법이 여러가지인 것 같은데 나는 SSH 연결을 통해 배포를 하고자 한다.
배포하는 과정에서 왜 이렇게 하는지, 추가로 보완해야할 부분이 있는지 정리하려고 한다.
목차
1. NestJS에 배포환경을 위한 환경변수 적용과 CORS 설정하기
2. AWS EC2 접속하기
3. 인스턴스 만들기
4. SSH 연결 준비하기
5. NestJS 프로젝트와 SSH 연결하기
6. Github와 EC2 연결하기
7. EC2 Ubuntu 환경에 배포에 필요 세팅하기
8. AWS EC2 보안 그룹 설정하기
NestJS 환경 변수 세팅
1. NestJS에 배포환경을 위한 환경변수 적용과 CORS 설정하기
NestJS 프로젝트에서 아래와 같이 세팅해줘야 한다.
main.ts에서는 CORS 설정을 위한 세팅을 해줘야한다.
만약 FE에서 배포한 도메인이 존재한다면 해당 도메인을 작성해주면 된다.
app.module.ts
@Module({
imports: [
ConfigModule.forRoot({ isGlobal: true }),
TypeOrmModule.forRoot({
type: 'postgres',
host: process.env.DB_HOST,
port: 5432,
username: process.env.DB_USERNAME,
password: process.env.DB_PASSWORD,
database: process.env.DB_DATABASE,
entities: [__dirname + '/**/*.entity.{js,ts}'],
synchronize: true,
}),
//...
],
})
// .env
PORT=3000
DB_USERNAME=DB 사용자 이름
DB_PASSWORD=DB 패스워드
DB_DATABASE=DB 이름
DB_HOST= DB 배포 주소
main.ts
async function bootstrap() {
const app = await NestFactory.create(AppModule);
const port = process.env.PORT || 3030;
//CORS(Cross-Origin Resource Sharing) 설정
if (process.env.NODE_ENV === 'production') {
app.enableCors({
origin: ['<https://your-production-domain.com>'],
credentials: true,
});
} else {
app.enableCors({
origin: true,
credentials: true,
});
}
await app.listen(port);
}
bootstrap();
2. AWS EC2 접속하기
컴퓨팅 탭의 EC2로 들어간다.

3. 인스턴스 만들기
인스턴스 시작을 누른다.

이름을 입력하고, 애플리케이션 및 OS 이미지에서 Unbuntu를 선택한다
왜 Ubuntu일까?
- 문서가 압도적으로 많고
- NestJS / Node.js / Docker / Nginx와 궁합이 좋고
- AWS에서 공식적으로 가장 많이 쓰이며
- 초보~실무자까지 운영 난이도가 낮다
- Node.js / NestJS와 궁합이 제일 좋음
- Ubuntu는 아래를 안정적으로 지원
- Node.js
- npm / pnpm / yarn
- PM2
- Nginx
- Docker

AMI는 프리티어를 선택하면된다.
다음은 키페어 부분에서 새 키페어 생성을 누른다.
키페어 이름을 입력하고 아래처럼 진행하고 키페어 생성을 누른다.

키페어 파일을 절대 Github 같은 저장소에 올리면 안된다.
나는 NestJs폴더에 넣고 gitIgnore을 설정했다.
이 과정을 마치면 인스턴스 시작을 눌러 완료한다.

4. SSH 연결 준비하기

만들어진 인스턴스 클릭

연결 클릭

아래에 있는 ssh 명령어 복사
5. NestJS 프로젝트와 SSH 연결하기
위 복사한 명령어를 vscode와 같은 터미널에 붙여넣기 후 실행

yse입력
만약 아래와 같은 에러가 뜬다면 chmod 400 "파일이름.pem" 을 터미널에 입력해서 PAM 키를 읽을 수 있게 설정을 한다.
PAM 키는 위에서 생성했던 키페어를 말한다.
chmod 400??
개인키는 권한이 너무 open 되어있어도 경고 문구가 뜨면서 permission deny가 뜨기 때문에 권한을 축소시켜서 (chmod 400)사용하도록 한다.

명령어 수행했다면 다시 ssh 명령어 복사 후 명령어 실행
그러면 Ubuntu에 접속이 완료된다.
기본적으로 git이 설치되어있다. git —version
하지만 npm이 설치되어있지않다.

Ubuntu Nodejs 설치하기
에러 방지를 위한 사전 설치
sudo apt-get update
sudo apt-get install -y build-essential
sudo apt-get install curl
Node.js 설치 (1번 또는 2번으로 설치)
1. 특정 버전 설치 ex) Node.js v14.x
curl -fsSL https://deb.nodesource.com/setup_14.x | sudo -E bash -
sudo apt-get install -y nodejs
2.LTS 버전 설치
curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash -
sudo apt-get install -y nodejs
보통은 LTS를 설치한다.
위 과정을 거치면 아래처럼 잘 뜨게된다.

6. Github와 EC2 연결하기
git clone https://github.com/아이디/깃
현재 ubuntu 환경에서 위 명령어를 입력(프로젝트의 깃허브 주소)
- 그럼 아이디와 비밀번호 치라고함
- 아이디는 그대로
- 비밀번호는 토큰이 필요
🔑 Personal Access Token 만드는 방법
GitHub 웹에서
- GitHub → 오른쪽 프로필
- Settings
- Developer settings
- Personal access tokens
- Tokens (classic)
- Generate new token (classic)
권한 체크 (중요)
✔ repo
✔ read:org (있으면)
Generate → 토큰 복사
그럼 EC2에 프로젝트가 올라감
7-1. EC2 Ubuntu 환경에 배포에 필요 세팅하기(vim .env)
- env를 세팅해줘야함
- vim .env
- 기존 env 코드를 복사해서 붙여넣기
- :wq로 저장 후 나가기
7-2. EC2 Ubuntu 환경에 배포에 필요 세팅하기(pm2 설치, cross-env)
- pm2 설치하기
- 터미널을 닫고 컴퓨터를 꺼도 서버가 실행되도록 하려면 필요한 게 pm2임
- sudo npm install -g pm2
- 전역에 설치한다
- 혹시 모를 에러를 방지하기 위해 cross-env를 프로젝트 내부에 설치
- mac / linux / windows 어디서든 동일하게 동작하게 해줌
- NestJS / TypeORM / ConfigModule 이 이 값 기준으로 동작
- npm install --save-dev cross-env
- 이제 우분투에 올린 서버 프로젝트를 빌드해놔야 함
- npm run build
- 빌드 후 이제 서버 실행하면 됨
- npm run start:prod
- package.json에 pm2로 실행하게끔 해놨음
- "start:prod": "cross-env NODE_ENV=production pm2 start node dist/main.js",
- dist/main이 아닌 dist/main.js로 해야 함
- 만약 코드가 수정되어 업데이트 해야한다면
- git pull origin main
- 문제 생기면 git reset --hard HEAD
- npm install
- npm run build
- pm2 restart main
- git pull origin main
- pm2 사용하면 환경변수를 다시 해줘야 함
8. 보안 그룹 설정하기
그러면 이제 우리 컴퓨터에서 EC2에 접속하기 위해 보안 그룹을 설정해 줍시다.
인바운드 규칙 이라는 녀석에 규칙을 추가해줘야 접속이 가능합니다.
EC2 -> 인스턴스 탭에 가서 인스턴스 ID를 클릭하고, 보안 탭에서 보안 그룹을 클릭합시다

여기서 인바운드 규칙 -> 인바운드 규칙 편집에 들어가줍시다.
그리고 아래 사진과 같이 규칙을 추가해줍시다.

여기서 사용자 지정 TCP의 포트범위는 3000 이어야합니다.
왜냐하면 우리는 서버를 3000번 포트로 열것이기 때문입니다.(아까 env 환경변수에 그렇게 지정함)
📘마치며..
이렇게 되면 이제 pm2로 NestJS의 서버가 켜진 상태로 돌아가게 될 것이다.
이제 문제는 이렇게 배포한 서버의 환경에서 문제점들을 보완해야할 것이다.
예를 들어
- Nginx 사용
- HTTPS
- CORS prod 설정
- 서버 코드 수정 후 배포 자동화(CI/CD)
등이 필요할 것 같다