※本記事には広告(楽天アフィリエイト)リンクが含まれる場合があります。

「Vercelにデプロイしたいが、DBサーバーを常時起動するのはコストがかかる」「個人開発でPostgreSQLを使いたいが、PlanetScaleがMySQL専用で困っている」——こうした悩みを持つ開発者が2026年いま注目しているのが Neon Postgres です。

Neon は サーバーレス専用に設計されたPostgreSQL サービスです。アクセスがなければコンピュートが自動で停止し、リクエストが来たら数百ミリ秒で再起動します。Supabase や Railway と並ぶ定番になりつつありますが、完全なPostSQL互換・Git のようなデータベースブランチ・Vercel/Cloudflare Workers との深い統合という独自の強みを持ちます。

この記事では、Neon の概要から無料プランの詳細、セットアップ手順、ブランチ機能の実践活用、Next.js・Drizzle ORM・Prisma との連携方法まで、個人開発者が知っておくべきすべてを解説します。

広告・楽天アフィリエイト

プログラミング技術書

実践寄りの技術書・参考書を探す。

楽天ポイント還元

技術書を楽天で見る →

Neon Postgresとは?設計思想と主な特徴

Neon は 2022年に公開されたサーバーレス PostgreSQL サービスです。従来のマネージドDB(RDS、Cloud SQL など)は「使っていなくてもインスタンスが起動し続けてコストがかかる」という問題がありました。Neon はこれを解決するために、コンピュートとストレージを完全に分離したアーキテクチャを採用しています。

Neonのアーキテクチャ

Neon の内部は大きく2層に分かれます。

  • Pageserver(ストレージ層):PostgreSQL のページデータをオブジェクトストレージ(S3互換)に保持し、WAL を受け取って更新します。常時稼働しており、データは永続化されます。
  • Compute(コンピュート層):クエリを実行する PostgreSQL プロセスです。リクエストが来ると起動し、アイドル時には自動で停止します(Auto-suspend)。

この分離により、ストレージコストは使った分だけ、コンピュートコストはアクティブな時間だけで済みます。個人開発や開発環境では実質ほぼ無料で使えるケースが多いです。

主な特徴一覧

機能 詳細
Auto-suspend アイドル時(デフォルト5分)に自動停止、Cold startは約500ms
Autoscaling 負荷に応じてCPU・メモリをスケールアップ(有料プラン)
ブランチ機能 DB を Git のようにブランチ・コピーできる独自機能
PgBouncer統合 サーバーレス環境向けのコネクションプーリング内蔵
PostgreSQL互換 標準PostgreSQL 16.x互換。拡張機能(pgvector等)も利用可
リージョン 米国・EU・アジア(東京含む)など複数リージョン対応

料金プランと無料枠の詳細

Neon の無料プラン(Free Tier)は個人開発に十分な枠を提供しています。

項目 Free Launch($19/月〜) Scale($69/月〜)
ストレージ 0.5 GB 10 GB 50 GB
コンピュート時間 191.9時間/月 300時間/月〜 750時間/月〜
プロジェクト数 1プロジェクト 複数 複数
ブランチ数 10 無制限 無制限
Auto-suspend ◎(5分) ◎(設定可) ◎(設定可)
Autoscaling × ◎(0.25〜4 CU) ◎(0.25〜8 CU)

Free プランの 191.9時間/月は、1 Compute Unit(CU)換算で約8日分のアクティブ時間です。Auto-suspend を活用すると、実際には1日数時間しか使わないため、趣味プロジェクトや個人開発ならほぼ枠を使い切ることなく運用できます。

Supabase・Railwayとの比較

個人開発者がよく比較するサービスと並べると、Neon の立ち位置が明確になります。

比較項目 Neon Supabase Railway
DB種別 PostgreSQL専用 PostgreSQL+BaaS 各種DB(Postgres/MySQL等)
コールドスタート ◎ ~500ms △ ~数秒(無料枠) △ インスタンス起動が必要
ブランチ機能 ◎ Git同様のDB分岐 × ×
Cloudflare Workers対応 ◎ HTTP接続対応 △ ×
認証・ストレージ等BaaS ×(DBのみ) ◎ 全部入り △ 他サービス組み合わせ
無料プロジェクト数 1 2 制限あり
pgvector対応 ◎ ◎ ◎

Neon は「純粋なサーバーレスPostgreSQL」として際立っています。認証やストレージが不要でDBだけ欲しい、Vercel/Cloudflare Workers でエッジDBが欲しいという用途に最適です。認証・リアルタイムもすべて1サービスで完結したい場合は Supabase の方が向いています。

広告・楽天アフィリエイト

ガジェット・オーディオ

イヤホン・便利ガジェットをポイント還元で。

楽天ポイント還元

ガジェットを楽天で見る →

