2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【CockroachDB】 Amplifyで激安RDBを使おう!

2
Last updated at Posted at 2026-01-18

はじめに

本記事では 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 サービスの方が低コストになるケースもあると思いますが)。

また、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をサブスクライブ

  • CockroachDBにてアカウントを作成
  • 支払いがAWS Marketplace経由になっていることを確認する
    5eea6aad5c77-20260117.png

2. CockroachDBのClusterを作成

  • Clusterを選択し、情報を入力していく
    • Free plan, AWSを選択
    • regionはデフォルトを選択
      • 現時点(2026/01/18)で日本リージョンはありませんでした
    • cluster-nameは変更できないので注意

d483fea95804-20260117.png

  • DBへの接続情報は右上のConnectから確認できる

7f9435394caf-20260117.png

Drizzleの導入とCockroachDBのテーブル構築

1. Drizzleの導入

  • CockroachDBをORMで用いるためにDrizzleを導入します
npm i drizzle-orm@beta pg dotenv
npm i -D drizzle-kit@beta tsx @types/pg

2. テーブル構築

  • .envにDBへの接続情報としてDATABASE_URLを加えます
    • 接続情報はCockroachDBの管理コンソールから確認できます
      c512ef71fb2d-20260117.png
.env
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
  • テーブルの作成はCockroachDBの管理コンソールよりクエリで確認できます
    image.png

9ef49d8f73ed-20260117.png

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も設定しておく

26d0360f8233-20260117.png

4. Lambdaの実行と疎通確認

  • Lambdaの環境変数にDATABASE_URLが設定されていることを確認し、手動でLambdaを実行した際にDBアクセス情報がログに出力されていたらOK!

image.png

CI/CD実装

CockroachDBの変更をCI/CDとして組み込むためには、デプロイ順を CockroachDB -> Amplify とする必要があります。
デフォルトのAmplifyの設定では、ブランチへのマージのタイミングでデプロイが走ってしまうため、設定を変更し Github Actionからデプロイができるように変更します。

1. Amplifyのデプロイ方法の変更

  • 画像の箇所より自動ビルドを無効化し、ブランチへのマージのタイミングでデプロイが走らないようにします
    3ee11db11b90-20260117.png

2. AmplifyをGithub Actionsからデプロイ

Github Actions からデプロイするために必要な情報を作成します

  • AWSのOIDCを設定
    • OIDCの設定方法はこちらの記事が分かりやすかったです
    • ロールには AmplifyBackendDeployFullAccessをアタッチします
  • Github ActionsからのAmplifyのデプロイのためにwebhookを取得します
    cdd0be184e06-20260117.png

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以外の選択肢を検討する場合は是非利用してみてはいかがでしょうか?

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?