본문 바로가기

project

Final Project: 2주차 (Deploy)

총 4주의 프로젝트를 3가지 기점으로 나누었었는데, 그중 첫번째 지점인 아주 기본적인 기능들에 대한 구현이 끝나게 되어 aws의 ec2와 rds를 이용해 배포를 시도해보게 되었다. 배포중에 생긴 이슈들과, 해결과정들을 정리해보려 한다.

 

기본적인 ec2의 인스턴스생성, 보안설정, rds 데이터베이스 생성 등등에 대한 이야기는 이 글에서는 생략할 것이다.

 

배포를 하며 겪은 문제들은 많았지만 큼직한 부분들만 이야기하자면 이렇게 두가지가 있다.

1. .gitignore에 추가해놓은 파일, 폴더들은 clone해올 수 없기 때문에 ec2컴퓨터에 그대로 직접 작성해 주어야 하는데 너무 비효율적인 것 아닌가?

2. NODE_ENV를 스크립트 명령어마다 나누어놓았는데, pm2 start로 서버를 실행시킬때, NODE_ENV값을 어떻게 설정하지?

 

1의 문제를 어떻게 해결하면 좋을까에 대해 고민하고, 찾아보다가 dotenv라는 것을 알게되었다.

process.env.NODE_ENV로 설정해준 실행환경을 가져올 수 있는것 처럼,

process.env.어떤값  으로 .env라는 파일에 작성해놓은 값들을 가져올 수 있는것이였다.

 

실제로 적용을 해보자. 먼저 dotenv를 설치한다.

 

npm install dotenv

 

그리고 루트디렉토리에 .env라는 파일을 생성한 후, 간단한 예시로 쓸 데이터를 다음과같이 작성해본다.

 

AWS_ACCESS_KEY=myAccessKey
JWT_SECRET_KEY=mySeceretKey

 

그 후에, 위와같은 값들이 필요한 파일의 가장 윗부분에 밑의 코드들을 추가해준다.

 

import dotenv from "dotenv";
dotenv.config();
...

 

이제 process.env.원하는값 의 형식으로 .env에 작성되어 있는 값들을 가져올 수 있다.

jwt 토큰을 발급하는 것을 예시로 들면,

 

import dotenv from "dotenv";
dotenv.config();
import jwt from "jsonwebtoken";


const token = jwt.sign(
        {
          id: result.id
        },
        process.env.JWT_SECRET_KEY,   // .env파일의 'JWT_SECRET_KEY=' 뒤의 값을 불러온다. 
        {
          expiresIn: "1h"
        }
      );

 

이런식으로 어딘가에 공개되면 안되는 데이터들을 .env로 한번에 관리하여 결국 ec2 컴퓨터에서는 .env파일만 직접 작성해 주면 되도록 할 수 있었다.

 

2의 문제에 관해서는 여러가지 방법이 있었지만 나는 ecosystem이라는 것을 이용했다.

루트 디렉토리에 ecosystem.config.js 라는 파일을 생성한 후, 그 파일에 다음과 같은 내용을 작성해주었다.

 

module.exports = {
    apps: [
        {
            name: "dogmate",   // pm2를 모니터링할때 띄어질 이름
            script: "./dist/app.js",  // 실행해야할 파일 경로
            env: {
                "PORT": 3002,         // 실행할 포트
                "NODE_ENV": "production"   // 실행할 환경값(NODE_ENV값)
            }
        }
    ]
};

 

이후에 ec2 컴퓨터에서 pm2 start ecosystem.config.js 명령어를 실행하면 위에서 설정한 파일과 NODE_ENV값으로 서버가 실행되게 된다.