[CI/CD] git clone+PM2를 이용한 EC2 배포 (1)

woody·2024년 11월 19일

CI/CD

목록 보기
1/3
post-thumbnail

⭐목표⭐

git clone + PM2를 이용해 EC2에 API 서버 배포를 해보자.

  • 서버에 속하는 각 서비스들을 모두 레포지토리로 나눈다.
  • EC2에서 services 폴더를 생성한 후 그 안에 서비스 레포지토리들을 모두 git clone한다.
  • 각 서비스의 인스턴스에 대한 설정을 하기 위해 services 폴더 안에 ecosystem.config.js를 작성한다.
  • EC2 내에 PM2를 설치해주고 PM2로 ecosystem.config.js를 실행시켜 모든 서비스를 한번에 구동시킨다.

1. EC2 인스턴스 접속

AWS 콘솔에 접속 후 EC2로 들어가서 해당 인스턴스 연결에서 SSH클라이언트 탭의 명령어를 터미널에서 실행시킨다.

ssh -i your-key.pem ec2-user@your-ec2-public-ip

단, 이 명령어는 your-key.pem이 있는 위치에서 실행시킨다. 안그러면 뭐 찾을 수 없다고 떴나..그랬다.

2. services 폴더 생성 후 이동

	mkdir ~/services
	cd ~/services

3. 서비스 레포지토리 클론

(여기선 서비스를 user-service, auth-service, post-service 이렇게 세개로 예시를 들겠다.)

git clone https://github.com/your-username/user-service.git
git clone https://github.com/your-username/auth-service.git
git clone https://github.com/your-username/post-service.git

git clone을 할 때마다 git login을 계속 해야 할텐데 이 뒤에도 pull, fetch 이런걸 쓸 때마다 git login을 해야하므로
ssh key를 통해 git 연동을 하는 법을 이후의 포스팅에서 다룰 예정


4. ecosystem.config.js 파일 작성

이제 PM2 설정 파일을 작성해야 하는데 이 포스팅에서 다루는 설정말고도 많은 기능들이 있으니 한번 찾아보는걸 추천합니다.
기본적으로 이 파일은 모듈 시스템을 사용하여 구성된 설정 파일이며 각 서비스를 PM2로 관리하기 위해 정의해놓은 파일이라고 이해하면 쉽다...아마도

nano ecosystem.config.js

위의 명령어는 services/ 의 위치에서 실행해야하며 nano편집기ecosystem.config.js을 작성하는 것이다.

ecosystem.config.js

module.exports = {
    apps: [
        {
            name: 'user-service',
            script: './user-service/src/index.js',
            env: {
                ...commonEnv,
                NODE_ENV: 'development',
                PORT: 8091,
                DB_NAME: 'dev',
                DB_USERNAME: 'user-service',
            },
            env_production: {
                ...prodEnv,
                NODE_ENV: 'production',
                DB_NAME: 'prod',
            },
        },
        {
            name: 'auth-service',
            script: './auth-service/src/index.js',
            env: {
                ...commonEnv,
                NODE_ENV: 'development',
                PORT: 8092,
                DB_NAME: 'dev',
                DB_USERNAME: 'auth-service',
            },
            env_production: {
                ...prodEnv,
                NODE_ENV: 'production',
                DB_NAME: 'prod',
            },
        },
        {
            name: 'post-service',
            script: './post-service/src/index.js',
            env: {
                ...commonEnv,
                NODE_ENV: 'development',
                PORT: 8093,
                DB_NAME: 'dev',
                DB_USERNAME: 'post-service',
            },
            env_production: {
                ...prodEnv,
                NODE_ENV: 'production',
                DB_NAME: 'prod',
            },
        },
    ]
}

이제 이 코드를 약간 설명해보겠다.

  • module.exports : 아까 말했듯이 이 파일은 모듈 시스템으로 구성되어 있다.
  • apps : exports안에는 apps가 있는데 이 안에서 PM2로 관리할 애플리케이션 목록을 정의한다.
  • name : 이것은 말그대로 이름이다. 좀 더 유식하게 말하면 PM2에서 이 애플리케이션을 알아보기 위한 식별자이다.
  • script : 진입점이다. 예를 들어 PM2로 서비스를 시작하고자하면 pm2 start 애플리케이션을 할텐데 이때 실행되는 파일이다.

(여기서 commonEnv는 서비스에 필요한 환경변수들을 따로 정의해놓은 것이다.)

이 외에도 아주 많은 속성들이 존재한다.

결국 이 파일에서는 PM2에서 관리할 애플리케이션의 설정을 하고 있다. 이것이 끝.

5. PM2 실행하기

이제는 설정 파일도 만들었고 서비스들도 clone으로 가져왔으니 PM2를 실행만 하면 된다.

먼저 PM2를 깔아주고,

npm install -g pm2

PM2로 ecosystem.config.js를 실행하면

pm2 start ecosystem.config.js

설정 파일에서 작성해놨던 apps 내의 애플리케이션들이 전부 실행된다. (이때는 env에서 설정했던 환경변수들이 들어간다.)
만약에 env_production을 넣어서 실행하고 싶다면,

pm2 start ecosystem.config.js --env production

이렇게 하면 된다.

실제로 위의 과정을 따라간다면 오류들이 뜰 수도 있다. 예를 들면 npm을 설치안했거나 등등 이것들은 생략하겠다.

디렉토리 구조
services/
├── ecosystem.config.js
├── auth-service/
│ └── (auth-service 관련 파일들)
├── post-service/
│ └── (post-service 관련 파일들)
└── user-service/
└── (user-service 관련 파일들)



‼️마무리

다음 포스팅에서는 EC2에 git 연동하는 법최신 버전으로 재시작하는 법을 쓸 예정이다.

0개의 댓글