카테고리 없음

☁ EC2에 스프링 부트 배포하면서 피땀 흘린 썰 (1)

책다니엘 2025. 5. 12. 08:19

― 진짜 삽질기록.zip ―

사이드 프로젝트를 마무리하면서, "배포까지 해봐야 진짜 끝이지" 싶은 마음에
AWS EC2에 Spring Boot 앱을 직접 Docker로 띄워봤다.
물론 당연히 처음부터 막혔다. 그 과정을 적어보려고 한다.


🛠️ 1. 운영처럼 배포해보고 싶었다

기획부터 개발까지 다 한 프로젝트가 있었고,
이걸 단순히 로컬에서만 돌리는 게 아쉬워서
"운영 환경처럼 한번 제대로 띄워보자" 싶었다.

  • 백엔드는 Spring Boot
  • DB는 MySQL (초기엔 직접 설치했음)
  • 캐시는 Redis
  • 배포는 Docker + EC2

실제로 서비스 돌아가는 구조랑 최대한 가깝게 구성해보고 싶었다.


🌱 2. EC2부터 시작했는데, 처음부터 멘붕

✅ 기본 VPC가 없다고 했다

처음 EC2 인스턴스를 만들려니까,
"이 리전에서는 기본 VPC가 없어서 인스턴스를 시작할 수 없다"는 오류가 떴다.
??? 뭔 VPC...? 처음 보는 단어였다.

해결: AWS VPC 대시보드 → 기본 VPC 생성 버튼 클릭
버튼 하나 눌렀더니 바로 해결됐다. 괜히 당황했었다.


✅ .pem 키 파일, 진짜로 잃어버리면 끝이다

EC2에 접속하려면 .pem 키 파일이 꼭 필요한데,
이거 한 번 잃어버리면 그 인스턴스에는 다시는 접속 못 한다.

나는 이걸 /mnt/c/SecureKeys 폴더에 두고,
접근 권한도 chmod 400으로 제한해서 썼다.
(권한이 너무 널널하면 SSH 접속 자체가 거부된다. 진짜로 그랬다.)


🐳 3. Docker로 백엔드를 띄우기 시작했다

✅ docker-compose + .env 조합으로 정리

처음엔 그냥 docker run으로 띄웠었는데
옵션도 너무 길고, 여러 서비스가 필요해서 금방 docker-compose.yml로 갈아탔다.

그리고 .env 파일을 따로 만들어서
Spring Boot에서 필요한 설정들을 환경변수로 관리하게 했다.

 

예시:

SPRING_DATASOURCE_URL=jdbc:mysql://172.17.0.1:3306/my_project
SPRING_DATASOURCE_USERNAME=root 
SPRING_DATASOURCE_PASSWORD=my_password
SPRING_PROFILES_ACTIVE=docker 
AWS_ACCESS_KEY=... 
AWS_SECRET_KEY=... 
cloud.aws.s3.bucket=... 
spring.data.redis.host=redis 
spring.data.redis.port=6379

여기서 중요한 포인트는,
Spring에서는 ${cloud.aws.s3.bucket} 같은 방식으로 값을 읽는데
이 변수명이 하나라도 안 맞으면 애플리케이션이 아예 안 켜진다.


✅ S3 오류: “Access key is missing!”

이 에러도 참 많이 봤다:

java.lang.IllegalArgumentException: Access key or secret key is missing!

.env에 분명히 값을 넣었는데도 저 에러가 계속 나왔다.
결국 원인은 뭐였냐면...

# env
AWS_ACCESS_KEY = something ❌ 
AWS_ACCESS_KEY=something ✅

등호(=) 앞뒤에 공백이 있으면 환경변수가 인식이 안 된다.
이거 모르고 한참을 헤맸다. 로그만 보면 이유가 안 나와서 더 짜증났던 기억.


여기까지 1편!
다음은 Swagger UI가 계속 로딩 중에서 안 넘어가던 이유,
Redis UnknownHostException,
그리고 가장 힘들었던 OAuth ClientRegistrationRepository 에러까지 썰 풀어보겠다.