※本記事には広告(楽天アフィリエイト)リンクが含まれる場合があります。
「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年のスタンダードになりつつあります。個人開発の次のプロジェクトでぜひ試してみてください。