TIL 2021.05.12 [AWS/DB서버분리]

Kyu·2021년 5월 12일
1

TIL

목록 보기
122/322

1. VPC/Subnet

VPC는 AWS서비스에서 제공하는 전용 가상 네트워크 계층이다

서브넷은 VPC의 IP 주소 범위이다.

VPC가 AWS의 네트워크 계층이라는 말은
AWS라는 클라우드에서 VPC는 다른 가상 네트워크와 분리되어있다는 말이다.
EC2 인스턴스 같은 AWS 리소스는 그림처럼 VPC안에서 실행할 수 있다.

VPC를 만들땐 IPv4 주소의 범위르 지정해야하는데 이는 CIDR 표기법으로 지정해야한다.

2. 배포서버(public)와 DB서버(private)

디비서버는 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>

이렇게 입력하면 접속할 수 있다.

3. NAT Gateway와 DB서버(private)

위에 방법대로 접속할 수 있는데 문제가 있다.

디비(private)인스턴스에서 소프트웨어 업데이트시(apt update나 mysql 설치 등)에 어떻게 인터넷에 접속해야하나?

AWS 문서에서 보면 NAT Gateway를 이용해서 인터넷에 접속할 수 있다.

NAT Gateway 사용하면 private subnet 인스턴스를 인터넷 또는 기타 AWS 서비스에 연결할 수 있으면서 동시에 외부에서는 연결을 시작하지 못하게할수있다.
근데 요금이 있다.
데이터 처리 요금은 트래픽 소스나 대상과 관계없이 NAT Gateway를 통해 처리된 각 기가바이트에 적용된다고 하고, 1시간 미만의 각 NAT 게이트웨이 사용시간은 1시간으로 청구된다.

하는 방법

  1. Elastic IP 생성
  2. NAT Gateway 생성
  3. 라우팅테이블에 추가
  4. private subnet에 생성한 라우팅테이블을 추가
  5. EC2 인스턴스에 그 private subnet을 연결 (이미연결된걸 아마 수정하겠지?)
  6. NAT Gateway는 시간당 돈이 들기때문에 얼른 설치할꺼 설치하고
    NAT Gateway 삭제.

추가+ Elastic IP를 연결된(associated) NAT gateway를 먼저 삭제하고 Elastic IP 를 삭제하려니까 존재하지않는 NAT gateway라고 뜨면서 연결해제가 되지않는다..패닉에 빠졌으나 시간이 지나니까 저절로 연결이 해제됨

4. SSH 터널링을 통한 DB서버(private) 접속

이제 어떻게 스프링부트에서 프라이빗서버까지 갈수있도록 설정할것인가 생각해봐야한다
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을 요청한다.
그럼 끝!

더 해봐야할것

  • Nginix 앞단에 두고 8080포트 없애기

참고

profile
TIL 남기는 공간입니다

0개의 댓글