[AWS RDS] 퍼블릭 액세스 허용안할 시 스프링부트 yml 설정 방법(SSH 터널링) , AWS 과금 문제

Elmo·2024년 8월 18일
2

정말 이 부분때문에 고생했습니다..저처럼 헤매는 분들이 없기를 바라며 글을 작성했습니다!

1. RDS 퍼블릭 액세스 허용으로 인한 과금 해결

분명 프리티어 기간이 남았는데도 불구하고 프로젝트에서 사용하는 aws 계정에서 과금이 됐습니다. 원인을 알아보니 IPv4 할당으로 인한 과금이었습니다.

RDS 처음 생성 시 보통 EC2에 직접 연결이 아닌 연결하지 않음을 선택하고 퍼블릭 액세스 허용을 선택하는 경우가 많습니다. 이렇게 해야만 스프링부트나 외부에서 작업 시 연결이 가능하기 때문입니다. 하지만 RDS에 퍼블릭 ip가 할당되고 과금으로 이어집니다..결국 퍼블릭 액세스를 허용하지 않고 EC2에 직접 연결하는 방법을 선택했습니다.

VPC 외부의 애플리케이션에서는 직접 접근이 불가능합니다. 물론 연결된 EC2 내에서는 RDS에 접근이 가능합니다. 다만 스프링부트에서 작업 시 문제가 발생합니다.

2. 스프링부트에서 yml 설정 문제 발생

DataGrip이나 WorkBanch에서는 RDS 접근이 가능했습니다. SSH 터널링 방식을 선택하고 host를 EC2 인스턴스 정보로 설정하여 EC2 생성 시 받은 키 파일 인증을 통해 접속할 수 있었습니다. 해당 방법은 다음 글을 참고해주세요.

SSH 터널링으로 RDS와 DataGrip 연결

다만 스프링부트에서 작업 시 문제가 발생했습니다.
우리는 보통 application.yml에 RDS 정보를 기입하여 데이터베이스를 연결합니다.

spring:
    datasource:
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://{엔드포인트}:{포트번호}/{(초기)데이터베이스}?serverTimezone=Asia/Seoul&characterEncoding=UTF-8
        username: {마스터 사용자 이름}
        password: {마스터 암호}

평소처럼 엔드포인트에 RDS 엔드포인트를 넣고 서버를 실행하였더니 Connection timed out 에러가 발생했습니다. 가끔 RDS 보안 그룹에 제 ip로부터의 접근을 허용해놓지 않으면 이와 같은 에러가 발생하기도 합니다. 하지만 현재 저의 ip를 RDS 보안 그룹에 추가한 상태이기 때문에 이 문제는 아니었습니다.

퍼블릭 액세스를 허용하지 않았기 때문에, 외부의 스프링부트 애플리케이션이 이전처럼 yml에 RDS 엔드포인트를 기입하는 방식으로 실행할 수 없었습니다..

이를 해결하기 위해서는 DataGrip에서 SSH 터널링 방식으로 EC2 호스트를 통해 RDS에 접근한 방식을 사용해야했습니다.

3. 해결 방법

[Spring] 수숙관 프로젝트 실행하기(Spring Boot, IntelliJ, MySQL, ssh)
위의 블로그를 참고해서 해결할 수 있었습니다.

# Spring DataSource (MySQL)
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3307/DB이름?serverTimezone=Asia/Seoul&characterEncoding=UTF-8
spring.datasource.username=RDS 사용자 이름
spring.datasource.password=RDS 암호

호스트를 위와 같이 localhost로 지정해야합니다. 그 후 터미널에서 다음 명령어를 통해 ssh 접속 후 서버를 실행하면 RDS에 연결할 수 있습니다.

ssh -i <SSH key of EC2 instance> ec2-user@<instance-IP of EC2> -L 3307:<RDS DB endpoint>:3306

위의 블로그에서는 3306으로 돼있지만, 저의 경우 로컬에 이미 mysql이 실행 중이었기 때문에 3306포트를 사용 중이었습니다. 처음에 yml에서 포트 번호를 3306으로 설정하고 ssh 접속 후 서버를 실행하였더니 자꾸만 로컬 디비에 접근하려고 했습니다.

위와 같이 yml 포트번호와 터미널 명령어에서 3307로 바꾼 후 RDS DB에 접속이 가능했습니다.

물론 RDS DB endpoint:3306 이 부분은 RDS 생성 시 설정한 포트 번호로 해야합니다!

이는 ssh 터널링 접속을 통해 localhost의 해당 포트 번호에 대한 요청을 원격으로 RDS에 전달해준다고 합니다. ec2에서는 rds에 접속이 가능하니 ec2를 거치는 방법이 아닐까 생각합니다.

혹시나 매번 터널 접속 후 서버를 실행하는 것이 번거롭다면 코딩을 통해 ssh 터널링 접속을 할 수 있습니다. 아래 링크를 참고해주세요.
https://letsmakemyselfprogrammer.tistory.com/123

흑흑 이거 때문에 몇 시간 날렸습니다... 도움이 된다면 좋겠네요
확실히 퍼블릭 액세스를 허용했을 때 설정 방법이 편하긴 합니다.

profile
엘모는 즐거워

0개의 댓글

관련 채용 정보