はじめに
本記事では Amplify Gen2 環境において、
データベースとして DynamoDB の代わりにCockroachDB を利用する構成と、その環境構築手順について解説します。
TL;DR
- CockroachDB は低コストでスケーラブルな分散SQLデータベース
- ORM にはDrizzleを採用
- CI/CD では DBマイグレーション → Amplify デプロイの順序を GitHub Actions で制御
CockroachDBとは?
CockroachDBは分散SQLデータベースの一種です。
名前の通り、高速でスケーラブルで破壊しにくいDBです🪳(名称の由来については公式ブログを参照)
主な特徴は以下のとおりです。
- データは複数ノードに自動的にレプリケーションされ、高可用性とフェイルオーバーを標準で提供
- データ量やトランザクション量が増加しても、ノードを追加することでパフォーマンスを維持したままスケール可能
- ACID トランザクションをサポートし、分散環境下でも強いデータ整合性を保証
- PostgreSQL 構文の大部分をサポートしており、高い PostgreSQL 互換性を持つ
料金形態
課金モデルには以下の種類があります。
- リクエストベース課金
- vCPU ベース課金
主な無料枠は以下のとおりです。
かなり大きな無料枠があります(要件によっては Supabase や Turso など、他のDB サービスの方が低コストになるケースもあると思いますが)。
- 50,000,000 RU/月の無料リクエスト
- RU(Request Unit)の詳細は公式ドキュメント参照
- 10 GiBの無料ストレージ
- 初回利用時に $400のクレジットの付与
また、AWS marketplace経由で利用できるので、料金請求をAWSに統一することも可能です。
Amplify × CockroachDBのモチベーション
AmplifyでCockroachDB を用いる主な理由は以下です。
- 無料枠が大きく、初期コストを抑えやすい
- 水平スケール前提の設計で、Amplify の思想と親和性が高い
- RDB として柔軟なクエリが可能
Amplify を構成する DynamoDB、Lambda、AppSync などは、いずれもスケールを前提に設計されたコンポーネントです。そのため、同じく水平スケールに強い CockroachDB は、Amplify 環境で比較的低コストに RDB を利用する選択肢として相性が良いです。
また、DynamoDBは、テーブル構成が用途依存になりやすい点、柔軟な検索のためにGSIを設計する必要がある点から、要件が固まりきっていないケースや複雑な検索を行うケースではRDBであるCockroachDBを用いた方が効果的だと考えています。
ただその一方で、AWS 外部のサービスであるため、AmplifyのSandbox機能など一部の利便性が制限される点や、現時点(2026/01/18)ではCockroachDBは日本リージョンが提供されていない等の制約もあります(リージョンの情報はこちら)。
AmplifyへのCockroachDBの導入
ここからは以下の項目を順に解説します。
- CockroachDB のセットアップ
- Drizzle の導入とCockroachDBのテーブル構築
- Amplify Lambda からの DB アクセス
- CI/CD の実装
CockroachDB のセットアップ
1. AWS marketplaceからCockroachDBをサブスクライブし、アカウント作成
- AWS marketplaceからCockroachDBをサブスクライブ
2. CockroachDBのClusterを作成
- Clusterを選択し、情報を入力していく
- Free plan, AWSを選択
- regionはデフォルトを選択
- 現時点(2026/01/18)で日本リージョンはありませんでした
- cluster-nameは変更できないので注意
- DBへの接続情報は右上のConnectから確認できる
Drizzleの導入とCockroachDBのテーブル構築
1. Drizzleの導入
- CockroachDBをORMで用いるためにDrizzleを導入します
npm i drizzle-orm@beta pg dotenv
npm i -D drizzle-kit@beta tsx @types/pg
2. テーブル構築
DATABASE_URL="postgresql://..."
- 以下のようなディレクトリ構成としてDrizzleを用いてテーブルを構築します
.
├── db
│ ├── index.ts // 追加
│ └── schema.ts // 追加
├── .env
├── drizzle.config.ts // 追加
├── package.json
└── package-lock.json
db/index.ts
import 'dotenv/config';
import { drizzle } from 'drizzle-orm/cockroach';
export const db = drizzle(process.env.DATABASE_URL!);
db/schema.ts
import { cockroachTable, varchar, int4 } from 'drizzle-orm/cockroach-core';
export const usersTable = cockroachTable('users', {
id: varchar({ length: 26 }).primaryKey().notNull(), // ULID (26 chars)
name: varchar({ length: 255 }).notNull(),
age: int4().notNull(),
email: varchar({ length: 255 }).notNull().unique(),
});
drizzle.config.ts
import 'dotenv/config';
import { defineConfig } from 'drizzle-kit';
export default defineConfig({
out: './drizzle',
schema: './db/schema.ts',
dialect: 'cockroach',
dbCredentials: {
url: process.env.DATABASE_URL!,
},
});
- 以下のコマンドでマイグレーションを行います
-
./drizzleにマイグレーションファイルが作成されます
-
npx drizzle-kit generate
npx drizzle-kit migrate
AmplifyのLambdaからDBへのアクセス
1. Amplifyの導入
- 以下のコマンドでAmplifyを導入
npm create amplify@latest
2. Lambdaの追加
- 初期に作成される不要なリソースを削除し、Lambdaを追加します
.
├── amplify
│ ├── auth // 削除
│ ├── data // 削除
│ ├── functions
│ │ └── backend-api
│ │ ├── handler.ts // 追加
│ │ └── resource.ts // 追加
│ └── backend.ts // 編集
├── db
│ ├── index.ts
│ └── schema.ts
├── .env
├── drizzle.config.ts
├── package.json
└── package-lock.json
amplify/functions/backend-api/handler.ts
import 'dotenv/config';
import { eq } from 'drizzle-orm';
import { usersTable } from '../../../db/schema';
import { db } from '../../../db';
import { ulid } from 'ulid';
async function main() {
// ユーザー作成
const user: typeof usersTable.$inferInsert = {
id: ulid(),
name: 'John',
age: 30,
email: 'john@example.com',
};
await db.insert(usersTable).values(user);
console.log('新しいユーザーを作成しました!');
// 全てのユーザー取得
const users = await db.select().from(usersTable);
console.log('データベースから全てのユーザーを取得します: ', users);
// 特定のユーザー取得
const specificUser = await db.select().from(usersTable).where(eq(usersTable.email, user.email));
console.log('データベースから特定のユーザーを取得します: ', specificUser);
// ユーザー情報更新
await db
.update(usersTable)
.set({
age: 31,
})
.where(eq(usersTable.email, user.email));
console.log('ユーザー情報を更新しました!');
// ユーザー削除
await db.delete(usersTable).where(eq(usersTable.email, user.email));
console.log('ユーザーを削除しました!');
}
export const handler = async () => {
try {
await main();
return {
statusCode: 200,
body: JSON.stringify(
{
message: '関数は正常に実行されました!',
},
null,
2,
),
};
} catch (error) {
console.error('関数の実行中にエラーが発生しました:', error);
return {
statusCode: 500,
body: JSON.stringify(
{
message: 'サーバー内部エラー',
},
null,
2,
),
};
}
};
amplify/functions/backend-api/resource.ts
import { defineFunction } from '@aws-amplify/backend';
export const backendApi = defineFunction({
name: 'backend-api',
entry: './handler.ts',
timeoutSeconds: 300,
memoryMB: 512,
environment: {
DATABASE_URL: process.env.DATABASE_URL || '',
},
});
amplify/backend.ts
import { defineBackend } from '@aws-amplify/backend';
import { backendApi } from './functions/backend-api/resource';
defineBackend({
backendApi,
});
参考(LambdaからのCockroachDBアクセス)
3. デプロイ
- Amplifyの管理コンソールからブランチを接続してデプロイします
- その際に環境変数
DATABASE_URLも設定しておく
- その際に環境変数
4. Lambdaの実行と疎通確認
- Lambdaの環境変数に
DATABASE_URLが設定されていることを確認し、手動でLambdaを実行した際にDBアクセス情報がログに出力されていたらOK!
CI/CD実装
CockroachDBの変更をCI/CDとして組み込むためには、デプロイ順を CockroachDB -> Amplify とする必要があります。
デフォルトのAmplifyの設定では、ブランチへのマージのタイミングでデプロイが走ってしまうため、設定を変更し Github Actionからデプロイができるように変更します。
1. Amplifyのデプロイ方法の変更
2. AmplifyをGithub Actionsからデプロイ
Github Actions からデプロイするために必要な情報を作成します
- AWSのOIDCを設定
- OIDCの設定方法はこちらの記事が分かりやすかったです
- ロールには
AmplifyBackendDeployFullAccessをアタッチします
- Github ActionsからのAmplifyのデプロイのためにwebhookを取得します
3. Workflowの実装
以下の実装でmainブランチへのマージ時に、CockroachDBへのマイグレーションの後にAmplifyのデプロイを実行できるようにします。
必要なシークレット情報はあらかじめgithubに設定しておきます。
name: CI/CD
on:
pull_request:
branches: [main]
push:
branches: [main]
workflow_dispatch:
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
permissions:
contents: read
jobs:
db:
name: Drizzle Generate & Migrate
runs-on: ubuntu-latest
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
concurrency:
group: db-migrate-${{ github.ref_name }}
cancel-in-progress: false
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: 22
cache: npm
- name: Install dependencies
run: npm ci
- name: Drizzle generate
run: npx drizzle-kit generate
- name: Drizzle migrate
env:
DATABASE_URL: ${{ secrets.DATABASE_URL }}
run: npx drizzle-kit migrate
deploy:
name: Amplify Deploy
runs-on: ubuntu-latest
needs: [db]
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
permissions:
contents: read
id-token: write
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: 22
cache: npm
- name: Install dependencies
run: npm ci
- name: Configure AWS credentials (OIDC)
uses: aws-actions/configure-aws-credentials@v4
with:
role-to-assume: ${{ secrets.AWS_ROLE_ARN }}
aws-region: ${{ secrets.AWS_REGION }}
- name: Amplify pipeline deploy
env:
AMPLIFY_APP_ID: ${{ secrets.AMPLIFY_APP_ID }}
AMPLIFY_BRANCH: ${{ github.ref_name }}
run: npx ampx pipeline-deploy --branch $AMPLIFY_BRANCH --app-id $AMPLIFY_APP_ID
おわりに
本記事ではAmplifyでCockroachDBを利用する方法についてまとめました。
AmplifyでDynamoDB以外の選択肢を検討する場合は是非利用してみてはいかがでしょうか?








