우당탕탕 우리네 개발생활

[serverless+typescript+aws+googleapis] (2) prisma 로 aws rds 연결하기 본문

tech

[serverless+typescript+aws+googleapis] (2) prisma 로 aws rds 연결하기

미스터카멜레온 2024. 8. 29. 11:53

[serverless+typescript+aws+googleapis] (1) aws 계정설정과 serverless framework 기본 설정하기

 

위 글과 이어집니다.

 

 

Deploy your application using Prisma ORM to AWS Lambda | Prisma Documentation

Learn how to deploy your Prisma ORM-backed applications to AWS Lambda with AWS SAM, Serverless Framework, or SST

www.prisma.io

위 공식 사이트에서 lambda에서 prisma ORM 엔진이 동작할 수 있는 환경 셋팅, 번들링을 통한 불필요한 orm 엔진 제거 등을 확인하실 수 있습니다.

 

1. 프로젝트에 prisma를 설치합니다.

npm install prisma --save-dev

 

2. schema.prisma 파일 내 binaryTargets 수정

유의해야할 점은 우리의 개발 런타임 환경과 배포해야할 곳의 환경이 다를 수 있다는 점입니다.(맥북과 윈도우로 개발을 하시는 분들이라면 무조건 다를 수 밖에 없을 것입니다.) 그래서 아래와 같이 상황에 맞게 설정합니다.

- lambda가 arm64architecture로 되어 있는 경우

// schema.prisma

generator client {
  provider = "prisma-client-js"
  binaryTargets = ["native", "rhel-arm64-openssl-1.0.x"]
}

...

- 그 외

// schema.prisma

generator client {
  provider = "prisma-client-js"
  binaryTargets = ["native", "rhel-openssl-1.0.x"]
}

...

- 안되는 경우엔 lambda의 런타임 환경을 체크한 후 그에 맞게 schema.prisma 파일을 수정해줍니다.

 

3. prisma에서 webpack 번들링을 통해 사이즈를 줄일 수 있는 방법을 제공하고 있으나 저는 기본 esbuild로 따로 추가 번들링 설정을 하지 않고 진행했습니다.

 

4. schema.prisma db 설정에 정해둔 환경변수명을 맞춰 .env 파일을 만들고 값을 알맞게 설정합니다.

// schema.prisma

datasource db {
  provider = "postgresql"
  url      = env("DATABASE_URL")
}

...

- 로컬에서 테스트하는 경우엔 로컬 DB의 주소를 DATABASE_URL에 입력해줍니다.

// .env

DATABASE_URL='postgresql://<id>:<password>@localhost'

 

5. serverless offline 환경에서 prisma 를 통해 DB와 정상적으로 연결되었는지 코드베이스로 테스트를 진행합니다.

 

6. AWS Lambda 콘솔에서 구성 > 환경 변수에 DATABASE_URL을 실제 접근하려는 production rds의 url 값으로 설정합니다.

- process.env에 해당 값이 매핑이 되기 때문에 따로 NODE_ENV를 통한 분기처리가 필요하지 않습니다.

 

7. 보통의 production rds는 vpc에 갇혀있기 때문에 Lambda를 vpc로 연결해줘야 rds에 접근이 가능해집니다.(vpc 구성에 따라 람다를 퍼블릭 서브넷에 연결해야할지, 프라이빗 서브넷에 연결해야할지가 달라지기 때문에 유념해서 연결하도록 합니다.) AWS Lambda 콘솔에서 구성 > VPC에 rds와 같은 vpc로의 연동 설정을 합니다.

 

8. 작성해 둔 코드베이스를 Lambda로 배포하고 rds에 lambda가 정상적으로 접근할 수 있는지 테스트합니다.