SSH 터널링으로 private-subnet에 있는 RDS 접근하기

2025. 2. 18. 18:19·Project/페이스콕

 

❐ Description


현재 RDS는 보안상의 이유로 private-subnet 위치한다. 그래서 매번 콘솔로 접근을 해야하는데,

쫌 번거롭다고 느꼈다. 그래서 오늘은 SHH 터널링을 통해서 private-subnet에 위치한 RDS에 접근하려고 한다.

최종적으로 DataGrip에서 확인할 수 있게 끔 설정을 마무리 해볼 것이다.

 

 

 

 

 

❐ 터널링 준비하기


1. IAM 정책 생성

기본적으로 AmazonSSMManagedInstanceCore 정책이 필요하다.

추가적으로 ssm:DescribeInstanceInformation 권한이 없다면, 아래 command를 실행할 때 권한이 없다는 에러가 발생한다.

 aws ssm describe-instance-information --query "InstanceInformationList[*].[InstanceId, PingStatus, InstanceState, AgentVersion]"

따라서 해당 권한도 커스텀으로 추가해줘야 한다.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Statement1",
            "Effect": "Allow",
            "Action": [
                "ssm:DescribeInstanceInformation"
            ],
            "Resource": "*"
        }
    ]
}

 

 

2. 보안 그룹 및 EC2 생성

1️⃣ 보안 그룹

  • EC2 보안 그룹
    • 인바운드 규칙 : 22 포트 열어줘야 한다.
  • RDS 보안 그룹
    • 인바운드 규칙 : `EC2 보안 그룹`을 소스로 설정해줘야 한다.

 

2️⃣ EC2 생성

  • VPC, Subnet 적절히 선택해서 생성
  • 생성 후 1번에서 생성한 정책 연결
    • 작업 ➙ 보안 ➙ IAM 역할 수정
    • 앞서 생성한 정책 연결

 

3. EC2 SSH 접속 후 설정

1️⃣ [Ubuntu 22.04 LTS] amazon-ssm-agent 설치 & 구동 확인

sudo snap install amazon-ssm-agent --classic
sudo snap list amazon-ssm-agent
sudo snap start amazon-ssm-agent
sudo snap services amazon-ssm-agent

 

2️⃣ Credential 설정

당연하게 처음에 EC2 인스턴스를 생서할 때 `aws configure` 커맨드를 통해서 Credential을 설정했었다.

하지만 기존 Credentiail에는 `ec2-ssm` 관련 정책이 없었기 때문에 ssm을 사용할 수 없었다.

 

결과적으로, 아래의 명령어로 기존 Credential을 제거해주었다.

rm -rf ~/.aws/credentials
rm -rf ~/.aws/config

 

 

3️⃣ 인스턴스 정보 확인하기

터널링을 하기 전에 인스턴스 ID를 확인하자. (물론 AWS 콘솔에서도 확인할 수 있지만 리눅스 명령어로 확인해보자)

aws ssm describe-instance-information --query "InstanceInformationList[*].[InstanceId, PingStatus]" --output text

정책을 잘 적용했고, EC2가 Running 중이라면 아래와 같은 결과를 받아볼 수 있다.

EC2_INSTANCE_ID   Online

 

 

4️⃣ RDS 커넥션 상태 확인하기

마지막으로 3306 포트로의 커넥션이 정상적으로 수행되는지 확인하자.

nc -zv ${rds_end_point} ${port}

 

커넥션에 문제가 없다면 아래와 같은 출력을 확인할 수 있다.

Connection to ${rds_end_point} (${subnet_ip}) ${port} port [tcp/mysql] succeeded!

 

 

4. 로컬에서 커낵션 맺기 

위에서 확인한 EC2_INSTANCE_ID와 PORT를 넣어서 아래의 커맨드를 실행하자.

 [~]
-> % aws ssm start-session --target ${ec2_instance_id} \
    --document-name AWS-StartPortForwardingSession \
    --parameters "localPortNumber=${port},portNumber=${port}"

 

커넥션이 정상적으로 맺어진다면 아래의 출력을 확인할 수 있다.

Starting session with SessionId: ***
Port ${port} opened for sessionId ***.
Waiting for connections...

Connection accepted for session [***]

 

 

 

 

 

❐ DataGrip에서 RDS 접근하기


터널링을 성공적으로 마무리 했으니, 이제는 작업의 생산성을 높이기 위해 DataGrip에서 RDS에 접근해보자.

 

1️⃣ SSH/SSL 설정

  • host : EC2 IPv4
  • username : (나는 ubuntu 22.04 환경이라) ubuntu
  • private key file : `xxx.pem`path 지정

 

2️⃣ Local Port 설정

 

 

 

3️⃣ General 설정

  • host : 여기에는 RDS 엔드 포인트를 넣어야한다 🔥 로컬 호스트 아님!

 

4️⃣ Connection 확인하기

 

 

 

 

 

❐ 마무리


이제 로컬에서도 private-subnet에 있는 RDS에 접근할 수 있게 됐다.

물론 이게 안전성은 떨어질지라도 Cloud9이 서비스 종료한 이 시점에서 최고의 선택이 아닌가 싶다.

 

 

 

 

 


'Project > 페이스콕' 카테고리의 다른 글

DDD(Layerd) 기반으로 설계해보자!  (0) 2025.03.18
RabbitMQ 도입기  (0) 2025.02.20
AWS SQS 도입기  (0) 2025.02.14
API Gateway 구축하기  (0) 2025.02.07
프로젝트 타임라인  (0) 2025.01.13
'Project/페이스콕' 카테고리의 다른 글
  • DDD(Layerd) 기반으로 설계해보자!
  • RabbitMQ 도입기
  • AWS SQS 도입기
  • API Gateway 구축하기
gilbert9172
gilbert9172
gilbert9172 님의 블로그 입니다.
  • gilbert9172
    バックエンド
    gilbert9172
  • 전체
    오늘
    어제
    • All Categories (207)
      • 우테코 7기 (21)
        • 1주차 (8)
        • 2주차 (5)
        • 3주차 (6)
      • Langauge (6)
        • Java (3)
        • Kotlin (3)
      • Back-End (13)
        • SpringBoot (1)
        • Trouble Shooting (0)
        • Setup & Configuration (1)
        • SQL (3)
        • Redis (8)
      • Architecture (6)
        • Multi Module (1)
        • DDD (5)
      • CS (30)
        • Data Structure (6)
        • Operating System (0)
        • Network (12)
        • Database (10)
        • Design Pattern (2)
      • Algorithm (78)
        • 내용 정리 (18)
        • 문제풀이 (60)
      • DevOps (6)
        • AWS (5)
        • Git (1)
      • Front-End (1)
        • Trouble Shooting (1)
      • Project (6)
        • 페이스콕 (6)
      • Book (39)
        • 친절한 SQL 튜닝 (9)
        • 데이터 중심 애플리케이션 설계 (14)
        • 이벤트 기반 마이크로서비스 구축 (6)
        • Spring Batch docs (10)
        • Quartz docs (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    binarysearch
    greedy
    Back-Tracking
    오블완
    부분단조성
    Two-Pointer
    sliding-window
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
gilbert9172
SSH 터널링으로 private-subnet에 있는 RDS 접근하기
상단으로

티스토리툴바