초기 개발 구조
초기에는 시니어 개발자가 혼자서 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 이고, production은 https://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와 같은 기술을 사용하여 쉽게 배포하고 관리하는 방법들이 많이 활용되고 있는데 다른 회사에서는 어떻게 운영 및 배포하고 관리하는지 궁금한 생각이 들었다.
'AWS > 개발 환경' 카테고리의 다른 글
[AWS] EC2 - Amazon Linux - MySQL 5.7 설치하는 방법 (0) | 2023.05.09 |
---|---|
[AWS] EC2 - EBS 볼륨 확장하는 방법 (0) | 2023.05.08 |
[AWS] EC2 - Amazon Linux2 - Node 설치 (1) | 2023.05.07 |
[AWS] EC2 인스턴스 접속하기 (0) | 2022.03.09 |
[AWS] EC2 인스턴스 생성 및 Pemkey 만드는 방법 (0) | 2022.03.05 |
댓글