포스팅을 못한 지난 세 달 동안 꽤나 많은 일들이 있었다.
상용 서비스 두 개를 개발 및 배포하였고,그 중 하나는 실제로 유저들이 활발히 쓰고 있는 프로덕트를 다시 처음부터 개발한 것이라, 개발 후 운영 과정에서도 개발 당시 생각지 못한 크고 작은 에러들이 발견되었으며 이를 개선하는 과정에서 또한 많은 것을 배우고 성장했다.
아무리 코드를 잘 짜도 언제나 생각지 못한 에러가 발견될 수 있으므로 늘 겸손해야 겠지만, 최소한
- 한 번 발생한 에러와 같은 유형의 에러를 다음 번엔 다시 발생하게 하지 않고,
- 한 번 만들어본 구조의 코드를 다음 번엔 더 정확하고 빠르게 만들어낼 수 있어야
성장할 수 있다고 생각한다.
그동안 꽤 많은 output을 찍어 냈으니, 앞으로 당분간은 그 과정들을 정리하고 되돌아 보며 '내 것'으로 만드는 input들을 쌓아 나가려 한다.
또한 나와 같이 소규모 개발 조직에서 또는 혼자서 개발 전반을 책임지고 있는 다른 주니어 개발자들에게도 나의 기록이 도움이 되었으면 한다.
그 중 첫번째 글인 본 포스팅에서는 그동안 여러 번 있었지만 매번 헷갈렸던, EC2와 Nginx를 사용한 서비스 배포 과정을 정리한다.
'~~설치법' 등과 같이 구글링하면 바로 나오는 부분들은 가급적 생략하고, 전체적인 흐름을 제시할 에정이다.
우리에겐 구글이 있기 때문에, 내가 뭘 하고 있고 뭘 검색해야 하는지만 알면 그 뒤는 비교적 쉽다.
1. EC2 관련 설정
웹 상에 서비스를 배포하려면 대부분의 경우 클라우드 컴퓨팅 서비스 하나를 이용해야 하는데, 보통 AWS의 EC2(Elastic Compute Cloud)를 많이 쓴다.
인스턴스 생성, DB 생성
- 우선 AWS에서 EC2 인스턴스 한 개를 만든다.
OS를 설정할 수 있는데, 본 개발 환경에서는 ubuntu를 사용하였다.
- 이 때 인스턴스 연결을 위해 필요한 키페어를 생성하게 되는데, 이 키페어를 반드시 잘 보관해두어야 한다. (분실하면 복잡해진다)
- 또한 elastic IP를 생성하여 연결해두는게 좋다. 인스턴스가 재부팅될 때 public IP가 바뀌는데, elasticIP는 재부팅 시에도 변하지 않는다. 이또한 안쓰면 나중에 번거로워질 수 있다.
- 보안그룹 설정 시, ssh 통신을 위한 22번 포트는 절대로 전체 공개로 설정하면 안된다! '내 IP'로 설정해서 사용해야 보안 상 안전.
- 생성한 인스턴스에 터미널로 접속하여(SSH), 배포하고자 하는 코드 파일이 있는 깃헙 레포지토리를 클론 받는다.
- 서버를 배포하기 전에, 배포용 DB를 EC2 상에 생성해야 한다. (DB 배포에는 다른 방식도 있지만 현재는 우선 이 방식으로 구현하였다.)
- EC2 환경에 맞게 mysql을 설치한다. (ex. 'ubuntu mysql 설치' 검색)
- EC2 상에서 루트 계정으로 mysql에 접속하여, 배포용 DB와 이에 접근할 유저 두 개를 생성한다.
- 한 개는 터미널에서 EC2로 접속할 용도로, 나머지 한 개는 workbench에서 접속할 용도로 만든다.
- 유저 호스트를 각각 EC2 접속용 유저는 localhost로, workbench 접속용 유저는 %(모든IP)로 만든다.
배포 환경에서 서버와 DB를 연결
따로 설정해두지 않았다면 서버 코드 상의 DB와 연결하는 부분은 로컬DB를 기준으로 작성되어 있을 것이다.
배포 환경에서는 당연히 배포용 DB에 서버가 연결되어야 하고, Node.js 무중단 서비스인 pm2를 사용함으로써 개발/배포환경을 분리할 수 있다.
- 서버에 pm2를 설치한다 (npm i pm2)
- 다음과 같이 ecosystem.config.js에 개발/배포 환경에 따라 환경 변수를 다르게 설정하여, DB에 연결되도록 한다.
module.exports = {
apps: [
{
// 배포 환경
name: "handalus-prod",
script: "./app.js",
instances: "1",
env_prod: {
NODE_ENV: "production",
PORT: 3002,
MYSQL_USERNAME: "로컬계정",
MYSQL_PASSWORD: "로컬패스워드",
MYSQL_DATABASE: "배포DB",
MYSQL_HOST: "localhost",
MYSQL_PORT: 3306,
},
},
{
// 개발 환경
name: "handalus-dev",
script: "./app.js",
instances: "1",
watch: true,
env_dev: {
NODE_ENV: "development",
PORT: 3002,
MYSQL_USERNAME: "배포계정",
MYSQL_PASSWORD: "배포패스워드",
MYSQL_DATABASE: "배포DB",
MYSQL_HOST: "127.0.0.1",
MYSQL_PORT: 3306,
},
},
],
};
3. package.json에 다음과 같이 등록하면, pm2 설정을 적용하여 서버를 실행할 수 있다
"scripts": {
"dev": "pm2 start ecosystem.config.js --only handalus-dev --env=dev",
"start": "pm2 start ecosystem.config.js --only handalus-prod --env=prod"
},
이제 EC2 환경에 서버를 실행하여 DB에 연결하는 것까지 완료하였다.
하지만 아직 프론트엔드가 연결되지 않았고, 도메인도 연결되지 않았으며 소셜 로그인 등의 구현을 위한 https 환경도 구성되지 않았다.
다음 글에서는 Nginx를 사용하여 React 앱을 배포하고, 도메인 연결 및 https 환경 구성에 대해 다루겠다.
'TIL > DevOps' 카테고리의 다른 글
AWS EC2, Nginx를 사용하여 서비스 배포하기(with React.js, express.js) - 2 (0) | 2022.11.30 |
---|---|
AWS EC2에서 React + Express 프로젝트 배포하기<삽질기> - 1 (0) | 2022.08.02 |