Project/페이스콕

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

gilbert9172 2025. 2. 18. 18:19

 

❐ 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이 서비스 종료한 이 시점에서 최고의 선택이 아닌가 싶다.