AWS EC2, RDS 연결하기 :: VPC와 함께하는 NestJS 백엔드 배포, Prisma Migrate 문제 해결
안녕하세요 여러분! 오늘은 제가 NestJS 백엔드 배포 중 겪었던 문제와 그 해결 과정에 대해 이야기하려 합니다. 아마 여러분 중에서도 Prisma Migrate를 사용하면서 문제에 부딪히신 분들이 계실 것 같아, 제 경험을 공유하고자 합니다.
1. 배경 및 문제점
NestJS 프로젝트를 개발 중, Prisma를 사용하여 데이터베이스 관리를 하고 있었습니다. 개발을 마무리하고 AWS에 배포하는 과정에서 Prisma Migrate를 실행했으나 예상치 못한 오류가 발생했습니다.
npx prisma migrate dev --name init --schema=./prisma/schema.prisma
Error: P1001: Can't reach database server at `ouxxxxxxxxxxxxxxx.ap-northeast-2.rds.amazonaws.com`:`5432`
간단히 말하면, 이 명령어는 ./prisma/schema.prisma 파일에 정의된 데이터베이스 스키마 변경사항을 "init"이라는 이름의 마이그레이션으로 생성하고, 개발 환경의 데이터베이스에 적용하는 작업을 수행하는데
RDS(데이터베이스)에서 EC2에 대한 접근 규칙 (인바운드 규칙)이 허용되지 않아 접근할 수 없는 문제가 발생했습니다.
그러나 로컬 환경에서는 잘 작동하였기 때문에, AWS EC2, RDS 설정에 문제가 있을 것이라 판단했습니다. 퍼블릭 IPv4 주소, 프라이빗 IPv4 주소 또는 프라이빗 IP DNS 이름(IPv4만 해당) 중 무엇을 써서 인바운드 규칙에 추가할 지 고민하고 있었습니다.
3. VPC의 개념 탐구
문제의 원인을 찾아보던 중, AWS의 VPC(Virtual Private Cloud)를 활용하면 더 개념에 대해 깊게 알게 되었습니다. 간단히 말하면, VPC는 AWS에서 제공하는 가상 네트워크 환경입니다. 이 VPC 내에서 EC2, RDS 등의 리소스를 운영하면 보안 및 관리가 편리합니다.
EC2에서 RDS에 접근할 때 퍼블릭 IP를 사용하는 방식과 VPC를 활용하는 방식은 각각 다른 장단점을 가지고 있습니다. 이 두 방식의 장단점과 추천하는 접근 방법을 아래에 정리하였습니다.
3.1. 퍼블릭 IP를 통한 접근:
장점
간단한 설정: 외부에서 바로 접근할 수 있으므로 초기 설정이 간단합니다.
다양한 위치에서의 접근 가능: 어디에서든 인터넷이 연결되면 접근이 가능합니다.
단점:
보안 위험: 퍼블릭 IP는 인터넷상에서 어디서든 접근이 가능하므로, 보안 그룹 설정, 네트워크 ACL, 방화벽 등의 추가적인 보안 조치가 필요합니다.
비용: 트래픽 비용이 발생할 수 있습니다. AWS 내부에서의 데이터 전송은 보통 무료이나, 퍼블릭 IP를 통한 데이터 전송은 비용이 발생합니다.
변동성: EC2 인스턴스가 재시작될 때마다 퍼블릭 IP가 변경될 수 있습니다. (Elastic IP를 사용하지 않는 한)
3.2. VPC를 통한 접근:
장점:
보안: VPC 내에서의 통신은 private IP를 통해 이루어지므로 외부에서의 불필요한 접근을 차단할 수 있습니다.
성능: AWS 내부 네트워크를 통한 통신이므로 일반적으로 더 빠른 속도와 낮은 지연 시간을 가집니다.
비용 절감: VPC 내부에서의 데이터 전송은 일반적으로 비용이 발생하지 않습니다.
고정된 IP: VPC 내에서는 private IP가 변경되지 않습니다.
단점:
설정 복잡성: VPC, 서브넷, 라우팅 테이블, 보안 그룹 등 여러 AWS 서비스의 설정이 필요합니다.
3.3. 추천 방법 및 이유:
VPC를 통한 접근을 추천합니다. 주요 이유는 다음과 같습니다:
보안: 데이터베이스는 중요한 정보를 저장하므로 최상의 보안이 필요합니다. VPC를 사용하면 외부의 불필요한 접근을 제한할 수 있습니다.
성능 및 비용: AWS 내부 통신은 빠르며 대부분의 경우 추가 비용이 발생하지 않습니다.
유연성: VPC를 사용하면 보안 그룹, 네트워크 ACL 등을 통해 네트워크 트래픽을 세밀하게 제어할 수 있습니다.
결론적으로, 보안과 비용, 성능 측면에서 VPC 내에서의 접근 방식이 더 우수하다고 판단됩니다.
4. 해결 과정
- VPC 설정 확인:
- 먼저, EC2와 RDS가 동일한 VPC 내에 있는지 확인했습니다. 동일한 VPC 내에 있었기 때문에 내부 IP로 통신이 가능하다는 것을 알게 되었습니다.
- 보안 그룹 설정:
- EC2와 RDS 간의 통신을 허용하기 위해, 보안 그룹에서 해당 IP와 포트(Prisma의 경우 기본적으로 5432)를 열어주었습니다.
- Prisma 설정 변경:
- 마지막으로, Prisma 설정에서 데이터베이스의 연결 주소를 RDS의 private IP로 변경해주었습니다.
5. 결과
위의 변경 후, 다시 Prisma Migrate를 실행하니 이전에 발생했던 문제 없이 성공적으로 마이그레이션을 완료할 수 있었습니다.
6. 마치며
배포는 개발의 마지막 단계지만, 때로는 여러 문제에 부딪힐 수 있습니다. 이러한 문제를 해결하는 과정에서 기존에 알지 못했던 지식을 습득하는 재미도 있습니다. VPC의 개념을 깊게 이해하고, 실제 문제 해결에 적용한 경험을 통해 더 성장할 수 있었다고 생각합니다. 여러분도 배포 중 겪는 어려움에 대해 함께 공유하고, 해결하는 과정을 통해 지식을 더욱 확장해 나가시길 바랍니다!
'개발 > AWS' 카테고리의 다른 글
AWS EC2 인스턴스 지역 변경하기 (AMI 이미지 사용하기), Amazon Machine Image (0) | 2023.10.04 |
---|---|
EC2와 Docker 환경에서 SWAP Memory를 활용한 NestJS 어플리케이션의 'JavaScript heap out of memory' 문제 해결 (0) | 2023.10.03 |
AWS EC2, Route 53과 가비아를 활용한 NestJS 서비스 SSL 인증서 적용 방법 (0) | 2023.10.03 |
NestJs에서 AWS S3 연동 시 발생하는 'CredentialsProviderError' 오류 해결하기 (2) | 2023.10.01 |
AWS S3에서 'AccessControlListNotSupported' 오류 해결하기 (0) | 2023.10.01 |