この記事では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連携までを実例コード付きで解説する。
: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 |
| 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 インスタンスは url・reset()・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プロジェクト |
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で一括テストできる。
: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()])
})
afterEach で reset() を呼ぶとテストごとに完全クリーンな状態に戻せる。テスト間の汚染を防ぐベストプラクティスだ。
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のフルスタック開発環境が整う。
参照ソース
- vercel-labs/emulate (GitHub) — 本記事の対象OSSリポジトリ
- @emulators/aws README — S3/SQS/IAM/STSのAPI仕様一次ソース
- emulate.dev 公式ドキュメント — Vercel Labsによる公式ガイド
- AWS SDK for JavaScript v3 - S3 Client
- AWS SDK for JavaScript v3 - SQS Client
- Slack Web API - @slack/web-api
- Slack Incoming Webhooks - @slack/webhook