Skip to content

Prisma with Amazon RDS and SST

Use Prisma and SST to manage and deploy your Amazon Postgres RDS database.

Prisma와 Amazon RDS 및 SST 사용하기

우리는 Prisma와 SST를 사용하여 Amazon Postgres RDS 데이터베이스를 배포하고, 컨테이너 내의 Express 앱에서 이 데이터베이스에 연결할 것입니다.

시작하기 전에 AWS 자격 증명을 설정했는지 확인하세요.


예제

Prisma와 Postgres를 사용한 몇 가지 추가 예제도 참고할 수 있습니다.


1. 프로젝트 생성

Node.js 앱을 만들어 보겠습니다.

Terminal window
mkdir aws-prisma && cd aws-prisma
npm init -y

Prisma, TypeScript, Express를 설치합니다.

Terminal window
npm install prisma typescript ts-node @types/node --save-dev
npm install express

TypeScript와 Prisma를 초기화합니다.

Terminal window
npx tsc --init
npx prisma init

이 명령어는 prisma 디렉토리와 schema.prisma 파일을 생성합니다.


Express 초기화

루트에 index.mjs 파일을 추가하여 Express 앱을 생성하세요.

index.mjs
import express from "express";
const PORT = 80;
const app = express();
app.get("/", (req, res) => {
res.send("Hello World!")
});
app.listen(PORT, () => {
console.log(`Server is running on http://localhost:${PORT}`);
});

SST 초기화

이제 앱에서 SST를 초기화해 보겠습니다.

Terminal window
npx sst@latest init
npm install

기본값을 선택하고 AWS를 선택합니다. 이렇게 하면 프로젝트 루트에 sst.config.ts 파일이 생성됩니다.


2. Postgres 데이터베이스 추가하기

Amazon RDS를 사용해 Postgres 데이터베이스를 추가해 보겠습니다. 이를 위해서는 VPC가 필요합니다.

sst.config.ts
async run() {
const vpc = new sst.aws.Vpc("MyVpc", { bastion: true });
const rds = new sst.aws.Postgres("MyPostgres", { vpc });
const DATABASE_URL = $interpolate`postgresql://${rds.username}:${rds.password}@${rds.host}:${rds.port}/${rds.database}`;
},

bastion 옵션을 사용하면 로컬 머신에서 VPC에 연결할 수 있습니다.

또한 RDS 데이터베이스의 출력값을 사용해 DATABASE_URL 변수를 구성합니다. 이 변수는 나중에 사용할 예정입니다.


Prisma Studio 시작하기

SST를 개발 모드로 실행할 때 다른 개발 프로세스를 자동으로 시작할 수 있습니다. 이 경우 Prisma Studio를 시작하려고 합니다. DATABASE_URL 변수 아래에 다음 코드를 추가하세요.

sst.config.ts
new sst.x.DevCommand("Prisma", {
environment: { DATABASE_URL },
dev: {
autostart: false,
command: "npx prisma studio",
},
});

이 코드는 개발 모드에서 주어진 명령어를 실행합니다.

3. 클러스터 추가하기

Express 앱을 배포하기 위해 Amazon ECS와 함께 AWS Fargate 컨테이너를 추가해 보겠습니다. sst.config.ts 파일 끝에 다음 코드를 추가하세요.

sst.config.ts
const cluster = new sst.aws.Cluster("MyCluster", { vpc });
cluster.addService("MyService", {
link: [rds],
environment: { DATABASE_URL },
loadBalancer: {
ports: [{ listen: "80/http" }],
},
dev: {
command: "node --watch index.mjs",
},
});

이 코드는 동일한 VPC를 사용하고, ECS 클러스터를 추가하며, 그 안에 Fargate 서비스를 포함합니다.

dev.command는 SST에게 개발 모드에서 Express 앱을 로컬에서 실행하도록 지시합니다.


터널 설치하기

데이터베이스 클러스터가 VPC에 있기 때문에, 로컬 머신에서 연결하려면 터널이 필요합니다.

Terminal window
sudo npx sst tunnel install

이 명령은 머신에 네트워크 인터페이스를 생성하기 위해 sudo 권한이 필요합니다. 이 작업은 머신에서 한 번만 수행하면 됩니다.


개발 모드 시작

