과제간 트러블 슈팅(AWS 세팅)

제이 용·2025년 12월 29일

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 오류

이 과정에서 “로컬과 서버는 완전히 다른 환경”이라는 걸 명확히 인식하게 됐다.


Health Check API 설계

  • 요구사항

    • 인증 없이 접근 가능

    • 서버가 살아있다는 것만 확인하면 됨

  • 구현

@GetMapping("/health")
public ResponseEntity<String> health() {
    return ResponseEntity.ok("OK");
}

Security 설정
.requestMatchers("/health").permitAll()

/auth/** 와 /health 는 JWT 없이 접근 가능하도록 설정


JWT 관련 문제 해결 과정

  • 문제 1: EC2에서 서버가 아예 안 뜸
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}

JPA / RDS 연결 문제 해결

  • 문제 2: Hibernate Dialect 오류
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}

EC2 ↔ RDS 네트워크 & 보안 그룹 이해

  • 핵심 구조
[인터넷]
   ↓ 8080
[EC2 - Spring Boot]
   ↓ 3306
[RDS - MySQL]

사용한 보안 그룹

  • EC2 보안 그룹 (launch-wizard-1)

    • 22 (SSH)

    • 8080 (Spring Boot API)

    • 외부에서 서버 접근 허용

  • RDS 보안 그룹 (rds-ec2-1)

    • 3306 포트

    • 소스: EC2 보안 그룹

    • IP가 아닌 보안 그룹 기반 연결

이 설정 덕분에 EC2 → RDS 연결 성공


JAR 재빌드 & 배포 과정

  • 로컬에서
./gradlew clean bootJar
  • EC2로 전송
scp -i key.pem build/libs/expert-0.0.1-SNAPSHOT.jar ubuntu@EC2_IP:/home/ubuntu
  • EC2 실행
java -jar expert-0.0.1-SNAPSHOT.jar
  • 정상 실행 로그
Tomcat started on port 8080
Started ExpertApplication

Health Check 최종 확인

  • 브라우저에서 접속:
http://EC2_PUBLIC_IP:8080/health
  • 응답:
OK
  • 서버 실행 확인
  • 인증 없이 접근 가능
  • 과제 요구사항 충족

이번 경험에서 얻은 것

  • AWS 배포에서 가장 중요한 건 코드보다 환경

  • 보안 그룹은 “열어두는 설정”이 아니라 누구에게 열어두는지가 핵심

  • JWT / DB / 서버는 모두 환경 변수 기반으로 관리해야 안전하다!!

  • “된다”보다 “왜 되는지 설명할 수 있는 상태”가 중요함....

정리 한 줄

Spring Boot 서버를 AWS EC2에 배포하고,

RDS와 보안 그룹 기반으로 연동한 뒤

인증 없이 접근 가능한 Health Check API를 통해

서버의 Live 상태를 확인할 수 있도록 구성했다.


셋팅하고 이해하는데 오랜 시간이 걸렸지만 얼추 감이 잘 잡혔고, 왜 사용해야하는지를 알 수 있게 되었다 야호 ( •̀ ω •́ )y

4개의 댓글

comment-user-thumbnail
2025년 12월 29일

환경변수 직접주입 불편하니까 .env파일을 ec2에서 만들어 보아요~ b( •̀ ω •́ )b
오늘도 재밌는글 잘봤습니다 ㅋㅅㅋ

1개의 답글
comment-user-thumbnail
2025년 12월 30일

100점 드립니다

1개의 답글