SSH 터널링으로 private-subnet에 있는 RDS 접근하기
❐ 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이 서비스 종료한 이 시점에서 최고의 선택이 아닌가 싶다.