EKS – Spring 배포를 위한 인프라 구성

배포 절차 개요

전체 배포 단계

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.nameredisDeployment 이름
metadata.namespacehyeok본인의 namespace로 변경
spec.replicas1Redis Pod 1개만 실행
spec.selector.matchLabelsapp:redis관리할 Pod 선택 기준
template.metadata.labelsapp:redis생성될 Pod의 레이블
containers.imageredisDocker Hub의 공식 Redis 이미지
containers.ports6379Redis 기본 포트
Service 섹션
설정설명
metadata.nameredis-serviceSpring 설정에서 이 이름 사용 (매우 중요)
spec.ports.port6379Service가 노출하는 포트
spec.ports.targetPort6379Pod의 containerPort와 일치
spec.selectorapp:redisDeployment의 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

출처 – eks를 활용한 spring 운영서버 배포(feat. devops의 모든것)