퍼블릭 액세스를 허용하지 않은 AWS RDS에 접근하는 방법

현재 우리 프로젝트의 dev 환경 중 일부는 private subnet에 위치한다.

보안을 이유로 RDS 또한 퍼블랙 액세스를 허용하지 않았기 때문에 퍼블릭 IP를 할당 받지 않았다.

그렇다면 이 RDS에는 어떻게 접근할 수 있을까?

 

우선 내가 생각하기에는 public subnet에 bstion server를 만들어서 접근하는게 가장 정석적인 방법이라고 생각했다.

 

AWS 설정하기

RDS에 적용된 보안 그룹은 위와 같다.

10.0.0.0/23은 public subent이므로 해당 ip에서 3306으로 요청이 들어오는것은 허용한다.

 

다음으로 public subnet에 ec2를 생성한다.

참고로 public subnet은 internet gateway를 통할 수 있도록 라우팅 설정을 해주어야 로컬환경에서 접속을 해볼 수 있다.

그리고 해당 ec2에 적용되는 보안 그룹은 위와 같다.

개발 환경의 ip로 ssh요청과 3306요청을 허용해주었다.

 

Data Grip으로 연결하기

host에 RDS 엔드포인트를 입력해주고 기타 설정들을 입력.

포트는 3306이다.

다음으로 SSH tunnel을 설정해주어야한다. SSH/SSL 탭을 선택하고 Use SSH tunnel 체크한 다음에 오른쪽에 ... 을 누르면 다음과 같이 나온다.

Host에는 EC2의 public IP를 입력해주고 bastion 용으로 만든 ec2가 amazon linux2를 사용 중이기 때문에 ec2-user로 username을 적어주었다.

Authentication type의 경우 key pair로 설정 후에 ec2에서 사용 중인 pem파일을 선택해준다.

Test Connection을 눌러서 이렇게 뜬거면 정상적으로 접속이 가능한 것이다!

 

여기까지는 이제 생각한데로 잘 풀렸는데

그렇다면 로컬에서 개발중인 스프링 프로젝트들의 환경 설정은 대체 어떻게 해줘야 하는걸까?

스프링 설정으로 ssh tunnel을 해줄 수 있는지 모르겠어서 열심히 검색을 했다.

 

로컬 개발 환경에서 스프링 프로젝트 설정하기

인텔리제이 터미널에서 ssh 접속을 해준다.

 ssh -i {key파일} ec2-user@{퍼블릭 서브넷 IP} -L 3306:{RDS 엔드포인트}:3306

그리고 database URL은 다음과 같이 작성해줄 수 있다.

  datasource:
    url: jdbc:mysql://localhost:3306/{스키마}?serverTimezone=Asia/Seoul&characterEncoding=UTF-8
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: 
    password:

 

위와같이 localhost로 작성하고 실행시키면 정상적으로 잘 동작하는걸 확인 할 수 있다.