EC2 배포
서버 정보
| 항목 | 값 |
|---|---|
| EC2 OS | Amazon Linux 2 |
| OS User | ec2-user |
| 앱 경로 | /opt/{서비스명}/ |
| 서비스명 | {서비스명} |
| 포트 | 8080 |
주의: EC2 배포는 담당자가 명시적으로 요청할 때만 진행한다.
배포 순서
배포는 반드시 아래 순서를 따른다:
git pull → 빌드 → jar 전송 → 서비스 재시작
1. 최신 코드 Pull
git pull origin master
2. Gradle 빌드
# 전체 클린 빌드 (테스트 제외)
./gradlew clean build -x test
빌드 결과물: build/libs/{서비스명}-0.0.1-SNAPSHOT.jar
3. jar 파일 EC2 전송
scp -i ~/key/{서비스명}-key.pem build/libs/*.jar ec2-user@{EC2_IP}:/app/
4. 서비스 재시작
sudo systemctl restart {서비스명}
5. 배포 확인
# 서비스 상태 확인
sudo systemctl status {서비스명}
# 애플리케이션 시작 로그 확인 (필수)
sudo journalctl -u {서비스명} -f --no-pager | grep "Started"
한 줄 배포 명령
git pull && ./gradlew clean build -x test && scp build/libs/*.jar ec2-user@{EC2_IP}:/app/ && sudo systemctl restart {서비스명}
환경변수 설정
systemd service 파일에 Environment= 추가
# /etc/systemd/system/{서비스명}.service
[Unit]
Description={서비스명} Application
After=network.target
[Service]
User=ec2-user
WorkingDirectory=/opt/{서비스명}
EnvironmentFile=/opt/{서비스명}/{서비스명}.env
Environment=ANTHROPIC_API_KEY=sk-ant-...
ExecStart=/usr/bin/java -jar /opt/{서비스명}/{서비스명}.jar \
--spring.profiles.active=prod
Restart=always
RestartSec=10
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
ANTHROPIC_API_KEY환경변수 추가는 필수다.
환경변수 파일 방식
# /opt/{서비스명}/{서비스명}.env
DB_URL=jdbc:oracle:thin:@{host}:1521:{sid}
DB_USERNAME=appuser
DB_PASSWORD=...
ANTHROPIC_API_KEY=sk-ant-...
JWT_SECRET=...
service 파일 변경 시
sudo systemctl daemon-reload
sudo systemctl restart {서비스명}
환경변수 추가 시
# 1. service 파일 또는 .env 파일 편집
sudo vi /opt/{서비스명}/{서비스명}.env
# 2. 서비스 재시작 (환경변수 반영)
sudo systemctl restart {서비스명}
롤백 절차
# 이전 커밋으로 되돌리기
git log --oneline -5 # 커밋 해시 확인
git checkout <이전-해시>
./gradlew clean build -x test
scp build/libs/*.jar ec2-user@{EC2_IP}:/app/
sudo systemctl restart {서비스명}
트러블슈팅
서비스가 시작되지 않을 때
# 전체 로그 확인
sudo journalctl -u {서비스명} -n 100
# 에러 필터링
sudo journalctl -u {서비스명} | grep "ERROR"
포트 8080 점유 확인
sudo lsof -i :8080
sudo kill -9 <PID>
SSH 접속
ssh -i ~/key/{서비스명}-key.pem ec2-user@{EC2_IP}