開発/本番一致
Twelve-Factor App の原則で、開発・ステージング・本番環境の差異を最小化する
Twelve-FactorDevOps
開発/本番一致とは
開発/本番一致 (Dev/Prod Parity) は、Twelve-Factor App の第 10 原則で、開発・ステージング・本番環境の差異を最小化し、「開発環境では動くが本番では動かない」問題を防ぐ。
3 つのギャップ
| ギャップ | 従来 | Twelve-Factor |
|---|---|---|
| 時間 | 開発からデプロイまで数週間 | 数時間〜数日 |
| 人 | 開発者が書き、運用者がデプロイ | 開発者がデプロイ |
| ツール | 開発は SQLite、本番は PostgreSQL | 同じツールを使う |
環境差異の例
❌ 開発と本番で異なるサービス:
開発: SQLite, ローカルファイル, メール出力
本番: PostgreSQL, S3, SES
✅ 同じサービスを使う:
開発: PostgreSQL (Docker), S3 (LocalStack), SES (MailHog)
本番: PostgreSQL (RDS), S3, SES
Docker Compose で本番に近い開発環境
services:
app:
build: .
environment:
DATABASE_URL: postgresql://admin:secret@db:5432/myapp
AWS_ENDPOINT: http://localstack:4566
db:
image: postgres:16
localstack:
image: localstack/localstack
environment:
SERVICES: s3,dynamodb,sqs
SAM Local
# Lambda をローカルで実行 (本番と同じランタイム)
sam local invoke MyFunction --event event.json
# API Gateway をローカルで起動
sam local start-api
環境変数で差異を吸収
// 環境変数で接続先を切り替え (コードは同一)
const endpoint = process.env.DYNAMODB_ENDPOINT; // ローカル: http://localhost:8000
const client = new DynamoDBClient(endpoint ? { endpoint } : {});
環境ごとの設定
| 設定 | dev | prod |
|---|---|---|
| ログレベル | DEBUG | WARN |
| キャッシュ | 無効 | 有効 |
| DynamoDB | オンデマンド | オンデマンド |
| CloudFront キャッシュ | 無効 | 有効 |
コードは同一、設定のみ環境変数で切り替える。
開発/本番一致の関連書籍も参考になる。