Spring Boot 서버를 AWS EC2 + RDS로 배포하고 Health Check API까지 연결하기
Spring Boot 애플리케이션을 AWS EC2에 배포한다
RDS(MySQL) 와 연동한다
서버가 살아있는지 확인할 수 있는 Health Check API를 만든다
Health API는 누구나 접근 가능해야 한다
배포 과정에서 발생한 문제를 직접 해결하며 AWS 네트워크 / 보안 흐름을 이해한다
처음에는 IntelliJ에서 실행하면 잘 되는데, EC2에 배포한 JAR를 실행하면 다음과 같은 문제가 발생했다.
403 Forbidden
JWT 관련 에러
DB 연결 실패
Hibernate Dialect 오류
요구사항
인증 없이 접근 가능
서버가 살아있다는 것만 확인하면 됨
구현
@GetMapping("/health")
public ResponseEntity<String> health() {
return ResponseEntity.ok("OK");
}
Security 설정
.requestMatchers("/health").permitAll()
WeakKeyException: key byte array is not secure enough
원인
JWT Secret Key 길이가 256bit 미만
Base64 디코딩을 시도했지만, 실제로는 Base64 문자열이 아니었음
해결
Base64 인코딩된 256bit 이상 키 사용
EC2 환경 변수로 주입
export JWT_KEY=Base64로_인코딩된_충분히_긴_키
jwt:
secret:
key: ${JWT_KEY}
Unable to determine Dialect without JDBC metadata
원인
EC2에 DB 환경 변수가 없었음
Spring Boot가 DB 정보를 아예 못 읽음
확인
env | grep DB
export DB_URL=jdbc:mysql://RDS엔드포인트:3306/mydb
export DB_USERNAME=admin
export DB_PASSWORD=비밀번호
spring:
datasource:
url: ${DB_URL}
username: ${DB_USERNAME}
password: ${DB_PASSWORD}
[인터넷]
↓ 8080
[EC2 - Spring Boot]
↓ 3306
[RDS - MySQL]
사용한 보안 그룹
EC2 보안 그룹 (launch-wizard-1)
22 (SSH)
8080 (Spring Boot API)
외부에서 서버 접근 허용
RDS 보안 그룹 (rds-ec2-1)
3306 포트
소스: EC2 보안 그룹
IP가 아닌 보안 그룹 기반 연결
./gradlew clean bootJar
scp -i key.pem build/libs/expert-0.0.1-SNAPSHOT.jar ubuntu@EC2_IP:/home/ubuntu
java -jar expert-0.0.1-SNAPSHOT.jar
Tomcat started on port 8080
Started ExpertApplication
http://EC2_PUBLIC_IP:8080/health
OK
AWS 배포에서 가장 중요한 건 코드보다 환경
보안 그룹은 “열어두는 설정”이 아니라 누구에게 열어두는지가 핵심
JWT / DB / 서버는 모두 환경 변수 기반으로 관리해야 안전하다!!
“된다”보다 “왜 되는지 설명할 수 있는 상태”가 중요함....
정리 한 줄
Spring Boot 서버를 AWS EC2에 배포하고,
RDS와 보안 그룹 기반으로 연동한 뒤
인증 없이 접근 가능한 Health Check API를 통해
서버의 Live 상태를 확인할 수 있도록 구성했다.
셋팅하고 이해하는데 오랜 시간이 걸렸지만 얼추 감이 잘 잡혔고, 왜 사용해야하는지를 알 수 있게 되었다 야호 ( •̀ ω •́ )y
환경변수 직접주입 불편하니까 .env파일을 ec2에서 만들어 보아요~ b( •̀ ω •́ )b
오늘도 재밌는글 잘봤습니다 ㅋㅅㅋ