이번 글에서는 다음 구성으로 Spring Boot 서비스를 배포하는 전체 흐름을 정리한다.
사용자 → Route53(도메인) → ALB(HTTPS) → EC2(Spring 서버) → RDS(DB), ElastiCache(Redis)
중간중간 과금 요소, 보안 설정, 실수하기 좋은 포인트도 같이 적어두었다.
외부 도메인(가비아 등)에서 구매한 도메인을 AWS로 끌어와서 쓰는 단계.
✅ 생성 시 주요 설정 사항
1. 도메인 이름 :eazy99.shop(가비아에서 구매한 도메인명, 글에서는****.shop으로 표기)
1. AWS 콘솔 → Route 53 → 호스팅 영역 생성
2. 도메인 이름에 가비아에서 구매한 도메인(****.shop) 입력
3. 유형은 “공용 호스팅 영역(Public hosted zone)” 선택
4. 생성
생성 후 레코드 중 네임서버 값 확인 → 가비아에 설정 추가
Route53 호스팅 영역에 자동으로 생성된 NS 레코드들의 값들을 가비아에 등록해야 한다. docs.aws.amazon
| 값 1 | ns-****.awsdns-**.org |
|---|---|
| 값 2 | ns-***.awsdns-**.net |
| 값 3 | ns-****.awsdns-**.co.uk |
| 값 4 | ns-***.awsdns-**.com |
레코드 생성
프론트/백엔드 각각 원하는 서브도메인을 붙여서 레코드를 만든다.
프론트 (예: Vercel 또는 S3 정적 호스팅)
www프론트 배포 도메인 (예: xxx.vercel.app 또는 S3 웹 도메인)백엔드 (예: API용 서브도메인)
api 또는 server실무용 구조라면 백엔드는 ALB DNS에 Alias A 레코드로 연결하는 걸 기본으로 잡는 게 좋다. 0x00
✅생성 시 주요 설정 사항
1. 데이터베이스 생성 방식 선택 : 손쉬운 생성
2. 엔진 유형: MariaDB (가장 작은 인스턴스, 요금 주의)
3. 자격 증명 관리 : 자체 관리 → 암호 자동생성
admin 등DB 인스턴스 수정
<연결_추가구성>에서 퍼블릭 액세스 가능 여부를 Yes로 변경, “수정 예약”이 아니라 즉시 적용으로 저장. docs.aws.amazon
(실무에선 보통 퍼블릭 액세스 No + EC2에서만 접근하도록 구성하는 것이 보안상 더 안전하다.) docs.aws.amazon
생성 후 “연결 세부 정보 보기”에서 마스터 암호 확인
| 마스터 사용자 이름 | admin |
|---|---|
| 마스터 암호 | *************** |
.yml 또는 GitHub Secrets에만 저장하고, 코드/블로그에는 절대 노출 X.<연결 및 보안_엔드포인트> 확인
yml 파일 내 DB 설정을 위해 엔드포인트/포트를 체크한다.
| 엔드포인트 | database-1.************.ap-northeast-2.rds.amazonaws.com |
|---|---|
| 포트 | 3306 |
Spring 설정 예시 (application-prod.yml 같은 프로파일)
spring:
datasource:
url: jdbc:mariadb://database-1.**.ap-northeast-2.rds.amazonaws.com:3306/DB이름
username: admin
password: ${RDS_PASSWORD}
driver-class-name: org.mariadb.jdbc.Driver
<연결 및 보안보안 그룹 규칙보안그룹> 검토
✅생성 시 주요 설정 사항**생성 시 주요 설정 사항**
1. 구성 : 엔진(Redis OSS), 배포옵션(노드 기반 캐시), 생성방법(클러스터 캐시)
2. 클러스터 모드 : 비활성화 (과금 요소)
3. 클러스터 정보 : 이름 입력(my-redis등)
4. 위치 체크박스 : 다중 AZ, 자동 장애조치 비활성화 (과금 요소)
5. 캐시 설정 : 노드 유형t4g.small이나t4g.micro등 최소 사양, 복제본 개수 0 (과금 요소) tutorialsdojo
6. 연결 : 서브넷 그룹 선택 (없으면 생성,my-subnet-group등)
7. 보안 : 전송 중 암호화 비활성화 → 보안그룹 선택 (없으면 생성)
8. 백업 비활성화 (과금 요소)
생성 후 “연결 세부 정보 보기”에서 엔드포인트 확인 (생성에 몇 분 걸림) tutorialsdojo
| 기본 엔드포인트 | my-redis.*******.ng.0001.apn2.cache.amazonaws.com |
|---|---|
| 포트 | 6379 |
Spring Boot에서 Redis 사용 예시:
spring:
data:
redis:
host: my-redis.*******.ng.0001.apn2.cache.amazonaws.com
port: 6379
<연결성 및 보안_보안그룹> 검토
Redis도 외부 공개는 절대 X. EC2 → Redis, EC2 → RDS 이렇게 내부 통신 구조로 두는 게 기본. tutorialsdojo
✅생성 시 주요 설정 사항
1. 이름 :my-ec2
2. 애플리케이션 및 OS 이미지(Quick Start) : Ubuntu (예: Ubuntu 22.04)
3. 인스턴스 유형 :t3.micro(프리 티어 가능 여부 확인)
4. 키 페어 : 없으면 생성 후.pem다운로드 (잃어버리면 다시 못 받음)
5. 네트워크 설정 내 방화벽(보안그룹) : 기존 보안 그룹 선택 (없으면 생성)
인스턴스 상세 정보에서 퍼블릭 DNS 확인 (생성 시간 조금 걸림)
| 퍼블릭 DNS | ec2-***-***-***-***.ap-northeast-2.compute.amazonaws.com |
|---|
<연결성 및 보안_보안그룹> 검토
✅생성 시 주요 설정 사항
1. 로드밸런서 이름 :my-alb
2. 가용 영역 및 서브넷 전체 선택 (최소 2개 AZ)
3. 보안그룹 선택 (HTTP 80, HTTPS 443 허용)
4. 리스너 추가 (대상 그룹 선택, 없으면 생성)
1. HTTP 80
2. HTTPS 443
5. 보안 리스너 설정 인증서 소스(ACM) → 인증서 선택 (없으면 생성 후 Route53에 레코드 추가)
6. Route53 레코드 생성 및 로드밸런서 연결
****.shop 또는 *.****.shop (와일드카드로 서브도메인까지 커버) dev.classmethodserver 또는 루트 도메인이제 https://server.****.shop 으로 접속하면 → Route53 → ALB(443) → EC2(8080) → Spring Boot → RDS/Redis 구조가 완성된다. what2dochris.tistory
CI/CD 붙이기 전에, EC2에 직접 배포해서 서비스가 제대로 뜨는지 먼저 검증하는 단계.
로컬에서 jar 빌드
./gradlew bootJar
scp로 EC2에 jar 전송
scp -i my-key.pem build/libs/app.jar ubuntu@ec2-***-***-***-***.ap-northeast-2.compute.amazonaws.com:/home/ubuntu/
EC2 접속 후 jar 실행
ssh -i my-key.pem ubuntu@ec2-***-***-***-***.ap-northeast-2.compute.amazonaws.com
java -jar app.jar --spring.profiles.active=prod
nohup java -jar ... & 형태로 백그라운드 실행요청이 잘 들어가는지 확인 (DB도 함께)
http://EC2_퍼블릭_DNS:8080 또는 http://ALB_DNS 로 호출실무에서는
systemd서비스 등록이나pm2,supervisor같은 프로세스 매니저로 재시작 자동화를 거는 편이 좋다. bcp0109.tistory
/actuator/health 같은 헬스 엔드포인트로 지정하면 더 정확하게 상태 관리 가능https://server.****.shop 으로 접속해서 SSL/도메인까지 모두 정상 작동하는지 확인여기부터가 자동 배포(배포 파이프라인) 파트.
강사님 요구사항을 다시 정리하면:
1. RDS 생성, Redis(ElastiCache) 생성, EC2 생성
2. jar 빌드(./gradlew bootJar), scp(22) 전송, jar 실행(java -jar xxx.jar)
3. HTTPS 적용 + Load Balancer
- ALB 생성 (+ 인증서 적용)
- 대상 그룹 생성 시: “대상이 트래픽을 수신하는 포트는 80, 선택한 인스턴스를 위한 포트는 8080” 구조로 설정
- 사용자 → Route53 → ALB → EC2
- 자동 배포
- GitHub Actions 스크립트 작성
yml에 중요 비밀번호는 GitHub Secrets로 관리
그리고 완료 시 자원 꼭 삭제 (RDS, EC2, ALB, ElastiCache 등 전부).
(실제 값은 마스킹 / Secrets 사용을 전제로 한 예시)
name: Deploy to AWS EC2
on:
push:
branches: [ main ]
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Set up JDK
uses: actions/setup-java@v4
with:
distribution: temurin
java-version: '17'
- name: Build with Gradle
run: ./gradlew bootJar
- name: Copy jar to EC2
uses: appleboy/scp-action@v0.1.7
with:
host: ${{ secrets.EC2_HOST }}
username: ubuntu
key: ${{ secrets.EC2_SSH_KEY }}
source: "build/libs/app.jar"
target: "/home/ubuntu/app.jar"
- name: Run app on EC2
uses: appleboy/ssh-action@v1.0.0
with:
host: ${{ secrets.EC2_HOST }}
username: ubuntu
key: ${{ secrets.EC2_SSH_KEY }}
script: |
pkill -f 'java -jar' || true
nohup java -jar /home/ubuntu/app.jar --spring.profiles.active=prod > app.log 2>&1 &
EC2_HOST, EC2_SSH_KEY, RDS_PASSWORD, REDIS_ENDPOINT 등은 전부 GitHub Secrets로 관리 보안
.yml에 직접 쓰지 말고 환경 변수 또는 GitHub Secrets 사용.과금
운영