この記事ではDevOps・自動化に特化して解説します。AI自動化・DevOps全般は AI自動化ツール完全ガイド2026|ノーコードからコードまで徹底比較 をご覧ください。

Vercel Emulateとは|LocalStack代替の新定番サービスエミュレーター

Vercel Emulateは、LocalStack代替として注目されるサービスエミュレーターだ。npx emulate 一発でAWS(S3・SQS)・Slack・GitHub・Googleなど主要サービスをローカルに立ち上げ、Docker不要でテスト・CI/CDに組み込める。AWS SDKやSlack SDKの接続先URLをローカルポートに差し替えるだけで、本番と同じインターフェースのモックAPIが動く。

「LocalStackは便利だがDockerが重い」「外部APIを叩くテストが不安定」「CI環境がネットワーク制限されていて困っている」——こうした課題を解決するのがVercel Emulateの立ち位置だ。本記事ではLocalStackとの違い、npx emulate の使い方、AWS/Slackの実装例、Vitest/Jest統合、CI/CD連携までを実例コード付きで解説する。

graph LR A["アプリケーション"] A --> V["Vercel Emulator
:4000"] A --> G["GitHub Emulator
:4001"] A --> Go["Google Emulator
:4002"] A --> S["Slack Emulator
:4003"] A --> AW["AWS Emulator
:4006
(S3/SQS/IAM/STS)"] V --> Impl["ステートフルなAPI実装
(Emulate コア)"] G --> Impl Go --> Impl S --> Impl AW --> Impl style Impl fill:#d4edda,stroke:#28a745

Vercel Emulateの最大の特徴は「ステートフルなAPI実装」を提供する点だ。単なるリクエスト・レスポンスのモックではなく、S3バケットへのPUT→GETやSQSへの送信→受信といった「状態を持つ」APIフローがそのまま動く。本物のAWSやSlackと同じインターフェースで開発・テストできるため、本番との差異が出にくい。

この章のポイント
Vercel EmulateはDocker不要・npx emulate一発で起動するサービスエミュレーター
ステートフル実装でS3・SQS・Slack・GitHub等が本物と同じ手順で動く
LocalStack代替・テスト自動化・CI/CD組み込みの3用途で強い

npx emulate で始める Vercel Emulate の使い方

Vercel Emulateの導入は驚くほどシンプルだ。Node.js環境さえあれば、インストール不要で全サービスが起動する。

全サービスを一発起動

npx emulate

これだけで以下のサービスが各ポートで稼働する。

サービス ポート 主なエミュレート対象 代表的なSDK
Vercel 4000 Deployments API @vercel/client
GitHub 4001 REST API、Webhooks @octokit/rest
Google 4002 OAuth、Sheets、Drive等 googleapis
Slack 4003 Web API、Webhook、Events API @slack/web-api, @slack/webhook
Apple 4004 Sign in with Apple等
Microsoft 4005 Graph API等 @azure/msal-node
AWS 4006 S3、SQS、IAM、STS @aws-sdk/client-s3, @aws-sdk/client-sqs

CLIオプションと選択起動

特定のサービスだけ起動したい場合は --service フラグを使う。

# AWSとSlackだけ起動
emulate --service aws,slack

# カスタム起点ポート(サービスごとに+1で自動増加)
emulate --port 3000

# 設定ファイル使用
emulate --seed config.yaml

# サービス別の設定スターターを生成
emulate init --service aws

# 利用可能サービス一覧
emulate list

ポートは環境変数 EMULATE_PORT または PORT でも指定可能。CI環境ではこちらが扱いやすい。

プログラマティックAPIで細かく制御

テストフレームワークから直接呼ぶ場合は createEmulator() を使う。

import { createEmulator } from 'emulate'

const aws = await createEmulator({ service: 'aws', port: 4006 })
const slack = await createEmulator({ service: 'slack', port: 4003 })

aws.url     // 'http://localhost:4006'
slack.url   // 'http://localhost:4003'

await Promise.all([aws.close(), slack.close()])

Emulator インスタンスは urlreset()close() の3つを公開する。reset() はストアを空にしてseedを再適用するため、テストごとに状態をリセットしたいときに便利だ。


AWSエミュレータ3製品比較|LocalStack・kumo・Vercel Emulateをどう使い分けるか

「Vercel Emulate vs LocalStack」は最も多い検討ポイントだが、実はもう一つ有力なライバルがある。Go製のkumoだ。AWS専業の軽量エミュレータとして676スターを集めており、用途次第では Vercel Emulate より適することもある。3製品を横並びで整理する。

Vercel Emulate vs LocalStack vs kumo 比較表

項目 Vercel Emulate LocalStack kumo
実装言語 TypeScript (Node.js) Python Go
配布形態 npxパッケージ Dockerイメージ 単一バイナリ
Docker依存 ❌ なし ✅ 必須 ❌ なし(任意)
メモリ使用量 軽量(数十MB) 重量(数百MB〜1GB+) 軽量(数十MB)
対応サービス 7マルチクラウド(AWS基本+Vercel/GitHub/Slack等) AWS 80+サービス AWS 74サービス(AWS専業)
AWSカバレッジ S3・SQS・IAM・STS(基本) Lambda・ECS・RDS等の高度サービスも S3/Lambda/EC2/DynamoDB/RDS等を広範囲
マルチサービス ✅ AWS以外(Slack/GitHub等)も ❌ AWSのみ ❌ AWSのみ
データ永続化 reset()でメモリリセット 永続ボリューム対応 KUMO_DATA_DIR で永続化可
CI/CD統合 設定ゼロ・Node.jsのみで動作 Docker-in-Dockerの設定が必要なケースあり バイナリ配布で軽量・CI親和性高
料金 OSS完全無料 OSS無料 + Pro(有料プラン) OSS完全無料
最適な用途 マルチサービス統合テスト 本格AWSインフラ・IaC検証 AWSを多用するGoプロジェクト
graph TD A["何をテストしたい?"] A -->|"AWSだけ・74サービスを軽量に
Goプロジェクト中心"| K["kumo
(Go単一バイナリ・AWS専業)"] A -->|"AWSの本格インフラ
Lambda/RDS/ECS/IaC検証"| L["LocalStack
(Docker前提・80+サービス)"] A -->|"AWS基本 + Slack/GitHub等
マルチサービスを軽量に"| V["Vercel Emulate
(Docker不要・Node.js)"] K --> K2["バイナリ配布で
CI高速起動"] L --> L2["LocalStack Pro検討
(高度AWSサービス)"] V --> V2["npx emulate で
マルチサービス起動"] style V fill:#d4edda,stroke:#28a745 style K fill:#fff3cd,stroke:#ffc107

Vercel Emulateを選ぶべきケース

  • Docker環境を持たない/避けたいCI:軽量ランナーや権限制限環境で npx 一発が効く
  • AWS+Slack/GitHubの統合テスト:1ツールでマルチサービスのモックが完結(kumo・LocalStackには不可能)
  • TypeScriptで細かく制御したいcreateEmulator()によるプログラマティック起動
  • 立ち上げ速度重視:Dockerイメージpullが不要、Node.jsプロセスとして瞬時起動

kumoを選ぶべきケース

  • AWSだけを使うGo製プロジェクト:AWS Go SDK v2と相性が良く単一バイナリで配布できる
  • EC2・Glacier・MSKなど Vercel Emulateにない AWSサービスを使うkumo は74サービスに対応しカバレッジが広い
  • データ永続化が必要KUMO_DATA_DIR でテスト間や再起動でも状態を保持できる

LocalStackを継続すべきケース

  • Lambda・ECS・API Gatewayなど高度AWSサービスを実行する:Vercel EmulateのAWSカバーはS3/SQS/IAM/STSまで、kumoより一段深い実行環境が必要な場合
  • Terraform/CDK/CloudFormationでIaC検証:LocalStackはインフラコード実行環境としての実績が厚い
  • 既存LocalStackテスト資産が大規模:書き直しコストを天秤にかける
  • エンタープライズ商用サポートが必須:LocalStack Proの保証が必要な場面
# LocalStack(Docker必須)
docker run --rm -p 4566:4566 localstack/localstack

# kumo(Go単一バイナリ)
./kumo

# Vercel Emulate(Docker不要・Node.jsのみ)
npx emulate --service aws

AWS DevOps AgentのようなAWS自動化ツールを開発中なら、ローカル検証用のスタックとしてVercel EmulateやkumoはCIへの組み込みが容易だ。

第4の選択肢:MiniStack(実コンテナ起動が強み)

2026年4月、Vercel Emulate / kumo / LocalStack に続く第4の選択肢として MiniStack(MIT・Python製のAWSローカルエミュレータ) が急成長している。LocalStack有償化(BSL)への対抗馬として登場し、執筆時点でGitHub Stars 2,400・Forks 185。

観点 Vercel Emulate MiniStack
言語 TypeScript Python
Docker要否 不要(npx一発) 必須(pip/Dockerのいずれか)
対応サービス数 7マルチクラウド(AWS基本+Slack/GitHub等) 40+ AWSサービス
AWS互換ポート 独自エンドポイント LocalStack互換(:4566)
Slack/GitHub対応 対応 対応せず
実コンテナ起動 なし(モック) RDS=実Postgres / EKS=実k3s
主戦場 JS/TSテスト・マルチサービスモック 本番に近い実DB統合テスト

「Vercel Emulate vs MiniStack」は、実は対立軸ではなく役割分担の関係だ。Vercel EmulateはNode.jsエコシステムでJS/TSテストランナー(Vitest/Jest)からSlack/GitHub APIを軽量モック、MiniStackはPython側の実コンテナ統合で本番並みのSQLテスト。両方併用する設計が最も合理的になる。

# Vercel Emulate(AWS基本 + SaaS連携モック)
npx emulate --service aws --service slack --service github

# MiniStack(実Postgresで統合テスト)
docker run -p 4566:4566 -v /var/run/docker.sock:/var/run/docker.sock ministackorg/ministack

Vercel Emulateでユニット → MiniStackで統合テスト → AWS本番デプロイ」という3段階パイプラインが、どちらもMIT/OSSで$0で組める。LocalStack Pro($35〜/月)の代替として、3者併用が2026年の実用解だ。


AWS(S3・SQS)をローカルでテストする実例

AWS SDKの endpoint オプションにエミュレーターURLを指定するだけで、本番のIAM認証なしにS3やSQSのAPIを呼び出せる。Vercel EmulateのAWSポートはデフォルト :4006

S3:JSONファイルのアップロードと取得

import { createEmulator } from 'emulate'
import { S3Client, PutObjectCommand, GetObjectCommand } from '@aws-sdk/client-s3'

const aws = await createEmulator({ service: 'aws', port: 4006 })

const s3 = new S3Client({
  region: 'us-east-1',
  endpoint: aws.url,
  forcePathStyle: true, // ローカルエミュレーターでは必須
  credentials: { accessKeyId: 'test', secretAccessKey: 'test' }
})

await s3.send(new PutObjectCommand({
  Bucket: 'test-bucket',
  Key: 'uploads/report.json',
  Body: JSON.stringify({ result: 'ok' }),
  ContentType: 'application/json'
}))

const { Body } = await s3.send(new GetObjectCommand({
  Bucket: 'test-bucket',
  Key: 'uploads/report.json'
}))
console.log(await Body?.transformToString()) // '{"result":"ok"}'

await aws.close()

S3:画像ファイル(PNG/JPEG)のアップロード

S3エミュレーターは Body にバイナリも受け取れる。画像・動画・PDFなど任意のバイナリを本物のS3と同じ手順でアップロードできる。

import fs from 'node:fs/promises'
import { S3Client, PutObjectCommand, GetObjectCommand } from '@aws-sdk/client-s3'

// テスト用の画像を読み込み
const png = await fs.readFile('./test-fixtures/avatar.png')

await s3.send(new PutObjectCommand({
  Bucket: 'test-bucket',
  Key: 'avatars/user-123.png',
  Body: png,                  // BufferでもUint8ArrayでもReadableStreamでもOK
  ContentType: 'image/png',
  Metadata: { 'uploaded-by': 'test' }
}))

// 取得してファイルサイズ検証
const { Body, ContentType } = await s3.send(new GetObjectCommand({
  Bucket: 'test-bucket',
  Key: 'avatars/user-123.png'
}))

const downloaded = Buffer.from(await Body!.transformToByteArray())
console.log(ContentType, downloaded.length) // 'image/png' 12345

実体はEmulateプロセス内のメモリストアに保持されるため、テスト後に aws.reset() を呼べば全データが消える。テストごとにクリーンな状態を担保しやすい。

SQS:キューメッセージの送受信

import { SQSClient, SendMessageCommand, ReceiveMessageCommand } from '@aws-sdk/client-sqs'

const sqs = new SQSClient({
  region: 'us-east-1',
  endpoint: aws.url,
  credentials: { accessKeyId: 'test', secretAccessKey: 'test' }
})

const queueUrl = `${aws.url}/000000000000/test-queue`

await sqs.send(new SendMessageCommand({
  QueueUrl: queueUrl,
  MessageBody: JSON.stringify({ event: 'user.created', userId: '123' })
}))

const { Messages } = await sqs.send(new ReceiveMessageCommand({
  QueueUrl: queueUrl,
  MaxNumberOfMessages: 10
}))
console.log(Messages)

SlackのWebhook/APIをVercel Emulateでローカルテストする

Vercel EmulateはSlack APIをローカルポート(デフォルト :4003)でエミュレートする。@slack/web-api / @slack/webhook SDKの接続先URLを差し替えるだけで、Incoming Webhook・Bolt・slash commandのテストがネットワーク不要で実行可能だ。

Slack Web APIでメッセージ送信をテスト

import { createEmulator } from 'emulate'
import { WebClient } from '@slack/web-api'

const slack = await createEmulator({ service: 'slack', port: 4003 })

// slackApiUrl にエミュレーターURLを指定
const client = new WebClient('xoxb-test-token', {
  slackApiUrl: `${slack.url}/api/`
})

const result = await client.chat.postMessage({
  channel: '#general',
  text: 'デプロイ完了! :rocket:',
  blocks: [
    {
      type: 'section',
      text: { type: 'mrkdwn', text: '*デプロイ完了*\n本番環境へのデプロイが成功しました。' }
    }
  ]
})

console.log('Message sent, ts:', result.ts)
await slack.close()

Incoming Webhookのテスト

import { IncomingWebhook } from '@slack/webhook'

const webhook = new IncomingWebhook(
  `${slack.url}/services/T00000000/B00000000/XXXXXXXXXX`
)

await webhook.send({
  text: 'CI/CDパイプラインが完了しました',
  attachments: [
    {
      color: 'good',
      fields: [
        { title: 'ブランチ', value: 'main', short: true },
        { title: 'ステータス', value: '成功', short: true }
      ]
    }
  ]
})

AWS+Slackを組み合わせた統合テスト

SQSメッセージをトリガーにSlackへ通知する典型的なフローも、Vercel Emulateで一括テストできる。

sequenceDiagram participant Test as テストコード participant AWS as AWS Emulator
:4006 participant App as アプリケーション participant Slack as Slack Emulator
:4003 Test->>AWS: SQSメッセージ送信
(order.completed) AWS-->>App: メッセージ配信 App->>App: イベント処理 App->>Slack: chat.postMessage
(注文完了通知) Slack-->>Test: レスポンス確認 Test->>Test: アサーション
test('SQSメッセージ受信後にSlack通知を送る', async () => {
  await sqs.send(new SendMessageCommand({
    QueueUrl: `${aws.url}/000000000000/events`,
    MessageBody: JSON.stringify({ type: 'order.completed', orderId: '456' })
  }))

  const result = await slackClient.chat.postMessage({
    channel: '#orders',
    text: '注文 #456 が完了しました'
  })

  expect(result.ok).toBe(true)
})

Vitest/Jest統合とCI/CD連携

Vercel Emulateの真価はテスト自動化に組み込んだときに発揮される。Vitest/Jestで beforeAll に立ち上げ、afterAll で閉じるパターンが定石だ。

Vitestでの統合セットアップ

// vitest.setup.ts
import { createEmulator, type Emulator } from 'emulate'

let aws: Emulator
let slack: Emulator

beforeAll(async () => {
  ;[aws, slack] = await Promise.all([
    createEmulator({ service: 'aws', port: 4006 }),
    createEmulator({ service: 'slack', port: 4003 })
  ])
  process.env.AWS_ENDPOINT_URL = aws.url
  process.env.SLACK_API_URL = `${slack.url}/api/`
})

afterEach(() => {
  // 各テスト後にストアをリセット
  aws.reset()
  slack.reset()
})

afterAll(async () => {
  await Promise.all([aws.close(), slack.close()])
})

afterEachreset() を呼ぶとテストごとに完全クリーンな状態に戻せる。テスト間の汚染を防ぐベストプラクティスだ。

YAMLで初期データをseedする

emulate.config.yaml を置けば、起動時にバケットやキューを自動作成できる。テストデータを毎回コードで作る必要がなくなる。

aws:
  region: us-east-1
  s3:
    buckets:
      - name: my-app-uploads
      - name: my-app-thumbnails
  sqs:
    queues:
      - name: my-app-events
      - name: my-app-dlq
  iam:
    users:
      - user_name: developer
        create_access_key: true

GitHub Actionsでの設定例

CI環境でも追加のサービスコンテナ定義は不要。Node.jsステップの中で npx emulate をバックグラウンド起動するだけで動く。

# .github/workflows/test.yml
name: Test
on: [push, pull_request]

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with: { node-version: '20' }
      - run: npm ci
      - run: npx emulate &           # バックグラウンド起動
      - run: npx wait-on http://localhost:4006  # 起動待ち
      - run: npm test                 # Vitest実行

LocalStackのようにDocker-in-Docker設定が要らないため、GitHub Actions・GitLab CI・CircleCIなどどのCIにも素直に入る。テスト自動化の文脈ではAIO Sandbox入門のようなDockerベースのサンドボックスと使い分けると、軽量検証はEmulate・本格分離はSandboxという棲み分けがしやすい。


Vercel Emulateよくある質問(FAQ)

Vercel EmulateはLocalStackの代替になりますか?

S3/SQS/IAM/STS相当の基本機能なら代替可能。Docker不要で npx emulate 一発で起動でき、CI環境への組み込みが容易だ。Lambda・API Gateway・ECS・RDSなど高度なAWSサービスはサポート外なので、その場合はLocalStack Proの継続が現実的。

S3に画像ファイルをアップロードできますか?

可能。AWS SDKの PutObjectCommand でBodyに Buffer/Uint8Array/ReadableStream を渡し、ContentTypeを image/png 等に指定すれば本物のS3と同じ手順で動く。実体はローカルプロセス内のメモリストアに保存されるため、テスト後 reset() で消去できる。

Dockerは本当に不要ですか?

不要。Node.jsだけあれば npx emulate で全サービスが立ち上がる。LocalStackと違いDocker DesktopやDocker-in-Dockerの構築が要らないため、GitHub Actionsの軽量ランナーや権限制限の厳しいCI環境にも入れやすい。

対応サービスは何ですか?

現在7サービス:Vercel(:4000)・GitHub(:4001)・Google(:4002)・Slack(:4003)・Apple(:4004)・Microsoft(:4005)・AWS(:4006)。AWSはS3/SQS/IAM/STSの主要API、SlackはWeb API/Webhook/Events APIをカバーしている。

料金はかかりますか?

完全無料のOSS。LocalStackのような有料Proプランは存在せず、商用利用にも追加コストはかからない。Vercel Labsが運営する公式OSSとしてGitHubで開発されている。


関連記事: AI自動化ツール完全ガイド2026|ノーコードからコードまで徹底比較

まとめ:本物に近いステートフルAPIをローカルで持てる時代

Vercel Emulateは、LocalStack代替を探していた開発者にとって極めて強力な選択肢だ。Docker不要・npx emulate 一発・ステートフルな本物相当の挙動——この3点が揃ったローカルエミュレーターは他に少ない。

S3への画像アップロードからSQSとSlackの統合フローまで、本番のSDKをそのまま使ってテストできる。CI環境への組み込みも素直で、GitHub Actionsならわずか数行追加するだけで動く。AIエージェントによる自動化開発が増えるなか、こうした「軽量で本物に近い」テスト基盤の価値は今後さらに高まるだろう。

LocalStackを使い続けるかEmulateに乗り換えるかはユースケース次第だが、新規プロジェクトならまずVercel Emulateから始めるのが現代的な選択と言える。

同じVercel Labsが公開するOSSとして、DOM描画型ウェブターミナルエミュレータのwtermやAIコーディングエージェント基盤のopen-agentsも注目されている。テスト(Emulate)・ターミナル(wterm)・エージェント(open-agents)の組み合わせでVercel Labs OSSのフルスタック開発環境が整う。

参照ソース