여러분의 앱을 개발 모드로 시작합니다. 이 작업은 몇 분 정도 소요됩니다.

Terminal window
npx sst dev

이 명령어는 앱을 배포하고, Tunnel 탭에서 터널을 시작하며, MyServiceDev 탭에서 Express 앱을 로컬로 실행하고, Studio 탭에서 Prisma Studio를 실행합니다.

Prisma Studio는 브라우저 윈도우를 팝업으로 띄우기 때문에 자동 시작하지 않도록 설정했습니다. Prisma Studio를 시작하려면 해당 탭을 클릭하고 Enter 키를 누르면 됩니다.


4. 스키마 생성

간단한 스키마를 만들어 보겠습니다. schema.prisma 파일에 다음 내용을 추가하세요.

schema.prisma
model User {
id Int @id @default(autoincrement())
name String?
email String @unique
}

마이그레이션 생성

이제 이 스키마에 대한 마이그레이션을 생성하고 적용해 보겠습니다. 별도의 터미널에서 다음 명령어를 실행하세요:

Terminal window
npx sst shell --target Prisma -- npx prisma migrate dev --name init

prisma migrate dev --name init 명령어를 sst shell --target Prisma로 감싸는 이유는, 이 명령어가 sst.config.ts에 정의된 DATABASE_URL에 접근할 수 있도록 하기 위함입니다.

Prisma 타겟은 위에서 정의한 new sst.x.DevCommand("Prisma") 컴포넌트에서 가져옵니다.

이 작업은 데이터베이스에 연결하기 위해 터널이 필요합니다. 따라서 별도의 터미널에서 sst dev를 실행해야 합니다.

Terminal window
npx sst tunnel

또는 위 명령어를 사용해 터널을 실행할 수도 있습니다.


Prisma Studio

스키마가 어떻게 동작하는지 확인하려면 Prisma Studio를 열어볼 수 있습니다. sst dev 세션에서 Studio 탭으로 이동한 후 엔터를 눌러 실행합니다.

SST와 함께하는 초기 Prisma Studio


5. 데이터베이스 쿼리하기

migrate dev 명령어를 실행하면 Prisma Client가 프로젝트에 설치됩니다. 이제 이를 사용해 데이터베이스를 쿼리해 보겠습니다.

index.mjs 파일의 / 라우트를 다음과 같이 변경하세요.

index.mjs
import { PrismaClient } from '@prisma/client';
const prisma = new PrismaClient();
app.get("/", async (_req, res) => {
const user = await prisma.user.create({
data: {
name: "Alice",
email: `alice-${crypto.randomUUID()}@example.com`
},
});
res.send(JSON.stringify(user));
});

앱 테스트하기

브라우저에서 http://localhost:80로 이동하면 새로 생성된 사용자를 확인할 수 있습니다.

SST에서 Prisma로 생성된 사용자

Prisma Studio에서도 이 내용을 볼 수 있습니다.


5. 앱 배포하기

앱을 배포하기 위해 먼저 Dockerfile을 추가합니다.

Dockerfile
FROM node:18-bullseye-slim
WORKDIR /app/
COPY package.json index.mjs prisma /app/
RUN npm install
RUN npx prisma generate
ENTRYPOINT ["node", "index.mjs"]

이 파일은 Express 앱을 Docker 이미지로 빌드하고 prisma generate 명령을 실행합니다.

또한 루트 디렉토리에 .dockerignore 파일을 추가합니다.

.dockerignore
node_modules

이제 Docker 이미지를 빌드하고 배포하려면 다음 명령을 실행합니다.

Terminal window
npx sst deploy --stage production

여기서는 어떤 스테이지 이름을 사용해도 되지만, 프로덕션용으로 새로운 스테이지를 만드는 것이 좋습니다. 이렇게 하면 Express 앱이 Fargate 서비스로 배포된 URL을 얻을 수 있습니다.

Terminal window
완료
MyService: http://jayair-MyServiceLoadBala-592628062.us-east-1.elb.amazonaws.com

콘솔 연결하기

다음 단계로, 여러분은 SST 콘솔을 설정하여 앱을 _git push로 배포_하고 문제를 모니터링할 수 있습니다.

SST 콘솔 자동 배포

무료 계정을 생성하고 AWS 계정에 연결할 수 있습니다.