본문 바로가기

인프라,데이터/네트워크

당신이 새 AWS 계정의 DB에 연결할 수 없는 이유

*주의 : 네트워크 알못의 삽질-깨달음의 과정입니다.

이 글을 읽는 여러분은 "너무 당연한 거 아닌가... 이걸 몰라...? 하실 수 있습니다."


 

새로 토이프로젝트를 시작합니다.

설레는 마음으로 AWS 계정을 생성합니다.

보안 수칙을 지켜야 하니까, 디폴트 VPC 말고 새로 VPC를 만들고, 

인터넷 게이트웨이가 없는 프라이빗 서브넷을 2가지 존에 만들고,

인터넷 게이트웨이가 있는 퍼블릭 서브넷을 2가지 존에 만듭니다.

프라이빗 서브넷에서 요청이 밖으로 나갈 수 있도록 Nat Gateway를 만들어 퍼블릭 서브넷에 둡니다.

 

원래는 DB용 프라이빗 서브넷 따로 만드는데.. 그림에 반영하는 걸 깜박 했습니다 ^^

여기까지 하면 대략 이런 구성이 됩니다.

프라이빗 서브넷에 DB와 서버를 놓고, DB와 서버는 서로 보안그룹 등을 통해 통신하게 하고,

프라이빗 서브넷의 서버는 인터넷 망으로 요청이나 응답을 보낼 때 Nat Gateway -> Internet Gateway를 거칩니다.

 

그런데, 이 VPC가 개발 환경이라면,

개발자는 자신의 노트북으로 작업을 하면서 편하게 DB에 쿼리도 날려보면서 테스트를 하고 싶을 것입니다.

그러려면 개발자의 노트북에서, 이 VPC의 프라이빗 서브넷에 있는 DB에 요청을 보내야 합니다.

AWS에서 DB를 생성하면 클러스터 엔드포인트를 생성해줍니다.

test.cluster-abc.ap-northeast-2.docdb.amazonaws.com

같이요.

 

그리고 mongo shell을 통해서 다음과 같이 연결할 수 있다고도 콘솔에서 알려줍니다.

mongo --host test.cluster-abc.ap-northeast-2.docdb.amazonaws.com:27017 --username user123 --password <Password>

그런데... 

저 주소로 요청을 날리면 연결이 될까요?

물론 DB에 붙어있는 보안그룹에, 개발자의 노트북의 퍼블릭 IP에서 요청을 보낼 수 있도록 inbound rule을 추가해줬습니다.

 

그런데 DBMS에서 계속 Timed out이 뜹니다.

아무리 기다려도 연결될 기미가 보이지 않습니다.

왜일까요?

 


nslookup으로 DB의 클러스터 주소를 조회해보면,

프라이빗 ip 주소가 Address로 리턴됩니다.

이 주소는 VPC내의 DB가 위치한 서브넷에 있는, DB의 보안 그룹에 붙어있는 ENI가 가지고 있는 프라이빗 ip 주소입니다.

그런데... 이 서브넷은 인터넷 게이트웨이가 없는 프라이빗 서브넷입니다.

외부에서 요청을 아무리 이 ip로 한들, 이 주소로 들어오지 못합니다.

 

만약 개발자의 노트북 같이 VPC 외부에서 요청을 하면서도 DB에 연결을 하려면 2가지 방법이 있습니다.

 

1. bastion 서버를 퍼블릭 서브넷에 만든다.

개발자가 노트북에서 ssh로 접근할 수 있는 bastion 서버를 퍼블릭 서브넷에 만들어줍니다.

bastion 서버와 DB의 연결을 보안그룹에서 허용해줍니다.

그러면 개발자는 1) bastion 서버에 ssh로 접속해서 2)DB에 쿼리를 날릴 수 있습니다. 

 

2. AWS Session Manager를 이용합니다.

(이때도 DB에 연결할 인스턴스는 필요합니다.)

AWS Session Manager를 이용하면,

DB와 연결할 bastion 서버를 프라이빗 서브넷에 띄울 수 있습니다.

Session Manager Agent가 인스턴스에 설치되어 있다면, (AmazonLinux2 인스턴스에는 기본으로 설치되어 있습니다.)

보안그룹의 포트를 별도로 열 필요 없이 이 서버에 세션 매니저로 접근이 가능합니다. 

또한 접속에 필요한 SSH/PEM 키를 관리할 필요도 없습니다.

(액세스 관리는 AWS Identity and Access Management - IAM 에서 담당한다고 합니다.)

이게 어떻게 가능한지는 사실 잘 모르겠지만.. AWS 매니지드 서비스니까 AWS 내부 망을 통해서 이게 가능한 듯 싶습니다.

이 방법이 1번 방법보다는 보안적으로 더 낫습니다.

 


배운 것 :

DB는 프라이빗 서브넷에 만들면 된다고 배웠는데,

그렇게만 만들면 접속이 안 됩니다...

DB와 접속할 수 있는 bastion 용 인스턴스가 있어야 접근이 가능합니다.

그것이.. 프라이빗 서브넷이니까...(끄덕)

 

 

참고 : https://aws.amazon.com/ko/blogs/tech/securely-connect-to-an-amazon-rds-or-amazon-ec2-database-instance-remotely-with-your-preferred-gui/

 

GUI 환경을 이용하여 안전하게 Amazon RDS 또는 Amazon EC2 DB 인스턴스에 원격 접근하기 | Amazon Web Service

이 글은 AWS Database Blog에 게시된 Securely connect to an Amazon RDS or Amazon EC2 database instance remotely with your preferred GUI by Jonathan Kerr, Uwe Kuechler, and Vincent Lesierse를 한국어로 번역 및 편집하였습니다. 데이터베

aws.amazon.com