Neonのセットアップ手順

1. アカウント作成とプロジェクト作成

Neon のダッシュボード(console.neon.tech)にアクセスし、GitHub アカウントで Sign Up します。最初のプロジェクト作成時にリージョンを選択できます。東京(AWS ap-northeast-1)も選択肢にあります。

プロジェクトを作成すると、接続文字列(Connection String)が発行されます。形式は以下の通りです。

postgres://username:password@ep-xxxx.ap-northeast-1.aws.neon.tech/neondb?sslmode=require

2. Neon Serverless Driverのインストール

Vercel や Cloudflare Workers など、Node.js の net モジュールが使えないエッジ環境では、HTTP/WebSocket ベースの専用ドライバーを使います。

npm install @neondatabase/serverless

通常の Node.js 環境では pg(node-postgres)や postgres.js をそのまま使えます。接続文字列を渡すだけで動作します。

import { neon } from '@neondatabase/serverless';

const sql = neon(process.env.DATABASE_URL!);

// タグ付きテンプレートリテラルでクエリ
const users = await sql`SELECT * FROM users WHERE id = ${userId}`;

ブランチ機能の使い方と実践活用法

Neon の最大の差別化機能がデータベースブランチです。Git のブランチと同じ感覚で、DB の特定の時点からブランチを切れます。

ブランチとはなにか

Neon のブランチはコピーではなくコピーオンライト(Copy-on-Write)で実装されています。親ブランチのデータを参照しながら、書き込みがあった時点で差分だけを記録します。これにより、数GBのDBでも数秒でブランチを作れますし、ストレージの無駄も最小限に抑えられます。

主な活用パターン

パターン1: 開発・テスト用ブランチ

本番DBのデータを含むブランチを開発者1人ずつ作り、それぞれの環境で安全にマイグレーションやデータ変更をテストできます。

# Neon CLIでブランチ作成
npx neonctl branch create --name feature/add-user-roles --project-id your-project-id

# ブランチの接続文字列取得
npx neonctl connection-string --branch feature/add-user-roles

パターン2: CI/CDでのマイグレーションテスト

GitHub Actions から PR ごとに Neon ブランチを自動作成し、マイグレーションを走らせてテストを実行する構成が人気です。

# .github/workflows/test.yml(抜粋)
- name: Create Neon branch
  uses: neondatabase/create-branch-action@v5
  with:
    project_id: ${{ vars.NEON_PROJECT_ID }}
    branch_name: preview/pr-${{ github.event.pull_request.number }}
    api_key: ${{ secrets.NEON_API_KEY }}

- name: Run migrations
  run: npx drizzle-kit migrate
  env:
    DATABASE_URL: ${{ steps.create-branch.outputs.db_url }}

パターン3: PITR(ポイントインタイムリカバリ)

有料プランでは、7日〜30日以内の任意の時点からブランチを切ることができます。誤ったデータ削除などの際に、削除前の状態からブランチを作って復元するためのリカバリ手段として使えます。

Drizzle ORMとの連携

Neon は Drizzle ORM との相性が非常に良く、公式ドキュメントでも推奨されています。

// db.ts
import { drizzle } from 'drizzle-orm/neon-http';
import { neon } from '@neondatabase/serverless';

const sql = neon(process.env.DATABASE_URL!);
export const db = drizzle(sql);

Cloudflare Workers でも同じパターンで動作します。Drizzle の型安全なクエリとNeonのエッジ互換HTTPドライバーは、モダンなエッジファースト開発のスタックとしてデファクトになりつつあります。

マイグレーション設定

// drizzle.config.ts
import { defineConfig } from 'drizzle-kit';

export default defineConfig({
  schema: './src/db/schema.ts',
  out: './drizzle',
  dialect: 'postgresql',
  dbCredentials: {
    url: process.env.DATABASE_URL!,
  },
});
# マイグレーション生成・適用
npx drizzle-kit generate
npx drizzle-kit migrate

Prismaとの連携

Prisma でも接続文字列を .env に設定するだけで使えます。ただし Prisma のコネクションプールはサーバーレス環境では問題が起きやすいため、Prisma Accelerate または PgBouncer 経由の接続文字列(Neon ダッシュボードの「Pooled connection」)を使うことを推奨します。

# .env
# 通常接続(マイグレーション用)
DATABASE_URL="postgres://user:pass@ep-xxxx.neon.tech/neondb?sslmode=require"

# プール接続(アプリケーション用)
DATABASE_URL_UNPOOLED="postgres://user:pass@ep-xxxx-pooler.neon.tech/neondb?sslmode=require"
// prisma/schema.prisma
datasource db {
  provider  = "postgresql"
  url       = env("DATABASE_URL")
  directUrl = env("DATABASE_URL_UNPOOLED")
}

