[SPRING] AWS RDS Connection timed out, unable to connect to localhost 연결 오류 해결 방법
문제 상황
DB 연결 문제로 3일을 꼬박 삽질만 했다 ㅎ.ㅎ
AWS RDS 데이터베이스를 EC2가 아니라 외부 IP의 MySQL Workbench와 스프링 부트 프로젝트에 연결하고 싶었다. 그러나 Workbench에서는 unable to connect to localhost, 그리고 Spring Boot에서는 connection timeout이라는 연결 오류가 발생했다.
혹시 다른 블로그 글을 따라해보며 AWS RDS의 보안 그룹을 수정하고 퍼블릭 액세스를 허용해봤지만 여전히 connection timeout, unable to connect to localhost와 같은 RDS 연결 오류가 뜬다면 꼭 이 글을 읽어보길 권한다.
해결 방법
일단 차근차근 AWS RDS 생성 과정부터 살펴보자.
1. RDS 데이터 베이스 생성하기 (퍼블릭 액세스 여부: 예)
일단 AWS > RDS > 데이터베이스 > 데이터베이스 생성 버튼을 눌러 DB를 생성하자. 지웠다 생성했다만 벌써 5번째 T T
나는 Spring F/W에 MySQL DB를 연결하고 싶어서 MySQL를 선택했다.
가난한 대학생은 .. 프리티어로 설정하고, 스토리지 자동 조정 활성화를 체크 해제했다. 스토리지 자동 조정 활성화를 체크하면 나중에 데이터 저장량이 프리티어 임계값을 초과했을 때 자동으로 과금될 수 있으니 주의하자!
DB 연결 오류의 첫 번째 원인은 연결 란에서 체크할 수 있는 퍼블릭 액세스 여부이다. 같은 VPC 내부의 EC2가 아닌 외부 컴퓨터, 내 로컬 컴퓨터에서도 RDS 데이터베이스를 사용하고 싶다면 반드시 퍼블릭 액세스 여부를 예로 체크하자. 이미 RDS 데이터베이스를 만들었더라도 퍼블릭 액세스 여부는 추후에 다시 수정할 수 있다.
두 번째 원인은 VPC 보안 그룹이다. 미리 만들어둔 보안 그룹이 있다면 그걸 넣어주고 없다면 보안 그룹을 새로 생성해서 넣어주자. 나는 이렇게만 설정해준 다음 그대로 데이터베이스를 생성했다.
2. 보안 그룹 규칙 수정
데이터베이스 생성이 끝났다면 이제 데이터베이스에 부여된 보안 그룹 규칙을 수정할 차례이다. 서비스 > EC2 > 네트워크 및 보안 > 보안 그룹으로 들어가 RDS 데이터베이스에 부여된 보안 그룹을 클릭한다.
보안 그룹을 클릭하고 인바운드 규칙 메뉴를 누르면 아래와 같은 창이 보일 것이다.
인바운드 규칙 편집 버튼을 눌러 편집 화면으로 이동하자.
규칙 설정이 귀찮다면 위 사진처럼 MySQL/Aurora 포트(3306)에 Anywhere-IPv4, Anywhere-IPv6 소스를 모두 열어주자. 대신 모든 IP 주소에서 데이터베이스에 접근할 수 있기 때문에 언젠가 보안 이슈가 발생할 수도 있다. 나 같은 경우에는 소스에서 내 IP를 선택해 내 IP에 한해서만 3306 포트를 열어주었다.
3. Private 서브넷을 Public 서브넷으로 변경 (라우팅 테이블 수정)
RDS만 10번 넘게 사용 중인데 위의 두 가지로도 해결이 안되는건 이번이 처음이었다 T T
RDS의 퍼블릭 액세스 여부를 허용하고, 보안 그룹에서 3306 포트까지 열어줬지만 여전히 외부 연결이 안되는 사람들은 대부분 RDS가 사용하는 서브넷이 Public이 아닌 Private이라서 문제가 생기는 것이다. 그래서 서브넷을 Public으로 변경하는 방법에 대해 알려드리고자 한다.
AWS에서 서비스 > VPC > 라우팅 테이블 메뉴로 이동한다.
그러면 이렇게 라우팅 테이블 목록이 나타날텐데 그 중에서 RDS가 사용하고 있는 라우팅 테이블을 클릭한다.
이제 라우팅 테이블 상세 화면에서 라우팅 메뉴 > 라우팅 편집 버튼을 눌러보자.
리소스 ID가 local인 라우팅 하나만 있을텐데, 라우팅 추가 버튼을 눌러 첫 번째 대상 란에는 0.0.0.0/0을 입력하고 리소스 ID(두 번째 대상 란)에서는 인터넷 게이트웨이를 클릭하자. 그러면 자동으로 igw-xxxxxxxx의 ID가 입력될 것이다. 마지막으로 변경 사항 저장 버튼을 누르고 다시 확인해보면 RDS DB가 잘 연결된다!
소감.. ^ㅠ^
그냥 겉핡기 식으로 EC2 만들기, RDS 만들기만 외워놨다가 큰 코 다쳤다. 구글링 과정에서 VPC와 서브넷 원리에 대해 약간 알게 되었는데 이 김에 AWS 자격증이나 준비해봐야겠다..