[목표]
프로젝트 흐름/진행도 구성(파이프 라인)(진행중)
어제 했던 내용들 회고 작성(트러블슈팅)
새로운 UX/UI 전체적으로 적용(슬레이트 색상), 아이콘 및 파비콘 적용
로그인/회원가입/이메일 인증 프론트엔드 개선(명석이형 요청)
AWS 오토스케일링 적용하기(ALB)
소영님이 CI/CD 관련된 질문을 하셔서 알려드렸다. 우리 프로젝트 기준으로 설명드렸다.
오토스케일링을 하기 전에 로그인과 아이콘, 파비콘, 로그인/회원가입/이메일 인증 프론트엔드를 손보고 있다.
로그인 페이지 개선
회원가입 페이지 개선
이메일 인증 개선
이메일 인증 결과 개선
비밀번호 찾기 추가(구현은 안됨)
원래는 형편없는 오류 페이지를 발생시키지만, 이제는 정확한 이유를 파악할 수 있다. 그리고 상황에 따라 시스템 점검중이라는 표시를 nginx 주석을 통해 제어 가능하다.
rewrite ^/(.*)$ /maintenance break; 문구를 각각의 서빙 코드에 추가하면된다.
nginx.conf
server {
listen 80;
server_name code-planner.com;
# 프론트엔드 정적 파일 서빙
location / {
# rewrite ^/(.*)$ /maintenance break; # 서버 점검시 주석 해제, 점검완료시 주석
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
.
.
.
}
# API 요청을 백엔드로 프록시 + CORS 헤더 및 OPTIONS 처리
location /api/ {
# rewrite ^/(.*)$ /maintenance break; # 서버 점검시 주석 해제, 점검완료시 주석
proxy_pass http://localhost:5000/api/;
proxy_http_version 1.1;
.
.
.
→ 팀원이 dev 적용하는대로 서버에 패치해보겠다.
밖에서 식사를 하고 왔다.

약간의 휴식을 가졌다.
이제 어제 적용하다 못한 오토스케일링을 서버에 적용시켜보겠다.
어제 작업하던게 좀 꼬인것 같아서 처음부터 차근차근 해보려고 한다.
AMI를 써서 오토스케일링 하는 방법도 있는데, 나는 깃허브 액션을 사용한 CI/CD환경이 구축되어 있기 때문에 AWS 기본 AMI + User Data 를 쓰는 방식을 사용할 것이다. 대략적인 차이는 다음과 같다.
| 항목 | AWS 기본 AMI + User Data | 직접 생성한 AMI |
|---|---|---|
| 유연성 | 매우 높음 (코드 변경 시 자동 반영 가능) | 낮음 (AMI 재생성 필요) |
| GitHub Actions + S3 연계 | 적합함 | 번거로움 |
| 유지보수 | 스크립트만 수정하면 됨 | 매번 AMI 생성/배포 필요 |
| 확장성 | CI/CD, IaC와 잘 맞음 | 수동 관리 필요 |
| 빌드 자동화 연계 | GitHub Actions, S3 배포와 직접 연결 가능 | 불편함 |
Amazon Linux 2023, Ubuntu 22.04 LTS 등pm2 start, systemctl start nginx 등)main 브랜치에 push 시 앱 빌드 및 압축우선적으로 EC2 시작 템플릿을 작성한다. 왜냐하면 동적으로 EC2를 실행시킬때 원래 서버와 같은 환경을 만들어 둬야 하기 때문이다.
EC2 → 인스턴스 → 시작 템플릿 → 시작 템플릿 생성 클릭!
모두 천천히 읽어보고 깃허브 클론 URL 같은 경우는 우리 프로젝트에 맞게 편집해야한다. 이거를 사용자 데이터에 추가하자.
#!/bin/bash
# 1. 기본 패키지 설치
sudo apt-get update -y
sudo apt-get install -y git curl
# 2. Node.js, npm, pm2 설치 (Node 18 기준)
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
sudo apt-get install -y nodejs
sudo npm install -g pm2
# 3. 프로젝트 클론 (이미 있다면 git pull)
if [ ! -d "/home/ubuntu/codeplanner/Codeplanner_Backend" ]; then
sudo mkdir -p /home/ubuntu/codeplanner
sudo chown ubuntu:ubuntu /home/ubuntu/codeplanner
cd /home/ubuntu/codeplanner
git clone https://github.com/Krafton-Jungle-Weight/Codeplanner_Backend.git
else
cd /home/ubuntu/codeplanner/Codeplanner_Backend
git pull origin main
fi
if [ ! -d "/home/ubuntu/codeplanner/Codeplanner_Frontend" ]; then
cd /home/ubuntu/codeplanner
git clone https://github.com/Krafton-Jungle-Weight/Codeplanner_Frontend.git
else
cd /home/ubuntu/codeplanner/Codeplanner_Frontend
git pull origin main
fi
# 4. 환경 변수 파일(.env) 준비 (필요시 S3 등에서 다운로드)
# 예시: aws s3 cp s3://your-bucket/.env .env
# 나같은 경우 이미 프로젝트 파일에 있어 준비 X
# 5. 백엔드 의존성 설치 및 빌드
sudo chown -R ubuntu:ubuntu /home/ubuntu/codeplanner/Codeplanner_Backend
cd /home/ubuntu/codeplanner/Codeplanner_Backend
sudo npm install
npm run build
pm2 start ecosystem.config.js --env production
# 6. 프론트엔드 의존성 설치 및 빌드
sudo chown -R ubuntu:ubuntu /home/ubuntu/codeplanner/Codeplanner_Frontend
cd /home/ubuntu/codeplanner/Codeplanner_Frontend
sudo npm install
npm run build
pm2 start ecosystem.config.js --env production
# 7. pm2로 서버 실행 (포트는 필요에 따라 조정)
export NODE_ENV=production
# 백엔드 실행 (예: 5000번 포트)
pm2 start dist/src/main.js --name codeplanner-backend || pm2 restart codeplanner-backend
# 프론트엔드 실행 (Next.js, 예: 3000번 포트)
pm2 start npm --name codeplanner-frontend -- start || pm2 restart codeplanner-frontend
pm2 save
ALB는 트래픽을 특정 EC2에 직접 보내지 않고 Target Group을 통해 전달하기 때문에 필요하다.
EC2 → 대상 그룹 → 대상 그룹 생성 클릭!
이후에 다음과 같이 작성하세요. 저 같은 경우 이미 80번에 배포를 하고 있어서 기존 대상 그룹을 사용했습니다. 생서 후에 대상 그룹 이름은 기억해둬야합니다.
| 항목 | 값 |
|---|---|
| 대상 유형 | 인스턴스 |
| 프로토콜 | HTTP |
| 포트 | 3000 또는 80 (프론트 기준) |
| VPC | ALB가 위치할 VPC |
| 헬스체크 경로 | 예: / 또는 /health |
| 포트 | 앱이 리스닝 중인 포트 (예: 3000 또는 5000) |
대상 그룹 위에 로드 밸런서 → ALB 생성 클릭!
Application Load Balancer 선택하고 다음과 같이 설정하면 된다. 나 같은 경우 이미 생성되어 있는 ALB가 있어서 그걸 사용했다.
| 항목 | 값 |
|---|---|
| 이름 | codeplanner-alb |
| 스키마 | 인터넷 연결용 |
| 리스너 | HTTP:80 (HTTPS는 나중에 추가 가능) |
| VPC 및 서브넷 | 2개 이상의 퍼블릭 서브넷 선택 |
| 보안 그룹 | 80, 443 포트 오픈된 SG 선택 또는 생성 |
여기서 안됨. 유예기간 늘리고 로그로 확인중이다.
나중에 이어서 확인중이다.
dev에 병합 준비가 완료 되어서 병합을 진행했다. 업데이트 내역은 다음과 같다.
패키지 보안 문제 해결(axios의 localtunnel)
C:\Users\KTY\jungle_project\Codeplanner_Backend>npm install
added 44 packages, and audited 941 packages in 3s
168 packages are looking for funding
run `npm fund` for details
2 high severity vulnerabilities
To address all issues (including breaking changes), run:
npm audit fix --force
Run `npm audit` for details.
C:\Users\KTY\jungle_project\Codeplanner_Backend> npm audit
# npm audit report
axios <=0.29.0
Severity: high
Axios Cross-Site Request Forgery Vulnerability - https://github.com/advisories/GHSA-wf5p-g6vw-rhxx
axios Requests Vulnerable To Possible SSRF and Credential Leakage via Absolute URL - https://github.com/advisories/GHSA-jr5f-v2jv-69x6
fix available via `npm audit fix --force`
Will install localtunnel@1.8.3, which is a breaking change
node_modules/localtunnel/node_modules/axios
localtunnel >=1.9.0
Depends on vulnerable versions of axios
node_modules/localtunnel
2 high severity vulnerabilities
To address all issues (including breaking changes), run:
npm audit fix --force
배포에 문제가 생겨서 2시간 정도 썻다. 이게 다른 사람들 패키지 호환성 문제나 여러가지 문제를 생각해야되고 상황에 따라 전체 삭제했다가 다시 빌드 해야되서 생각보다 복잡하다.
권호형 깃허브 리포 연동이 안되서 확인중이다.
SSM 으로 탄력적 IP를 안쓰고 SSH연결을 구현할 수 있다.
# SSH로 서버 접속
ssh ubuntu@3.38.25.129
# pm2 상태 확인
pm2 status
# 백엔드 로그 확인
pm2 logs Codeplanner_Backend
# 포트 확인 (5000번 포트가 열려있는지)
netstat -tlnp | grep :5000
# nginx 액세스 로그
sudo tail -f /var/log/nginx/access.log
# nginx 에러 로그
sudo tail -f /var/log/nginx/error.log
# 로컬에서 백엔드 API 직접 호출
curl http://localhost:5000/api/github/connect/test