azure-emulators-2025 について
Docker ベースのエミュレーターや代替手段を使った Azure サービスのローカル開発を支援する開発者向けガイドです。設定、連携、制限事項、ローカル環境の運用方法を扱います。
主な機能
- 01Azure サービスエミュレーターの解説
- 02Azurite ストレージ設定
- 03Cosmos DB と Service Bus の設定
- 04SQL とデータベースの代替案
- 05Docker 環境の運用指針
活用シーン
- 01Azure サービスのローカル代替手段の選定
- 02開発用エミュレーターコンテナーの設定
- 03Azure からローカルエミュレーターへの移行計画
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ josiahsiegel/ claude-plugin-marketplace --skill azure-emulators-2025インストール後、Claude Code で/azure-emulators-2025を入力して読み込まれたか確認します。
詳細
ローカル開発向け Azure サービスエミュレーター(2025 年)
概要
このスキルでは、2025 年のローカル開発で利用できる、Docker コンテナーとして提供される Azure サービスエミュレーターについて包括的に解説します。
利用可能な Azure エミュレーター
1. Azurite(Azure Storage エミュレーター)
非推奨となった Azure Storage Emulator の公式後継
イメージ: mcr.microsoft.com/azure-storage/azurite:latest
サポートされているサービス:
- Blob Storage
- Queue Storage
- Table Storage
構成:
services:
azurite:
image: mcr.microsoft.com/azure-storage/azurite:latest
container_name: azurite
command: azurite --blobHost 0.0.0.0 --queueHost 0.0.0.0 --tableHost 0.0.0.0 --loose
ports:
- "10000:10000" # Blob service
- "10001:10001" # Queue service
- "10002:10002" # Table service
volumes:
- azurite-data:/data
restart: unless-stopped
標準的な開発用接続文字列:
DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://azurite:10000/devstoreaccount1;QueueEndpoint=http://azurite:10001/devstoreaccount1;TableEndpoint=http://azurite:10002/devstoreaccount1;
機能:
- クロスプラットフォーム(Windows、Linux、macOS)
- Node.js/JavaScript で記述
- 最新の Azure Storage API をサポート
- ディスクへの永続化
- Azure Storage Explorer と互換
- 検証を緩和する
--looseフラグ(ローカル開発に便利)
2025 年の API バージョンのサポート:
- 最新リリース(v3.35.0)は 2025-11-05 API バージョンを対象とします
- Blob サービス:2025-11-05
- Queue サービス:2025-11-05
- Table サービス:2025-11-05(プレビュー)
- 地理冗長レプリケーションのテスト向け RA-GRS サポート
CLI の使用方法:
# Install via npm (alternative to Docker)
npm install -g azurite
# Run with custom location
azurite --location /path/to/data --debug /path/to/debug.log
アプリケーションとの統合:
// Node.js with @azure/storage-blob
const { BlobServiceClient } = require('@azure/storage-blob');
const connectionString = process.env.AZURITE_CONNECTION_STRING;
const blobServiceClient = BlobServiceClient.fromConnectionString(connectionString);
// .NET with Azure.Storage.Blobs
using Azure.Storage.Blobs;
var connectionString = Environment.GetEnvironmentVariable("AZURITE_CONNECTION_STRING");
var blobServiceClient = new BlobServiceClient(connectionString);
2. Azure SQL Server 2025
AI 機能を備えた最新の SQL Server
イメージ: mcr.microsoft.com/mssql/server:2025-latest
2025 年の機能:
- AI 類似性クエリ向けの組み込みベクトル検索
- 従来のフルテキスト検索に加え、セマンティッククエリに対応
- 最適化されたロック(TID ロック、LAQ)
- ネイティブ JSON および RegEx サポート
- Fabric Mirroring との統合
- REST API サポート
構成:
services:
sqlserver:
image: mcr.microsoft.com/mssql/server:2025-latest
container_name: sqlserver
environment:
- ACCEPT_EULA=Y
- MSSQL_PID=Developer
- MSSQL_SA_PASSWORD_FILE=/run/secrets/sa_password
secrets:
- sa_password
ports:
- "1433:1433"
volumes:
- sqlserver-data:/var/opt/mssql
- ./init:/docker-entrypoint-initdb.d
healthcheck:
test: ["CMD-SHELL", "/opt/mssql-tools18/bin/sqlcmd -S localhost -U sa -P $$MSSQL_SA_PASSWORD -Q 'SELECT 1' -C || exit 1"]
interval: 10s
timeout: 3s
retries: 3
start_period: 10s
deploy:
resources:
limits:
cpus: '2'
memory: 4G
reservations:
cpus: '1'
memory: 2G
networks:
- backend
security_opt:
- no-new-privileges:true
restart: unless-stopped
secrets:
sa_password:
file: ./secrets/sa_password.txt
volumes:
sqlserver-data:
driver: local
接続文字列:
Server=sqlserver;Database=MyApp;User Id=sa;Password=YourStrong!Passw0rd;TrustServerCertificate=True;
重要な注意事項:
- Azure SQL Edge は 2025 年 9 月 30 日に提供終了 — 代わりに SQL Server 2025 を使用してください
- TLS 1.3 をサポートする
mssql-tools18を使用してください(-Cフラグで証明書を信頼します) - Developer エディションは本番以外の用途であれば無料です
- macOS では Rosetta 2 経由で arm64 をサポートします
ベクトル検索の例(2025 年の機能):
-- Create vector index for AI similarity search
CREATE TABLE Documents (
Id INT PRIMARY KEY,
Content NVARCHAR(MAX),
ContentVector VECTOR(1536)
);
-- Perform similarity search
SELECT TOP 10 Id, Content
FROM Documents
ORDER BY VECTOR_DISTANCE(ContentVector, @queryVector);
2025 vnext-preview の機能:
- 完全な Linux ベースのエミュレーター(クロスプラットフォーム:x64、ARM64、Apple Silicon)
- Apple Silicon または Microsoft ARM で仮想マシンは不要
- Changefeed のサポート(2025 年 4 月以降)
- ドキュメント TTL(Time-to-Live)のサポート
- OpenTelemetry V2 のサポート
- ゲートウェイモードでの NoSQL API
- 現在プレビュー中(開発継続中)
イメージ: mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator:vnext-preview
3. Cosmos DB エミュレーター
NoSQL データベースエミュレーター
イメージ: mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator:vnext-preview
構成:
services:
cosmosdb:
image: mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator:vnext-preview
container_name: cosmosdb
environment:
- AZURE_COSMOS_EMULATOR_PARTITION_COUNT=10
- AZURE_COSMOS_EMULATOR_ENABLE_DATA_PERSISTENCE=true
- AZURE_COSMOS_EMULATOR_IP_ADDRESS_OVERRIDE=127.0.0.1
ports:
- "8081:8081" # Data Explorer
- "10251:10251"
- "10252:10252"
- "10253:10253"
- "10254:10254"
volumes:
- cosmos-data:/data/db
deploy:
resources:
limits:
cpus: '2'
memory: 4G
networks:
- backend
restart: unless-stopped
エミュレーターのエンドポイント:
https://localhost:8081
エミュレーターキー(標準):
C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw==
Data Explorer:
https://localhost:8081/_explorer/index.html にアクセスします
アプリケーションとの統合:
// Node.js with @azure/cosmos
const { CosmosClient } = require('@azure/cosmos');
const endpoint = 'https://localhost:8081';
const key = process.env.COSMOS_EMULATOR_KEY;
const client = new CosmosClient({ endpoint, key });
// .NET with Microsoft.Azure.Cosmos
using Microsoft.Azure.Cosmos;
var endpoint = "https://localhost:8081";
var key = Environment.GetEnvironmentVariable("COSMOS_EMULATOR_KEY");
var client = new CosmosClient(endpoint, key);
制限事項:
- パフォーマンスは本番環境を反映しません
- ローカル開発では単一のパーティションに制限されます
- 証明書の信頼が必要です(自己署名)
2025 年の公式 Azure Service Bus エミュレーター:
- 公式 Docker コンテナーとしてリリース
- クロスプラットフォーム対応の Linux ベースエミュレーター
- 依存関係として Linux 版 SQL Server が必要
- AMQP プロトコル(ポート 5672)をサポート
- UseDevelopmentEmulator=true を含む接続文字列形式
- 現在の制限:JMS プロトコル、パーティション分割されたエンティティ、AMQP Web Sockets はサポートされません
公式エミュレーターイメージ: mcr.microsoft.com/azure-messaging/servicebus-emulator:latest
接続文字列:
Endpoint=sb://host.docker.internal;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=SAS_KEY_VALUE;UseDevelopmentEmulator=true;
4. Azure Service Bus エミュレーター
メッセージキューエミュレーター
注: 公式エミュレーターの Docker サポートは限定的です。代替として RabbitMQ を使用してください。
公式エミュレーター(プレビュー):
services:
servicebus-sql:
image: mcr.microsoft.com/mssql/server:2025-latest
environment:
- ACCEPT_EULA=Y
- MSSQL_SA_PASSWORD=ServiceBus123!
volumes:
- servicebus-sql-data:/var/opt/mssql
servicebus:
image: mcr.microsoft.com/azure-messaging/servicebus-emulator:latest
depends_on:
- servicebus-sql
environment:
- ACCEPT_EULA=Y
- SQL_SERVER=servicebus-sql
- SQL_SA_PASSWORD=ServiceBus123!
ports:
- "5672:5672" # AMQP
networks:
- backend
RabbitMQ の代替(推奨):
services:
rabbitmq:
image: rabbitmq:3.14-alpine
container_name: rabbitmq
ports:
- "5672:5672" # AMQP
- "15672:15672" # Management UI
environment:
- RABBITMQ_DEFAULT_USER=admin
- RABBITMQ_DEFAULT_PASS=admin123
volumes:
- rabbitmq-data:/var/lib/rabbitmq
healthcheck:
test: ["CMD", "rabbitmq-diagnostics", "ping"]
interval: 30s
timeout: 10s
retries: 3
networks:
- backend
restart: unless-stopped
5. PostgreSQL(Azure Database for PostgreSQL)
イメージ: postgres:16.6-alpine
構成:
services:
postgres:
image: postgres:16.6-alpine
container_name: postgres
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD_FILE=/run/secrets/postgres_password
- POSTGRES_DB=myapp
secrets:
- postgres_password
ports:
- "5432:5432"
volumes:
- postgres-data:/var/lib/postgresql/data
- ./init:/docker-entrypoint-initdb.d
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 10s
timeout: 3s
retries: 3
deploy:
resources:
limits:
cpus: '1'
memory: 2G
networks:
- backend
security_opt:
- no-new-privileges:true
restart: unless-stopped
拡張機能: Azure PostgreSQL Flexible Server の拡張機能に合わせます:
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
CREATE EXTENSION IF NOT EXISTS "pg_trgm";
CREATE EXTENSION IF NOT EXISTS "pgcrypto";
6. MySQL(Azure Database for MySQL)
イメージ: mysql:9.2
構成:
services:
mysql:
image: mysql:9.2
container_name: mysql
environment:
- MYSQL_ROOT_PASSWORD_FILE=/run/secrets/mysql_root_password
- MYSQL_DATABASE=myapp
- MYSQL_USER=appuser
- MYSQL_PASSWORD_FILE=/run/secrets/mysql_password
secrets:
- mysql_root_password
- mysql_password
ports:
- "3306:3306"
volumes:
- mysql-data:/var/lib/mysql
- ./init:/docker-entrypoint-initdb.d
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p$$MYSQL_ROOT_PASSWORD"]
interval: 10s
timeout: 3s
retries: 3
deploy:
resources:
limits:
cpus: '1'
memory: 2G
networks:
- backend
security_opt:
- no-new-privileges:true
restart: unless-stopped
7. Redis(Azure Cache for Redis)
イメージ: redis:7.4-alpine
構成:
services:
redis:
image: redis:7.4-alpine
container_name: redis
command: >
redis-server
--appendonly yes
--requirepass ${REDIS_PASSWORD}
--maxmemory 512mb
--maxmemory-policy allkeys-lru
ports:
- "6379:6379"
volumes:
- redis-data:/data
healthcheck:
test: ["CMD", "redis-cli", "--raw", "incr", "ping"]
interval: 10s
timeout: 3s
retries: 3
deploy:
resources:
limits:
cpus: '0.5'
memory: 512M
networks:
- backend
security_opt:
- no-new-privileges:true
restart: unless-stopped
8. Application Insights の代替(Jaeger + Grafana)
OpenTelemetry 互換の可観測性スタック
services:
jaeger:
image: jaegertracing/all-in-one:latest
container_name: jaeger
ports:
- "16686:16686" # UI
- "14268:14268" # HTTP collector
- "4317:4317" # OTLP gRPC
- "4318:4318" # OTLP HTTP
environment:
- COLLECTOR_OTLP_ENABLED=true
networks:
- monitoring
restart: unless-stopped
grafana:
image: grafana/grafana:latest
container_name: grafana
ports:
- "3001:3000"
environment:
- GF_SECURITY_ADMIN_PASSWORD=admin
volumes:
- grafana-data:/var/lib/grafana
networks:
- monitoring
restart: unless-stopped
Azure スタックの完全な例
services:
# Application Services
frontend:
build: ./frontend
ports: ["3000:3000"]
networks: [frontend]
depends_on:
backend:
condition: service_healthy
backend:
build: ./backend
ports: ["8080:8080"]
networks: [frontend, backend]
depends_on:
sqlserver:
condition: service_healthy
redis:
condition: service_started
azurite:
condition: service_started
# Databases
sqlserver:
image: mcr.microsoft.com/mssql/server:2025-latest
environment:
- ACCEPT_EULA=Y
- MSSQL_PID=Developer
- MSSQL_SA_PASSWORD=${MSSQL_SA_PASSWORD}
ports: ["1433:1433"]
volumes: [sqlserver-data:/var/opt/mssql]
networks: [backend]
healthcheck:
test: ["CMD-SHELL", "/opt/mssql-tools18/bin/sqlcmd -S localhost -U sa -P $$MSSQL_SA_PASSWORD -Q 'SELECT 1' -C"]
interval: 10s
postgres:
image: postgres:16.6-alpine
environment:
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
ports: ["5432:5432"]
volumes: [postgres-data:/var/lib/postgresql/data]
networks: [backend]
healthcheck:
test: ["CMD-SHELL", "pg_isready"]
interval: 10s
# Cache
redis:
image: redis:7.4-alpine
command: redis-server --requirepass ${REDIS_PASSWORD}
ports: ["6379:6379"]
volumes: [redis-data:/data]
networks: [backend]
# Storage
azurite:
image: mcr.microsoft.com/azure-storage/azurite:latest
command: azurite --blobHost 0.0.0.0 --queueHost 0.0.0.0 --tableHost 0.0.0.0 --loose
ports: ["10000:10000", "10001:10001", "10002:10002"]
volumes: [azurite-data:/data]
networks: [backend]
# NoSQL
cosmosdb:
image: mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator:vnext-preview
ports: ["8081:8081"]
volumes: [cosmos-data:/data/db]
networks: [backend]
# Monitoring
jaeger:
image: jaegertracing/all-in-one:latest
ports: ["16686:16686", "4317:4317"]
networks: [monitoring]
networks:
frontend:
driver: bridge
backend:
driver: bridge
internal: true
monitoring:
driver: bridge
volumes:
sqlserver-data:
postgres-data:
redis-data:
azurite-data:
cosmos-data:
ベストプラクティス
- ヘルスチェックを使用する - アプリの起動前に依存関係の準備が整っていることを確認します
- ネットワークを分離する - データベースは内部バックエンドネットワークに配置します
- リソース制限 - エミュレーターがシステムリソースを使い果たさないようにします
- 永続化 - 再起動後も保持するデータには名前付きボリュームを使用します
- シークレット管理 - Docker シークレットまたは環境ファイルを使用します
- バージョンの固定 -
latestではなく、特定のタグを使用します - セキュリティ強化 - ケイパビリティを削除し、可能であれば非 root ユーザーとして実行します
- ドキュメント - エミュレーターと Azure サービスの違いを記載します
既知の制限事項
- パフォーマンス:エミュレーターは Azure サービスより低速です
- スケール:単一インスタンスのみで、クラスター化には対応していません
- 機能:Azure 固有の機能の一部はローカルで利用できません
- SSL/TLS:自己署名証明書には信頼設定が必要です
- Azure AD:認証はローカルでは再現されません
- ネットワーク:VNet とプライベート エンドポイントは利用できません
移行チェックリスト
Azure から Docker エミュレーターに移行する場合:
- Azure Storage の接続文字列を Azurite 用に置き換える
- SQL Server の接続文字列を更新する(Azure 固有のオプションを削除する)
- Cosmos DB をエミュレーターのエンドポイントとキーで設定する
- Service Bus を RabbitMQ またはエミュレーターに置き換える
- Application Insights の代替を設定する
- 認証を更新する(Azure AD への依存を削除する)
- ネットワーク分離を設定する
- すべての統合をテストする
- 機能の同等性に関する不足点を記録する
- サンプルデータ用の初期化スクリプトを作成する