DevOps

[Infra/DevOps] 사이드 프로젝트를 위한 AWS 인프라 구축 가이드 (2026 ver.) #2- RDS, SSH 터널링

코딩 기록하는 애기 개발자 2026. 6. 14. 02:13

목차

    지난 글에서는 AWS 인프라의 기본이 되는 네트워크 환경을 구성했다.
    VPC를 생성하고, Public / Private Subnet을 분리했으며, 인터넷 게이트웨이(IGW)와 라우팅 테이블을 통해 네트워크 흐름을 설계했다. 또한 보안 그룹을 이용해 외부 접근과 내부 통신을 제어하고, 실제 애플리케이션이 실행될 EC2 인스턴스까지 생성해보았다.

     

    이제 기본적인 서버 실행 환경은 갖춰진 상태다.

     

    하지만 실제 서비스 구조를 생각해보면, 애플리케이션 서버만으로는 부족하다.
    대부분의 서비스는 사용자 요청을 처리하는 백엔드뿐 아니라, 데이터를 저장하고 관리하는 데이터베이스가 반드시 필요하다.

     

    이번 글에서는 그 다음 단계로, AWS의 관리형 데이터베이스 서비스인 RDS (Relational Database Service) 를 활용해 MySQL 기반 데이터베이스를 구성해본다.

     

    그리고 단순히 DB를 만드는 것에서 끝나는 것이 아니라,
    보안적으로 안전한 구조를 유지하면서도 로컬 환경이나 외부 툴(DataGrip, Workbench 등)에서 접근할 수 있도록 SSH 터널링을 이용한 안전한 접속 방식까지 함께 다뤄볼 예정이다.

     


    1. RDS 구축

    Amazon Web Services의 Amazon RDS(Amazon Relational Database Service, RDS)는 AWS에서 제공하는 관리형 관계형 데이터베이스 서비스이다.

     

    RDS는 MySQL, PostgreSQL, MariaDB, Oracle Database, Microsoft SQL Server 등 다양한 데이터베이스 엔진을 지원한다.

    또한 데이터베이스의 설치, 패치 관리, 백업, 복제, 장애 복구, 스케일링과 같은 운영 작업을 AWS가 대신 처리해주기 때문에, 사용자는 인프라 관리 부담을 줄이고 애플리케이션 개발에 집중할 수 있다는 장점이 있다.

     

    이처럼 Amazon RDS는 단순히 데이터베이스를 “하나 띄우는 서비스”가 아니라, 운영에 필요한 많은 부분을 AWS가 대신 관리해주는 형태의 서비스이다. 즉, 우리가 직접 EC2에 MySQL을 설치하고 설정하던 방식과 달리, DB 인스턴스를 생성하는 것만으로도 운영 가능한 데이터베이스 환경을 빠르게 구성할 수 있다.

     

    이제 RDS를 생성해보면서, 어떤 설정들이 필요한지 하나씩 살펴보자.

     

    1.1 서브넷 그룹 생성

    서브넷 그룹을 생성하기 전에 DB 서브넷 그룹이 무엇인지 이해할 필요가 있다.

     

    Amazon RDS는 기본적으로 특정 VPC 내부에서 동작하는데, 이때 데이터베이스 인스턴스가 어떤 서브넷에 위치할지를 지정해주는 설정이 바로 DB 서브넷 그룹이다.

    간단히 말해, RDS가 배치될 서브넷들의 묶음이라고 이해하면 좋다. 

    💡 자세히 알고 싶다면,
    RDS는 단일 서브넷이 아니라 여러 가용 영역 (AZ)에 걸친 서브넷들을 묶어 구성하게 되는데, 이는 장애 상황을 대비한 고가용성 구조를 만들기 위함이다.

     

    자, 이제 서브넷 그룹을 생성해보자. 

    위 사진과 같은 경로로 이동해 오른쪽 상단에 있는 [DB 서브넷 그룹 생성] 버튼을 클릭한다. 

     

    이후 이름과 설명을 입력하고, 앞서 생성한 VPC를 선택한다.

    그리고 이전에 생성한 Private Subnet이 위치한 가용 영역(AZ)을 기준으로, 해당 Subnet들을 선택해 추가한다.

    모든 설정을 완료한 뒤, 우측 하단의 [생성] 버튼을 클릭하면 DB 서브넷 그룹이 생성된다.

     

    1.2 데이터베이스 생성

    이제 본격적으로 데이터베이스를 생성해보자. 

    [Aurora and RDS] > [데이터베이스] 탭에서 우측 상단에 있는 [데이터베이스 생성] > [전체 구성] 을 클릭한다.

     

    선택한 기준은 돈 이다 .... 학생은 돈이 없기 때문 .............

    최대한 프리티어를 사용하려고 했기 때문에 위 사진과 같이 선택했다. 

     

    스크롤을 아래로 내리면 데이터베이스 이름, 마스터 사용자 이름, 그리고 비밀번호를 설정하는 항목이 나타난다.

     

    이 값들은 실제 데이터베이스 접속 시 사용되는 정보이므로, 원하는 값으로 자유롭게 설정하면 된다.
    다만 이후 접속 과정에서 계속 사용하게 되므로, 반드시 기억하거나 별도로 기록해두는 것이 좋다.

     

    [인스턴스 구성] 항목은 기본 설정을 그대로 유지한다.

    이후 [스토리지] 설정으로 이동한 뒤, [스토리지 자동 조정 활성화] 옵션은 선택 해제한다.

    이유는 ............. 돈을 아껴야 하기 때문 ...........

     

    이후 앞서 사용했던 리소스들(VPC, 서브넷, 보안그룹)을 선택한다. 

     

    그리고 [퍼블릭 엑세스] 옵션은 [아니오]로 설정해야 한다. 

    Amazon RDS를 외부 인터넷에서 직접 접근한 상태로 두지 않기 위함이다. RDS는 일반적으로 애플리케이션 서버 내부에서만 접근하도록 구성하며, 데이터베이스 자체는 Private Subnet 내부에서만 동작하는 구조로 설계하는 것이 안전하다. 

     

    만약 [퍼블릭 엑세스] 옵션을 [예]로 설정하면 인터넷을 통해 직접 DB 엔드포인트로 접근이 가능해지는데,  이는 외부 공격에 노출될 가능성을 증가시키거나, DB 포트를 직접 노출하는 등의 위험을 야기할 수 있다.

    스크롤을 가장 아래까지 내려 [추가 구성] 토글을 연다.
    그 안의
    [백업] 섹션에서 [자동 백업 활성화] 옵션을 선택 해제한다.

     

    이 설정 또한 비용과 직결되기 때문에 실습 환경에서는 비활성화해두는 경우가 많다.

     

    이제 데이터베이스의 모든 설정을 완료했다. 

    [데이터베이스 생성] 버튼을 클릭해 데이터베이스를 생성하자. 

     

    2. SSH 터널링을 이용한 데이터베이스 접속

    일만적으로 로컬에서 개발할 때는 Datagrip이나 Workbench 같은 도구를 사용해 데이터베이스에 직접 접속하여 데이터를 확인하면서 개발을 진행한다. 

     

    하지만 앞서 우리는 RDS를 Private Subnet 내부에 배치하고, Public Access 도 비활성화했기 때문에 외부에서 직접 접근할 수 없다. 

    또한 Public IP가 할당되지 않은 구조이기 때문에, 기존처럼 DB 엔드포인트에 직접 접속하는 방식은 사용할 수 ㅇ벗다.

     

    따라서 이번 단계에서는 보안을 유지하면서 로컬 환경에서 배포된 DB에 접근할 수 있는 방법인 SSH 터널링 (SSH Tunneling)을 사용해 접속을 해볼 것이다. 이 방식은 중간에 EC2 인스턴스를 Bastion Host 처럼 활용하여 안전하게 내부 RDS로 연결하는 구조이다. 

     

    2.1 SSH 터널링의 구조

    현재 RDS는 Private Subnet에 존재하고, EC2는 Public Subnet에 존재한다. 

    그래서 SSH 터널링의 흐름은 다음과 같다. 

    내 PC
      ↓ (SSH)
    EC2 (Bastion Host)
      ↓ (내부 네트워크)
    RDS (MySQL)

     

    즉, SSH 터널링은 내 컴퓨터의 특정 포트를 EC2를 통해 RDS로 연결해주는 우회통로다.

    2.2  DB 접속

    이제 실제로 SSH 터널링을 이용해 로컬 환경에서 Amazon RDS에 접속해보자. 

    01 SSH 터널링 실행

    먼저 로컬 터미널에서 아래 명령어를 실행한다.

    AWS 콘솔의 EC2 [인스턴스 연결 (브라우저 접속)] 로는 SSH 터널링을 사용할 수 없으며, 반드시 로컬 터미널에서 실행해야 한다.  
    ssh -i "key.pem" \
    -L 13306:your-rds-endpoint:3306 \
    ec2-user@EC2_PUBLIC_IP

     

    이 명령어를 실행하면, 내 로컬 PC의 ``13306``포트가 EC2를 거쳐 RDS의 ``3306`` 포트로 연결된다.

    즉, 외부에서는 접근할 수 없는 RDS 를 로컬에서 접속 가능한 것처럼 우회 연결한 상태가 된다. 

    위 명령어로 터미널에서 EC2 인스턴스에 접속 성공

    02 Datagrip 연결

    SSH 터널이 정상적으로 열려 있는 상태에서 Datagrip을 실행하고 아래와 같이 설정한다. 

    • Host : ``127.0.0.1``
    • Port : ``13306``
    • User : RDS 생성 시 설정한 Master Username
    • Password : RDS 생성 시 설정한 Master Password

    이때 중요한 점은 RDS 엔드포인트를 직접 사용하는 것이 아니라 localhost로 접속한다는 것이다.

    SSH 터널이 로컬 포트를 RDS로 연결해주기 때문에 가능한 방식이다. 

     

    이후, 좌측 하단에 [연결 테스트] 를 클릭하면 아래와 같이 접속에 성공한 것을 확인할 수 있다. 

    Datagrip에서 Test Connection 성공

     


    이번 글에서는 AWS에서 관리형 데이터베이스 서비스인 Amazon RDS를 생성하고,
    이를 안전하게 운영하기 위한 네트워크 구조까지 함께 구성해보았다.

     

    단순히 RDS를 생성하는 것에서 끝나는 것이 아니라, Private Subnet 환경에서 외부 접근을 차단하고, EC2를 Bastion Host로 활용한 SSH 터널링을 통해 로컬 환경에서 안전하게 데이터베이스에 접근하는 방식까지 직접 구현해보았다.

     

    다음 글에서는 이 구조 위에서 실제 서비스 운영 환경을 만들어보기 위해

    • CI/CD 파이프라인 구축
    • GitHub Actions를 활용한 자동 배포
    • Docker를 이용한 애플리케이션 컨테이너화

    이 과정을 다뤄볼 예정이다.

     

    그럼 안농 ! 🐾