TIL - 20250929

juni·2025년 9월 29일

TIL

목록 보기
139/317

0929 AWS : EC2 애플리케이션과 RDS 데이터베이스 연동


✅ 1. 목표: 애플리케이션 서버와 데이터베이스 서버의 분리 및 연동

  • 오늘의 목표는 실제 운영 환경과 유사하게, 애플리케이션을 실행하는 서버(EC2)데이터를 저장하는 서버(RDS)를 물리적으로 분리하고, 이 둘을 안전하게 연결하는 것입니다.

  • 왜 분리하는가?

    • 관리 효율성: RDS는 AWS가 관리해주는 서비스이므로, 우리는 DB 설치, 백업, 패치 등의 복잡한 작업에서 해방됩니다.
    • 확장성 (Scalability): 트래픽이 증가할 때, 애플리케이션 서버(EC2)와 데이터베이스 서버(RDS)를 각각 독립적으로 확장(Scale-out/up)할 수 있습니다.
    • 보안: 데이터베이스를 외부 인터넷에 직접 노출시키지 않고, 오직 허가된 애플리케이션 서버만 접근하도록 제한하여 보안을 강화할 수 있습니다.

✅ 2. RDS 인스턴스 생성 및 설정

  • EC2에 데이터베이스(e.g., MariaDB)를 직접 설치하는 대신, AWS의 완전 관리형 서비스인 RDS를 사용하여 데이터베이스 인스턴스를 생성했습니다.

➕ 주요 설정 포인트

  1. 데이터베이스 엔진 선택: MariaDB, MySQL, PostgreSQL 등 원하는 관계형 데이터베이스를 선택합니다.
  2. 자격 증명 (Credentials): 데이터베이스에 접근할 마스터 사용자 이름과 비밀번호를 설정합니다. 이 정보는 매우 중요하므로 안전하게 관리해야 합니다.
  3. 네트워크 및 보안:
    • VPC (Virtual Private Cloud): 우리의 AWS 리소스를 격리시키는 가상 네트워크 공간을 지정합니다.
    • 보안 그룹 (Security Group): RDS 인스턴스의 가상 방화벽입니다. 처음에는 어떤 외부 접근도 허용하지 않도록 설정됩니다.
  4. 엔드포인트 (Endpoint):
    • RDS 인스턴스가 생성되면, my-database.xxxxxxxxxxxx.ap-northeast-2.rds.amazonaws.com과 같은 고유한 엔드포인트(주소)가 부여됩니다.
    • EC2의 애플리케이션은 이 엔드포인트를 통해 데이터베이스에 접속하게 됩니다.

✅ 3. 핵심: 보안 그룹을 통한 안전한 연결 설정

  • 가장 중요한 개념: 보안상의 이유로 RDS는 기본적으로 외부 접근이 차단되어 있습니다. 따라서 EC2 인스턴스가 RDS에 접근할 수 있도록 명시적으로 허용해 주어야 합니다.

➕ 연결 흐름 및 설정 방법

  1. EC2 인스턴스는 자신만의 보안 그룹(A)을 가집니다.
  2. RDS 인스턴스도 자신만의 보안 그룹(B)을 가집니다.
  3. RDS의 보안 그룹(B)의 인바운드(Inbound) 규칙을 수정합니다.
    • 유형: MYSQL/Aurora (포트 3306)
    • 소스 (Source): 특정 IP 주소를 입력하는 대신, EC2의 보안 그룹(A)의 ID (sg-xxxxxxxx)를 지정합니다.
  • 왜 IP 주소 대신 보안 그룹 ID를 사용하는가?
    • EC2 인스턴스의 IP 주소는 변경될 수 있지만, 보안 그룹 ID는 고유하고 불변합니다.
    • 이 설정을 통해, "IP 주소가 xxx.xxx.xxx.xxx인 컴퓨터"가 아닌, "보안 그룹 A에 속한 모든 EC2 인스턴스"에게만 데이터베이스 접근을 허용하게 됩니다. 이는 훨씬 더 유연하고 안전한 AWS 네이티브 방식의 연결 방법입니다.

✅ 4. EC2에 애플리케이션 배포 및 데이터베이스 연동

  • EC2 인스턴스에 접속하여 Git으로부터 프로젝트를 클론하고, 애플리케이션이 RDS를 바라보도록 설정을 변경했습니다.
  1. EC2 준비: EC2 인스턴스에 접속하여 Java(JDK), Git 등 애플리케이션 실행에 필요한 런타임을 설치합니다.

  2. 프로젝트 클론: git clone 명령어로 EC2 인스턴스에 소스 코드를 내려받습니다.

  3. 데이터베이스 연결 정보 설정 (환경 변수):

    • 나쁜 방법: application.yml 파일에 RDS 엔드포인트와 비밀번호를 직접 하드코딩하는 것. (보안에 매우 취약)
    • 좋은 방법: EC2 인스턴스의 환경 변수(Environment Variables)를 통해 연결 정보를 주입합니다.
      # EC2 터미널에서 환경 변수 설정
      export DB_HOST=your-rds-endpoint.rds.amazonaws.com
      export DB_USERNAME=your_master_username
      export DB_PASSWORD=your_master_password
    • Spring Boot 애플리케이션(application.yml)은 ${DB_HOST}와 같은 구문을 사용하여 이 환경 변수들을 읽어오도록 설정합니다.
  4. 애플리케이션 실행 및 테스트:

    • 프로젝트를 빌드하고(./gradlew build), JAR 파일을 실행합니다(java -jar ...).
    • 애플리케이션 로그를 확인하여 데이터베이스 커넥션 풀이 성공적으로 생성되었는지 확인합니다.
    • API를 호출하여 실제로 데이터가 RDS에 저장되고 조회되는지 최종 테스트를 진행합니다.

📌 요약

  • 운영 환경에서는 애플리케이션(EC2)데이터베이스(RDS)분리하여 관리 효율성과 확장성, 보안을 높입니다.
  • EC2와 RDS 간의 안전한 통신은 보안 그룹(Security Group)을 통해 이루어지며, IP 주소 대신 보안 그룹 ID를 소스(Source)로 지정하는 것이 핵심입니다.
  • 애플리케이션의 데이터베이스 연결 정보는 코드에 하드코딩하는 대신, EC2 인스턴스의 환경 변수를 통해 안전하고 유연하게 주입해야 합니다.

0개의 댓글