배포 절차 개요
전체 배포 단계
1단계: 인프라 자원 사전 생성 ├── ECR (이미지 저장소) ├── RDS (데이터베이스) └── Redis (캐시 서버) 2단계: 이미지 빌드 및 업로드 └── 수동 작업 → 이후 GitHub Actions로 자동화 3단계: Kubernetes 자원 생성 ├── Deployment (Pod 실행) ├── Service (Pod 라우팅) └── Ingress (외부 접근) 4단계: HTTPS 인증서 설정 └── TLS 인증서 적용
사전 준비 상태 확인
다음 자원들이 이미 구성되어 있다고 가정한다
- Route53 호스팅 영역
- Ingress Controller (로드 밸런서)
만약 클러스터가 완전히 새로운 상태라면, Route53 호스팅 영역 생성과 Ingress Controller 설치를 먼저 진행해야 한다
Amazon RDS 생성 및 설정
RDS 생성
AWS Console → RDS → 데이터베이스

데이터베이스 생성

| 설정 항목 | 선택 값 | 설명 |
| 생성 방법 | 손쉬운 생성 | 기본 설정을 자동으로 구성 |
| 엔진 옵션 | MySQL | – |
| 인스턴스 타입 | 프리 티어 | 학습용 (프로덕션은 다른 옵션 선택) |
| DB 인스턴스 식별자 | 기본값 유지 | 필요시 변경 가능 |
| 마스터 사용자 이름 | admin | 기본값 유지 권장 |
| 암호 관리 | 암호 자동 생성 | AWS가 안전한 암호 자동 생성 |


데이터베이스 생성 버튼 클릭 후, 우측 상단의 “자격 증명 세부 정보 보기” 팝업에서 마스터 암호를 반드시 복사하여 보관한다. 이 암호는 Spring 애플리케이션에서 RDS 접속 시 사용되므로 안전하게 보관해야 한다


보안 그룹 설정 (3306 포트 오픈)
보안 그룹 설정이 필요한 이유
AWS 구조:
┌─────────────────┐ ┌─────────────────┐
│ EKS 클러스터 │ │ RDS │
│ ┌───────────┐ │ │ ┌───────────┐ │
│ │ EC2 (Pod) │──┼────X────┼─→│ MySQL │ │
│ └───────────┘ │ │ │ :3306 │ │
└─────────────────┘ │ └───────────┘ │
│ (보안 그룹 차단) │
└─────────────────┘
기본적으로 RDS는 디폴트 보안 그룹으로 보호되어 있어, 외부에서 접근이 불가능하다. EKS의 Pod가 RDS에 접근하려면 3306 포트(MySQL 기본 포트)를 인바운드 규칙에 추가해야 한다
RDS 데이터베이스 목록 → 생성한 DB 클릭

연결 & 보안 섹션 → 보안 그룹 클릭




규칙 추가
- 유형: MySQL/Aurora
- 프로토콜: TCP
- 포트 범위: 3306
- 소스: Anywhere-IPv4 (0.0.0.0/0)
규칙 저장
보안 주의 사항: 프로덕션 환경에서는 Anywhere 대신 EKS 클러스터의 보안 그룹만 허용하는 것이 안전하다
퍼블릭 엑세스 허용
퍼블릭 엑세스가 필요한 이유
| 접근 주체 | 퍼블릭 엑세스 필요 여부 |
| EKS Pod → RDS | 불필요 (AWS 내부 통신) |
| 개발자 로컬 PC → RDS | 필요 (외부에서 접근) |
개발자가 로컬에서 DataGrip, MySQL Workbench 등의 도구로 RDS에 접속하려면 퍼블릭 엑세스를 허용해야 한다
- 스키마(데이터베이스) 생성
- 데이터 조회 및 관리
- 문제 발생 시 디버깅
설정 방법
RDS 데이터베이스 목록 → 생성한 DB 클릭 → 수정
추가 구성 펼치기 → 퍼블릭 엑세스 가능 선택

계속 → 즉시 적용 선택 → DB 인스턴스 수정