Next.js App Routerでの実践パターン

Next.js の Server Components や Route Handlers からNeonに接続する際の推奨パターンを紹介します。

// app/api/posts/route.ts
import { neon } from '@neondatabase/serverless';
import { NextResponse } from 'next/server';

export const runtime = 'edge';  // エッジランタイムでも動作

export async function GET() {
  const sql = neon(process.env.DATABASE_URL!);
  const posts = await sql`
    SELECT id, title, created_at
    FROM posts
    ORDER BY created_at DESC
    LIMIT 20
  `;
  return NextResponse.json(posts);
}

runtime = 'edge' を指定することで Vercel のエッジネットワーク上で実行でき、DBも東京リージョンに置けばレイテンシを最小化できます。

pgvectorでRAG・ベクトル検索を実装する

Neon は pgvector 拡張機能をサポートしており、ベクトルデータの格納・検索が可能です。RAG(Retrieval-Augmented Generation)や類似ドキュメント検索をPostgreSQLだけで完結させられます。

-- pgvector有効化
CREATE EXTENSION IF NOT EXISTS vector;

-- ベクトルカラムを持つテーブル
CREATE TABLE documents (
  id SERIAL PRIMARY KEY,
  content TEXT NOT NULL,
  embedding vector(1536)  -- OpenAI text-embedding-3-small の次元数
);

-- コサイン類似度で上位5件を検索
SELECT content, 1 - (embedding <=> $1) AS similarity
FROM documents
ORDER BY embedding <=> $1
LIMIT 5;

Drizzle の場合は drizzle-orm/pg-core の customType や pgVector を使ってスキーマを定義できます。

パフォーマンスのTipsとよくある落とし穴

コールドスタートを回避するには

Auto-suspend の最小アイドル時間は 5 分ですが、有料プランでは無効化(常時起動)も選べます。無料プランでも、定期的な Cron ジョブ(例: 4分ごとにヘルスチェックリクエストを投げる)でウォームアップする手法が一般的です。

コネクション数の上限

サーバーレス関数は並列実行されるため、直接接続するとコネクション数がすぐ上限(Free: 最大20接続)に達します。Pooled Connection(PgBouncer)を使うのが必須です。Neon ダッシュボードの接続設定で「Connection pooling」を有効にした接続文字列を取得してください。

マイグレーションはDirect接続で

Prisma や Drizzle でマイグレーションを実行する際は、プール接続ではなく直接接続の URL を使います。プール経由では CREATE TABLE などのDDLが失敗することがあります(PgBouncer のトランザクションモードの制限)。

Vercelとのネイティブ統合

Vercel Marketplace から Neon をプロビジョニングすると、プレビューデプロイごとに自動でNeonブランチが作られる統合が利用できます。

  • PR ごとにプレビューURLとDBブランチがペアで作られる
  • PR がマージ・クローズされるとブランチが自動で削除される
  • 本番デプロイは main ブランチのDBを参照

この仕組みにより、フロントエンドのプレビューと同じ感覚でDBも「プレビュー環境」を持てます。チーム開発でのDB衝突問題が完全になくなります。

コスト試算:個人開発での実際の費用

個人開発・ポートフォリオ・趣味プロジェクトであれば、Free プランで十分なケースがほとんどです。

  • 1日2〜3時間のアクティブ利用 ≈ 月60〜90時間 → Free枠の191.9時間に余裕で収まる
  • ストレージ 0.5 GB ≈ 数万レコード規模のアプリなら十分
  • プロジェクト数1の制限 → 本番とステージングは1プロジェクト内でブランチで分ける

月間アクティブユーザーが100〜1000人規模のSaaSになったら Launch プラン($19/月〜)への移行が現実的です。

まとめ:Neonを使うべき状況

Neon Postgres は以下の状況に特に向いています。

  • Vercel / Cloudflare Workers / Deno Deploy などのサーバーレス・エッジ環境で PostgreSQL を使いたい
  • PR ごとのプレビュー環境に対応したDBブランチが欲しい
  • 認証やストレージは別サービス(Clerk、Cloudflare R2 など)で用意し、DBだけ欲しい
  • pgvector でベクトル検索を PostgreSQL 上で完結させたい
  • コストを抑えつつ PostgreSQL の全機能を使いたい

逆に、認証・リアルタイム・ストレージを含む BaaS が欲しい場合は Supabase、複数の DB を1プロジェクトで管理したい場合は Railway が向いています。「サーバーレス PostgreSQL を最も自然に使えるサービス」としてNeonは2026年のスタンダードになりつつあります。個人開発の次のプロジェクトでぜひ試してみてください。

広告・楽天アフィリエイト

ノートパソコン特集

開発用ノートPCをスペック・口コミで比較。

楽天ポイント還元

ノートPCを楽天で見る →