VPC는 AWS서비스에서 제공하는 전용 가상 네트워크 계층이다
서브넷은 VPC의 IP 주소 범위이다.
VPC가 AWS의 네트워크 계층이라는 말은
AWS라는 클라우드에서 VPC는 다른 가상 네트워크와 분리되어있다는 말이다.
EC2 인스턴스 같은 AWS 리소스는 그림처럼 VPC안에서 실행할 수 있다.
VPC를 만들땐 IPv4 주소의 범위르 지정해야하는데 이는 CIDR 표기법으로 지정해야한다.
디비서버는 EC2를 사용할때의 이야기다.
먼저 디비를 이미지처럼 분리했으므로
public server에서 private server로 접속하도록 해줘여한다.
어떻게하나?
public server에 접속할때 ssh key를 가지고 가면 된다.
bash에서 ssh를 통해 서버에 접속할때 ssh -i
로 시작하는데 이때 옵션을 -A라는 옵션을 넣어주면 key를 가지고 들어갈수있다.
ssh-add -K <private-server-key-name>.pem // 키를 등록 (잘모르겠음)
ssh-add -L // 키를 리스트에서 확인
ssh -A -i <private-server-key-name>.pem <public-server-name>@<public-server-ip>
-A
를 이용해서 key를 가지고 들어간 상태에서
ssh <private-server-name>@<private-server-ip>
이렇게 입력하면 접속할 수 있다.
위에 방법대로 접속할 수 있는데 문제가 있다.
디비(private)인스턴스에서 소프트웨어 업데이트시(apt update나 mysql 설치 등)에 어떻게 인터넷에 접속해야하나?
AWS 문서에서 보면 NAT Gateway를 이용해서 인터넷에 접속할 수 있다.
NAT Gateway 사용하면 private subnet 인스턴스를 인터넷 또는 기타 AWS 서비스에 연결할 수 있으면서 동시에 외부에서는 연결을 시작하지 못하게할수있다.
근데 요금이 있다.
데이터 처리 요금은 트래픽 소스나 대상과 관계없이 NAT Gateway를 통해 처리된 각 기가바이트에 적용된다고 하고, 1시간 미만의 각 NAT 게이트웨이 사용시간은 1시간으로 청구된다.
추가+ Elastic IP를 연결된(associated) NAT gateway를 먼저 삭제하고 Elastic IP 를 삭제하려니까 존재하지않는 NAT gateway라고 뜨면서 연결해제가 되지않는다..패닉에 빠졌으나 시간이 지나니까 저절로 연결이 해제됨
이제 어떻게 스프링부트에서 프라이빗서버까지 갈수있도록 설정할것인가 생각해봐야한다
SSH 터널링을 이용하면 된다.
요약하면 다음과 같다.
ssh -CNf -L 3307:localhost3306 <private-server-ip>
8080으로 들어오면 -> 톰캣 -> ./api 해당주소에대한 매핑 ->
-> localhost:3307 (public server) 요청 -> private server의 localhost:3306 으로 포워딩
처음에 나는 스프링부트에서 application.properties에 db접속에 관한 설정이 있기 때문에 여기서 ssh 터널링하는 방법을 찾아보려고했다.
찾아보니 라이브러리를 이용한 방법이 있긴하다.
근데 코드가 복잡해보임.
이렇게하는게 맞나 스스로 의심이 갔다.
좀 더 찾아보니 스택오버플로우에서 서버에 특정포트로 요청이 오면 다른 서버로 포워딩 시켜줄 수 있는 방법이 있엇다.
그게 ssh -CNf -L
해서 포트포워딩 하는 방법이다.
이렇게하면 처음에 클라이언트에서 8080포트를 통해 톰캣으로 api 주소에 대해서 매핑을 요청한다.
그러면 톰캣은 미리 db설정에서 localhost:3307 한것을 보고 로컬의 3307포트로 접속을 시도한다.
이때 3307포트가 오면 다른서버로 포워딩하도록 백그라운드에 해당명령어로 ssh를 실행(?) 해놓았기 때문에 자기가 지정한 서버(private server)의 localhost:3306을 요청한다.
그럼 끝!
참고