본문 바로가기
AWS/개발 환경

[AWS] EC2 - 실제 개발 환경

by Johnny's 2023. 5. 30.

초기 개발 구조

초기에는 시니어 개발자가 혼자서 EC2에서 개발을 진행하고, development와 production 디렉토리로 구분된 구조를 사용했다. 웹 애플리케이션은 ejs template 엔진, node.js, express 프레임워크, mysql 데이터베이스로 구성되어 있고, 서버 운영을 위해 pm2를 사용하고 있다. 데이터베이스는 외부에 있는 카페24 호스팅 서버에 위치하고 있다. 개발 환경(development)에서는 dev-DB를 참조하고, 운영 환경(production)에서는 prod-DB를 참조하고 있다. (config.json에서 설정) 현재 시니어 개발자를 제외한 4명의 개발자가 함께 작업하고 있으며, 효율적인 협업 환경을 구축해야만 했다.

 

현재 개발 구조

현재 회사에서는 개인 EC2에서 개발을 할 수 있게 개발환경을 제공한다. (개인 Pemkey 소지) 각 개인 EC2에서 개발하고 개발이 완료되면 운영 EC2의 development에 적용시킨다. 초기에는 운영 EC2에서 직접 개발했지만 지금은 production(운영)에 적용하기 전 확인하는 단계라고 보면 된다. 도메인은 서브 도메인 구조로 되어있는데, 새로운 웹 애플리케이션을 쉽게 추가할 수 있는 구조로 되어있다. development는 port 번호가 8000, 8010, 8020.. 으로 8000번 대를 사용하고 있고, production은 9000, 9010, 9020..으로 9000번 대를 사용한다. 예를 들어 어떤 웹 애플리케이션이 8050 port라고 가정하면 development는 https://dev-app1.domain.com 이고, productionhttps://app1.domain.com 인 셈이다.

 

config.json 을 참고하면 더 쉽게 이해할 수 있다.

{
    "development": {
        "Application1": {
            "port": 8000,
            "url": "https://dev-app1.domain.com"
        },
        "Application2": {
            "port": 8010,
            "url": "https://dev-app2.domain.com"
        },
        "Application3": {
            "port": 8020,
            "url": "https://dev-app3.domain.com"
        },
        "database": {
            "connectionLimit": 500,
            "multipleStatements": true,
            "host": "xxx.xxx.xxx.xxx",
            "port": "3306",
            "user": "xxxxx",
            "password": "xxxxxxxxx",
            "database": "dev-DB",
            "schema" : {
                "tableName": "app_sessions"
            }
        }
    },
    "production": {
        "Application1": {
            "port": 9000,
            "url": "https://app1.domain.com"
        },
        "Application2": {
            "port": 9010,
            "url": "https://app2.domain.com"
        },
        "Application3": {
            "port": 9020,
            "url": "https://app3.domain.com"
        },
        "database": {
            "connectionLimit": 500,
            "multipleStatements": true,
            "host": "xxx.xxx.xxx.xxx",
            "port": "3306",
            "user": "xxxxx",
            "password": "xxxxxxxxx",
            "database": "prod-DB",
            "schema" : {
                "tableName": "app_sessions"
            }
        }
    }
}

 

실제로 웹 애플리케이션을 운영할 때는 pm2를 사용하는데, 웹 애플리케이션이 26개나 된다. 

실제 운영되고 있는 pm2 list 화면

EC2를 재시작하거나 서버가 다운되서 다시 pm2로 서버를 다시 띄워야 하는 경우라면, 각 웹 애플리케이션을 26번이나 실행시켜야 한다는 단점이 있다. 애플리케이션이 많이 늘어날수록 관리가 너무 어렵다는 것을 느꼈다. 그래서 자동으로 서버를 재실행할 수 있는 방법은 없을까 하고 고민하던 중 리눅스 '쉘 스크립트'라는 것을 알게 되었고, 가볍게 명령어만 작성해서 해당 파일만 실행시키면 여러 개의 서버를 쉽게 실행할 수 있었다. (개발자라면 노가다를 좋아하지 않을 것이다.) 현재 주어진 환경에서 더 효율적인 방법을 찾기 위해 지속적으로 노력하고 있다.

 

pm2_start.sh

#!/bin/bash

cd project/production/app1
echo `pm2 start server.js --name prod-app1 --log-date-format 'DD-MM HH:mm:ss.SSS'`
cd ../app2
echo `pm2 start server.js --name prod-app2 --log-date-format 'DD-MM HH:mm:ss.SSS'`
cd ../app3
echo `pm2 start server.js --name prod-app3 --log-date-format 'DD-MM HH:mm:ss.SSS'`
cd ../../app4
echo `pm2 start server.js --name prod-app4 --log-date-format 'DD-MM HH:mm:ss.SSS'`

exit 0

 

최근에는 Fargate ECS, CI/CD, Docker와 같은 기술을 사용하여 쉽게 배포하고 관리하는 방법들이 많이 활용되고 있는데 다른 회사에서는 어떻게 운영 및 배포하고 관리하는지 궁금한 생각이 들었다.

댓글