DataGrip / MySQL Workbench 연결 설정
- 연결 이름: spring-rds (임의 지정)
- 호스트: RDS 엔드포인트 (예: database-1.xxxxxx.ap-northeast-2.rds.amazonaws.com)
- 포트: 3306
- 사용자: admin
- 암호: 지정한 마스터 암호

Test Connection 클릭하여 연결 성공 확인 후 OK
스키마 생성
RDS에 접속한 후 다음 쿼리를 실행한다
CREATE DATABASE ordersystem;
JPA와 스키마 생성: Spring JPA는 테이블을 자동으로 생성할 수 있지만, 데이터베이스(스키마) 자체는 수동으로 생성해야 한다
스키마 확인
SHOW DATABASES;
ordersystem이 목록에 나타나면 성공이다
용어 참고
MySQL에서는 “스키마”와 “데이터베이스”가 동일한 개념이다. Oracle 등 다른 DBMS에서는 다를 수 있다
Amazon ECR 생성
ECR(Elastic Container Registry)은 AWS에서 제공하는 Docker 이미지 저장소로, Docker Hub와 동일한 역할을 한다
Docker Hub 대신 ECR을 사용하는 이유
- EKS와 네이티브 통합
- AWS IAM 기반 보안 관리
- 동일한 리전 내 빠른 이미지 Pull
- 실무에서 EKS – ECR 조합이 표준
ECR 리포지토리 생성
AWS Console → ECR 검색 또는 EKS 관련 서비스에서 Amazon ECR 클릭
리포지토리 → 리포지토리 생성

리포지토리 이름 – order-backend (프로젝트명에 맞게 변경)

나머지 설정은 기본값 유지 후 리포지토리 생성

생성된 리포지토리는 다음과 같은 형식의 URI를 갖는다
<aws-account-id>.dkr.ecr.<region>.amazonaws.com/order-backend
이 URI는 이후 Docker 이미지 push/pull 시 사용된다
Redis Pod 및 Service 생성
Redis 구성 방식
- Kubernetes Pod: 캐시 데이터는 휘발성 허용
- AWS ElastiCache: 학습 단계에서는 불필요한 비용
Redis YAML 작성 – redis.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis
namespace: hyeok # 본인의 namespace로 변경
spec:
replicas: 1
selector:
matchLabels:
app: redis
template:
metadata:
labels:
app: redis
spec:
containers:
- name: redis
image: redis
ports:
- containerPort: 6379
---
apiVersion: v1
kind: Service
metadata:
name: redis-service # Spring에서 이 이름으로 접근
namespace: hyeok # 본인의 namespace로 변경
spec:
ports:
- port: 6379
targetPort: 6379
selector:
app: redis # Deployment의 label과 일치
YAML 구성 요소 설명
Deployment 섹션
| 설정 | 값 | 설명 |
| metadata.name | redis | Deployment 이름 |
| metadata.namespace | hyeok | 본인의 namespace로 변경 |
| spec.replicas | 1 | Redis Pod 1개만 실행 |
| spec.selector.matchLabels | app:redis | 관리할 Pod 선택 기준 |
| template.metadata.labels | app:redis | 생성될 Pod의 레이블 |
| containers.image | redis | Docker Hub의 공식 Redis 이미지 |
| containers.ports | 6379 | Redis 기본 포트 |
Service 섹션
| 설정 | 값 | 설명 |
| metadata.name | redis-service | Spring 설정에서 이 이름 사용 (매우 중요) |
| spec.ports.port | 6379 | Service가 노출하는 포트 |
| spec.ports.targetPort | 6379 | Pod의 containerPort와 일치 |
| spec.selector | app:redis | Deployment의 label과 일치 |
redis-service라는 Service 이름은 Spring의 application.yaml에서 Redis 호스트로 사용한다
Redis 배포
# YAML 파일이 있는 디렉토리로 이동 cd /path/to/yaml/files # Redis 배포 kubectl apply -f redis.yml 예상 출력: deployment.apps/redis created service/redis-service created
배포 확인
kubectl get pod -n hyeok NAME READY STATUS RESTARTS AGE redis-xxxxxxxxx-xxxxx 1/1 Running 0 10s