Skip to content

Drizzle와 Amazon RDS 및 SST 사용하기

Drizzle와 SST를 사용하여 Amazon Postgres RDS 데이터베이스를 관리하고 배포하세요.

Amazon RDS와 SST로 Drizzle 사용하기

여러분은 SST를 사용하여 Amazon Postgres RDS 데이터베이스를 배포하고, 이를 관리하기 위해 Drizzle ORMDrizzle Kit을 설정할 수 있습니다.

시작하기 전에 AWS 자격 증명을 설정해야 합니다.


예제

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


1. 프로젝트 생성

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

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

SST 초기화

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

Terminal window
npx sst@latest init
npm install

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


Drizzle 초기화

프로젝트에 Drizzle을 추가합니다. Drizzle이 사용할 pg 클라이언트도 함께 설치합니다.

Terminal window
npm install pg @types/pg drizzle-orm drizzle-kit

Drizzle ORM은 데이터베이스를 쿼리하는 데 사용되며, Drizzle Kit은 마이그레이션을 실행할 수 있게 해줍니다. 또한 쿼리 브라우저인 Drizzle Studio도 함께 제공됩니다.

package.jsonscripts에 다음을 추가합니다.

package.json
"scripts": {
"db": "sst shell drizzle-kit"
},

sst shell CLI는 Drizzle Kit에 자격 증명을 전달하여 데이터베이스에 연결할 수 있게 합니다.

tsconfig.json도 업데이트합니다.

tsconfig.json
{
"compilerOptions": {
"strict": true
}
}

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

Amazon RDS를 사용해 Postgres 데이터베이스를 추가해 보겠습니다. 이를 위해서는 VPC가 필요합니다. sst.config.ts 파일을 업데이트하세요.

sst.config.ts
async run() {
const vpc = new sst.aws.Vpc("MyVpc", { bastion: true, nat: "ec2" });
const rds = new sst.aws.Postgres("MyPostgres", { vpc, proxy: true });
},

proxy 옵션은 RDS Proxy를 백그라운드에서 구성하여 서버리스 애플리케이션에 이상적입니다.

bastion 옵션은 로컬 머신에서 VPC에 연결할 수 있게 해줍니다. 또한 이 예제에서는 Lambda 함수를 사용할 것이기 때문에 NAT 게이트웨이가 필요합니다. 이는 VPC 내부에 있는 Lambda 함수가 인터넷에 접근할 수 있게 해줍니다.


Drizzle Studio 시작하기

SST를 개발 모드로 실행할 때 다른 개발 프로세스를 함께 시작할 수 있습니다. 이 경우 Drizzle Studio를 시작하려고 합니다. Postgres 컴포넌트 아래에 다음 코드를 추가하세요.

sst.config.ts
new sst.x.DevCommand("Studio", {
link: [rds],
dev: {
command: "npx drizzle-kit studio",
},
});

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

API 추가하기

데이터베이스를 쿼리하기 위해 Lambda 함수를 API로 사용할 것입니다. 데이터베이스 설정 아래에 있는 sst.config.ts 파일에 다음 내용을 추가하세요.

sst.config.ts
new sst.aws.Function("MyApi", {
vpc,
url: true,
link: [rds],
handler: "src/api.handler",
});

데이터베이스를 API에 연결하고 있습니다.

터널 설치하기

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

Terminal window
sudo npx sst tunnel install

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


개발 모드 시작

앱을 개발 모드로 시작합니다. 이렇게 하면 여러분의 함수를 Live로 실행합니다.

Terminal window
npx sst dev

데이터베이스를 생성하는 데 몇 분 정도 걸립니다. 완료되면 다음과 같은 메시지가 나타납니다.

완료
MyApi: https://ouu5vovpxllyn5b6ot2nn6vdsa0hvcuj.lambda-url.us-east-1.on.aws

Studio 탭에서 Drizzle Studio가 시작되고, Tunnel 탭에서 터널이 실행됩니다.


3. 스키마 생성

Drizzle 설정을 정의해 보겠습니다. 프로젝트 루트에 drizzle.config.ts 파일을 추가하고 다음 내용을 입력합니다.

