배경
AWS는 각 Public IPv4 주소에 대해 시간당 0.005달러의 과금을 부과한다.
따라서 과금을 줄이기 위해서는 Public IPv4 사용을 최소화해야 한다.
나는 아래의 목적으로 EC2, RDS에 대해 각각 public ip를 사용했었다.
- EC2: 배포한 서버에 탄력적 IP 매핑
- RDS: intellj와 DB 연결하여 편리하게 DB 수정 및 조회
다행인 점은 EC2는 IPv4 사용이 무료이다.
그래서 RDS 인스턴스만 Public IPv4를 사용하지 않도록 바꾸면 된다.
내부 네트워크로 RDS에 접근하면 IPv4 없이도 RDS 인스턴스에 연결할 수 있다.
아래 그림처럼 외부에서 EC2 public subnet으로 접근하고 이를 통해 다시 RDS private subnet으로 접근한다.

RDS 생성
EC2와 RDS 연결 시 두 인스턴스가 동일한 가용영역에 있어야 네트워크 전송 비용이 발생하지 않는다.
RDS 생성 시 EC2 리소스에 연결 옵션을 클릭하면, EC2와 동일한 가용영역에 RDS가 생성된다.

RDS를 EC2에 연결하면, public IP 주소 할당 옵션이 자동으로 사라진다.

RDS 생성 후 기존 RDS public IP와 새로 생성한 RDS의 private IP를 비교해보았는데
육안상으로는 두 RDS의 엔드포인트가 크게 다르지 않았다.
RDS를 생성했으면 Intellj와 DB를 연결해보자.
EC2 내 RDS 연결하기
AWS EC2 인스턴스에서 RDS 인스턴스에 직접 연결 시 배포용 application.yml은 아래처럼 작성한다.
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://{RDS 엔드포인트}:3306/{DB 이름}
username: {RDS username}
password: {RDS pwd}
앞에서 언급했듯이 EC2 인스턴스가 RDS 인스턴스와 동일 가용 영역에 있어 접근이 가능해야 한다.
로컬에서 실행 시 RDS 연결하기
3307 포트에서 3306 포트로 포워딩할 것이다.
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3307/handsup_prod
username: admin
password: taylor13*
로컬에서 실행할 때 SSH 터널링을 통해 AWS RDS 인스턴스에 연결한다.
3307 포트로 포워딩해서 ssh 터널링을 진행했다.
cd {키 경로}
ssh -i "{key 이름}" -f -N -L {포워딩할포트}:{rds엔드포인트}:{대상포트} {ec2 엔드포인트} -v
해당 명령어를 입력하면 RDS 엔드포인트로 포워딩이 된다.

Intellj에서 DB 접근하기
ssh/ssl 탭에 들어가서 ssh 설정을 추가하자.

... 을 눌러 아래 내용을 추가하자.

Host에 EC2 public IP를, port에 22를 입력한다.
우분투를 사용하므로 Host username은 ubuntu로 입력해 주었다.
private key file에 EC2 key 파일을 넣어주면 된다.
Test Connection을 통해 연결됐는지 확인해 보자.
visible only for this project 옵션을 클릭하면 다른 인텔리제이 프로젝트에서는 해당 ssh 설정이 뜨지 않는다.
이후에는 기존에 public ip로 RDS 연결했던 방법처럼 RDS를 연결해 주면 된다.
RDS 엔드포인트를 host에 넣어주고 계정정보와 DB 정보를 입력하자.

이렇게 하면 RDS DB를 인텔리제이에서 private ip로 접근할 수 있다.