이전에 각 인스턴스를 private subnet에서 새로 구축하면서 aws에서 권장하는 3tier architecture 구조에 점점 가까워지고 있다.
아래 스크린샷을 통해 구조를 확인할 수 있다.
이 중에서 오늘 확인할 부분은 가장 아래에 있는 RDS에 관련된 부분이다.
이전에 이 과정에 대해서 했던 식당 비유의 연장선으로 다시 설명해보겠다.
서두
우리는 식당을 개업했는데, 코로나 등 여러 안전상의 이유로 배달로만 운영할 것이다. 그래서 1번에 보이는 private subnet이라는 지하 어딘가에 식당을 차렸는데 지도에 검색해도 나오지 않는다. 주인도 이 식당이 어딨는진 알지만 쉽게 들어오지 못한다. 꼭 카드키가 필요하다. 이 카드키가 pem파일이라고 생각하면 된다. 오늘은 해당 내용이 아니므로 관련된 내용은 생략하겠다.
그리고 카드키를 통해서 들어오려면 public subnet을 먼저 찾아서 그 안에서 들어와야 한다. 가운데에 보이는 ELB가 배민이라고 보면 된다. 배민에서 알려주는 url대로 우리는 식당에 주문을 할 수 있고, NAT GW가 식당에서 바깥으로 음식을 보내주는 (내부에서 외부로 전송하는) 경로라고 보면 된다.
그런데 식당은 어딨는지도 잘 모르고 그렇게 철저하게 가둬져 있는데, 음식을 만들 식재료와 공간, 여러 내용들을 바깥에다가 놓을 수는 없지 않은가? 그래서 역시 private subnet에 우리의 DB를 넣는다.
오늘 포스팅은 이 부분이다. 인스턴스를 생성을 하든, 스냅샷을 복제를 하든 그 부분은 굳이 찾아보지 않아도 생성 자체는 금방 할 수 있다. 조건만 제대로 읽어보고 해당되는 내용으로 하는게 중요한 것이니까, 오늘은 그래서 프라이빗에서 어떻게 식자재를 꺼내올 것인가에 대한 부분을 다루려 한다.
발단
이 포스팅을 하게 된 계기는, env를 통해서 어떤 rds에 접근할지 로컬, 서버에 둘 다 제대로 세팅하고 연결되는 부분은 잘 확인했다. 그런데 로컬에서는 타임아웃이 되고, 서버에서는 정상적으로 값들이 잘 불러와졌다. 워크벤치에서 어떻게 저장되었는지 확인하려는데, 역시 타임아웃이 되었다.
처음에는 DB에 접근을 못하는거니까 보안그룹에 설정한 ip때문이라고 생각했다. 그래서 현재 ip를 잠시 입력해서 뚫어놓았는데 여전히 DB에 접근하지 못했다. 왜일까?
private 서브넷 안에 있는 private 인스턴스에 직접 접근하지 못해서 public 서브넷에 있는 bastion 인스턴스를 통해서 접근하듯, rds 또한 바로 접근할 수가 없다.
RDS - 데이터베이스에서 해당 DB를 선택하고 상세 내용을 보면, 퍼블릭 액세스 허용 이라는 항목이 있다. 여기서 감이 왔다. 이 부분이 예 라고 되어있으면 당연히 외부의 접근을 허용하는 것이고, 아니오로 되어 있으면 접근할 수 없는 것이다.
그리고 서버에서는 vpc안에 있는 것이기 때문에 그 안에서는 RDS의 데이터를 확인할 수 있지만, 외부에서는 아무리 두드려도 확인할 수 없는 것이다. 어떻게 확인할 수 있을까?
해결과정
워크벤치에서 접속할 서버에 대해 설정할 때 여기서 서버의 정보를 입력할텐데, 여기서 connection Method에서 Standard TCP/IP over SSH를 선택하면 아래 입력칸에 SSH 관련 입력칸이 추가된다.
SSH 관련된 내용을 왜 입력해야 하냐면, 이미 이 포스팅을 본다면 감을 잡았겠지만, bastion에서 ssh 터널링을 통해 private 서버에 접속하듯, 동일한 과정이라고 생각하면 된다.
간단하게 요약하면, 이러한 과정이 필요하다.
1. bastion 서버의 ssh에서 3306 db로 포트포워딩 (이정표를 만들어주는 과정)
2. 워크벤치에서 bastion서버에 대한 ssh정보를 입력해준다.
1. bastion 서버의 ssh에서 3306 db로 포트포워딩 (이정표를 만들어주는 과정)
자 1번과정부터 살펴보자. 터미널에서 bastion서버에 접속한다.
포트포워딩에도 종류가 많지만, 가장 기본인 L, 로컬포워딩으로 진행해보려 한다.
ssh -i "bastion-example.pem" -L 3307:rds-example.ap-northeast-2.rds.amazonaws.com:3306 ubuntu@ec2-bastion-ip.ap-northeast-2.compute.amazonaws.com
pem을 먼저 알려주고, 로컬의 어떤 위치에서 시작할지 알려준다. 3307을 사용했는데, 다른 포트도 상관없다. 그리고 어느 곳으로 이동할지 이정표를 달아준다. 그리고 끝에 도착지점의 포트인 3306을 정해준다. 기본적으로 mysql은 3306포트를 사용한다.
끝에는 처음 입력한 pem에 대한 정보를 알려준다.
정리하면, ssh -i "시작지점의 카드키" -L 출발번지수:도착지점이름:도착지점번지수 출발지점이름 이라고 생각하면 되겠다.
2. 워크벤치에서 bastion서버에 대한 ssh정보를 입력해준다.
사실상 위에서 입력한 ssh정보를 동일하게 입력하는 것이다.
여기서 내가 애매했던 부분은 SSH와 MySQL 서버 두 가지의 패스워드였다.
나는 ssh에 패스워드를 입력하지 않는데..? 그냥 두면 된다.
아래에 있는 MySQL 패스워드는 AWS RDS 마스터암호를 입력하면 되는데, 혹시 암호를 생성하지 않았다면 AWS RDS에서 해당 RDS 선택하여 수정 클릭하면 마스터암호를 설정할 수 있다.
입력하고 나면 Mysql@127.0.0.1:3307@ec2-출발지점 정보.ap-northeast-2.compute.amazonaws.com에 대한 비밀번호를 입력하라고 다시 나오는데, 몰라서 RDS 사용자 암호 입력했는데 잘 연결되었다.
코멘트
public - private 인스턴스, 서브넷 등 전반적인 세팅의 과정을 이해하고 나니 이해하는 과정에서 배운 포트포워딩과 네트워크의 기초적인 부분을 같이 이해할 수 있어서 좋았다. 이해하고 나니 오늘의 과정은 구글링 없이도 금방 해내서 뿌듯하다 ㅎㅎㅎ
'개발 > http, server' 카테고리의 다른 글
[AWS | Lambda] 파일을 못찾는 에러 Cannot find module 'index' (0) | 2023.11.01 |
---|---|
[cors] 오랜만에 만난 CORS에러.. 설정 후에도 별도의 메세지 확인되는 경우 (0) | 2023.10.31 |
[AWS] 도대체 클라이언트는 어떻게 private subnet에 있는 api와 통신할 수 있는가.. (해결) (0) | 2023.10.26 |
[AWS]The AWS Access Key Id you provided does not exist in our records. (0) | 2023.10.18 |
[pm2] 환경변수 세팅 feat. ecosystem.config.js (0) | 2023.10.15 |