RDS에 VPC Private subnet 설정 후 로컬에서 접근하고 싶을 때

Dan.kimhaejun·2023년 1월 7일
0

현재

lambda (serverless), NestJS, RDS (ORM - Prisma)를 기반으로 백엔드를 만들고 있다.

첫번째 문제

첫번째 문제는 lambda(이하 람다) 에서 외부 api 호출시 axios가 실행되지 않고 timeout되는 문제이다.

로컬에서는 전혀 문제가 없었는데 람다로 실제 배포하니 문제가 발생했다.

원인은 람다와 RDS를 연결하기 위해 연결한 VPC로 인한 문제였다.
RDS에 아무 셋팅없이 새로 VPC를 생성하게 되면 VPC 내부의 Subnet은 모두 Public 상태이다.
Public Subnet을 람다에 연결하니 외부 API 호출이 제한되는 것이다.

자세한 문제의 내용은 아래의 링크를 참고하면 좋다.
https://stackoverflow.com/questions/60519065/axios-always-time-out-on-aws-lambda-for-a-particular-api

이 문제를 해결하기 위해서는 RDS의 VPC 생성시 Private Subnet을 생성해야 하고 이를 생성하기 위해서는 두가지 방법이 존재한다.

  1. Nat Gateway (AWS 자체 제공하지만 시간당 단위로 요금이 부과하여 비쌈)
  2. Nat Instance (EC2에 배포하는 방식으로 저렴함)

나는 후자를 선택했고
VPC생성 - Subnet 생성 - 라우팅 테이블 생성 - 인터넷 게이트웨이 생성 - EC2 생성 및 테스트
의 절차를 거쳐 Private Subnet 을 생성 후 RDS에 적용하였다.

(이 두분의 설명이 매우 구체적이어서 적용하는데 큰 문제는 없었다.)
https://blog.kico.co.kr/2022/05/03/hands-on-vpc-iam-%EC%82%AC%EC%9A%A9%EC%9E%90-%EC%83%9D%EC%84%B1/

https://velog.io/@leejh3224/AWS-Lambda-%EA%B3%A0%EC%98%A4%EA%B8%89-%ED%8A%9C%ED%86%A0%EB%A6%AC%EC%96%BC-3-rzjn6mvcdb

그리고 Lambda의 Subnet에 Private Subnet만 연결하였고,
배포된 람다에서 RDS 호출, 외부 API 호출이 모두 가능했다.

하지만

두번째 문제

두번째 문제는 로컬에서 호출이 불가한 문제였다. local에서 작업한 db schema migrate 작업이나 seed 작업을 하기 위해서는 로컬에서 접근이 필수였다.

(물론 EC2나 다른 방식을 통해서 할 수는 있지만 현상황에서 그런 솔루션을 찾기에는 시간이 너무 많이 걸릴 것 같았다.)

솔루션은 아래 링크에 있었다.
내 DB 인스턴스가 프라이빗 서브넷에 있고, 로컬 컴퓨터에서 연결할 수 없는 경우
https://aws.amazon.com/ko/premiumsupport/knowledge-center/rds-connectivity-instance-subnet-vpc/

  1. EC2인스턴스에서 통해 RDS의 엔드포인트를 찾는다.
  2. 찾은 엔드포인트의 Subnet 정보를 파악한 뒤 Subnet에 연결된 라우팅테이블로 간다.
  3. 라우팅테이블에서 라우팅 편집을 통해 내 로컬 IP의 액세스를 추가한다.
  4. RDS 보안 규칙의 인바운드 편집에서 내 로컬 IP의 권한을 허용한다.

물론 퍼블릭 액세스를 완전히 차단하는 것이 가장 좋은 방법이긴 하지만
완전한 솔루션으로 대체하기 전까지는 위 방식으로 개발을 진행해 나갈 것이다.

profile
제가 겪은 이슈에 대해서 정리합니다. 기억보다는 기록이 더 낫다고 생각합니다.

0개의 댓글