drizzle.config.ts
import { Resource } from "sst";
import { defineConfig } from "drizzle-kit";
export default defineConfig({
dialect: "postgresql",
// 모든 스키마 파일을 선택
schema: ["./src/**/*.sql.ts"],
out: "./migrations",
dbCredentials: {
host: Resource.MyPostgres.host,
port: Resource.MyPostgres.port,
user: Resource.MyPostgres.username,
password: Resource.MyPostgres.password,
database: Resource.MyPostgres.database,
},
});

여기서는 Drizzle에게 src/ 디렉토리 내 .sql.ts 파일에 데이터베이스 스키마를 정의할 것임을 알려줍니다.

간단한 할 일 목록을 저장할 데이터베이스를 생성해 보겠습니다. src/todo.sql.ts 파일을 새로 만들고 다음 내용을 추가합니다.

src/todo.sql.ts
import { text, serial, pgTable } from "drizzle-orm/pg-core";
export const todo = pgTable("todo", {
id: serial("id").primaryKey(),
title: text("title").notNull(),
description: text("description"),
});

4. 마이그레이션 생성하기

이 명령어를 사용해 마이그레이션을 생성할 수 있습니다.

Terminal window
npm run db generate

이 명령어는 sst shell drizzle-kit generate를 실행하고 migrations/ 디렉토리에 새로운 마이그레이션을 생성합니다.


마이그레이션 적용하기

이제 다음 명령어로 마이그레이션을 적용할 수 있습니다.

Terminal window
npm run db migrate

이 명령어는 새로운 스키마를 생성합니다.

데이터베이스에 연결하려면 터널이 필요하므로, 별도의 터미널에서 sst dev를 실행해야 합니다.

Terminal window
npx sst tunnel

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


Drizzle Studio

스키마가 동작하는 모습을 확인하려면 Drizzle Studio를 열어보세요. sst dev 세션에서 Studio 탭으로 이동한 후 링크를 클릭합니다.

또는 브라우저에서 https://local.drizzle.studio로 접속할 수도 있습니다.

SST와 함께하는 초기 Drizzle Studio


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

Drizzle ORM을 사용해 데이터베이스를 쿼리하려면, 다음 내용으로 src/drizzle.ts 설정 파일을 새로 만듭니다.

src/drizzle.ts
import { drizzle } from "drizzle-orm/node-postgres";
import { Pool } from "pg";
import { Resource } from "sst";
import * as schema from "./todo.sql";
const pool = new Pool({
host: Resource.MyPostgres.host,
port: Resource.MyPostgres.port,
user: Resource.MyPostgres.username,
password: Resource.MyPostgres.password,
database: Resource.MyPostgres.database,
});
export const db = drizzle(pool, { schema });

이제 API에서 이를 사용할 수 있습니다. src/api.ts에 API 핸들러를 만듭니다.

src/api.ts
import { db } from "./drizzle";
import { todo } from "./todo.sql";
import { APIGatewayProxyEventV2 } from "aws-lambda";
export const handler = async (evt: APIGatewayProxyEventV2) => {
if (evt.requestContext.http.method === "GET") {
const result = await db.select().from(todo).execute();
return {
statusCode: 200,
body: JSON.stringify(result, null, 2),
};
}
if (evt.requestContext.http.method === "POST") {
const result = await db
.insert(todo)
.values({ title: "Todo", description: crypto.randomUUID() })
.returning()
.execute();
return {
statusCode: 200,
body: JSON.stringify(result),
};
}
};

POST 요청의 경우 새로운 할 일을 생성하고, GET 요청의 경우 모든 할 일을 출력합니다.


앱 테스트하기

앱을 테스트하려면 API에 POST 요청을 보내세요.

Terminal window
curl -X POST https://ouu5vovpxllyn5b6ot2nn6vdsa0hvcuj.lambda-url.us-east-1.on.aws

이제 브라우저에서 https://ouu5vovpxllyn5b6ot2nn6vdsa0hvcuj.lambda-url.us-east-1.on.aws로 이동하면 할 일이 추가된 것을 확인할 수 있습니다.

Drizzle와 SST로 생성된 할 일

Drizzle Studio에서도 이 내용을 확인할 수 있습니다.


6. 앱 배포하기

마지막으로 앱을 배포해 보겠습니다.

Terminal window
npx sst deploy --stage production

여기서는 어떤 스테이지 이름을 사용해도 되지만, 프로덕션을 위해 새로운 스테이지를 만드는 것이 좋습니다.


콘솔 연결하기

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

SST 콘솔 자동 배포

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