tunneling with bastion host
지난 포스트에서는 EC2 인스턴스에 PostgreSQL DBMS을 설치하는 방법에 대해 이야기해보았다. 데이터베이스는 정해진 백엔드 어플리케이션의 요청만 받아야 하므로, 나는 PostgreSQL DBMS를 브라이빗 서브넷에 위치한 EC2에 설치하려 했다. 하지만 나는 곧 당혹스러운 상황에 직면하게 되었다.
NAT 게이트웨이를 붙이면 외부로 DBMS 설치 데이터를 요청하고 그 응답을 받을 수 있다. 데이터를 요청하기 위해서는 EC2에 접속해서 명령어를 입력해야 하는데, 문제는 ─ 그야 당연히 "프라이빗" 서브넷인 만큼 ─ 외부 인터넷과 연결된 퍼블릭 IP가 존재하지 않는다는 것이었다. 외부와 연결되어있지 않으니 ssh 접속 자체가 불가능했다.
나는 몇 가지 방법을 생각해보았다. 프라이빗 서브넷에 IGW를 연결시켜서 잠깐동안 퍼블릭하게 만드는 방법이나 프라이빗 서브넷에서 EC2를 생성하고 이를 AIM로 만들어서 프라이빗 서브넷에 새로운 인스턴스로 설치하는 방법 등등.
그렇게 고민하던 와중에 bastion host(퍼블릭 EC2 인스턴스)를 활용한 터널링 기법이라는 것을 알게 되었다. 이를 간단하게 설명하면 포트포워딩을 사용해 퍼블릭 EC2를 가져다가 프라이빗 EC2에 접근하는 방법이다. 클라이언트와 프라이빗 EC2 사이에 존재하는 험준한 산맥을 퍼블릭 EC2라는 터널을 통해 건너가는 만큼 터널링이라는 이름이 퍽 자연스럽다.
사용 방법은 아래와 같다. 주의할 점은 포워딩하는 터미널과 private ec2에 접속하는 터미널이 서로 달라야 한다는 것이다.
// private ec2의 22 포트를 로컬호스트의 33322 포트로 포워딩
ssh -i "bastion-host-key.pem" -L 33322:[ private-ec2-ip ]:22 ec2-user@[ public-ec2-ip ]
// 로컬호스트의 33322 포트로 private ec2에 접속
ssh -i "private-ec2-key.pem" -p 33322 ec2-user@localhost
블로그의 정보
Ayden's journal
Beard Weard Ayden