第09章 デプロイ
NestJS アプリは Node.js ベースなので、さまざまな環境へ柔軟にデプロイ可能です。 主な手法は以下の4つ:
- Docker
- Kubernetes
- Serverless(AWS Lambda など)
- クラウドプロバイダ(Heroku / AWS ECS / GCP / Azure など)
9.1 Docker デプロイ
NestJS はコンテナ化が容易。
Dockerfile 例
# ベースイメージ
FROM node:20-alpine
# 作業ディレクトリ
WORKDIR /app
# 依存関係をインストール
COPY package*.json ./
RUN npm install --production
# アプリコードコピー
COPY . .
# ビルド
RUN npm run build
# ポート公開
EXPOSE 3000
# 起動コマンド
CMD ["node", "dist/main.js"]
実行
docker build -t nest-app .
docker run -p 3000:3000 nest-app
9.2 Kubernetes デプロイ
大規模環境では Kubernetes を利用。
Deployment マニフェスト例
apiVersion: apps/v1
kind: Deployment
metadata:
name: nest-app
spec:
replicas: 3
selector:
matchLabels:
app: nest-app
template:
metadata:
labels:
app: nest-app
spec:
containers:
- name: nest-app
image: nest-app:latest
ports:
- containerPort: 3000
Service マニフェスト例
apiVersion: v1
kind: Service
metadata:
name: nest-service
spec:
type: LoadBalancer
selector:
app: nest-app
ports:
- protocol: TCP
port: 80
targetPort: 3000
9.3 Serverless デプロイ
NestJS は AWS Lambda / Google Cloud Functions / Azure Functions などに対応可能。
AWS Lambda デプロイ例
- 依存関係インストール
npm install @nestjs/cli serverless serverless-http
- ハンドラー作成
import { Handler } from 'aws-lambda';
import { Server } from 'http';
import { createApp } from './main';
import * as serverless from 'serverless-http';
let server: Server;
export const handler: Handler = async (event, context) => {
if (!server) {
const app = await createApp();
await app.init();
server = app.getHttpAdapter().getInstance();
}
return serverless(server)(event, context);
};
- serverless.yml 設定
service: nest-app
provider:
name: aws
runtime: nodejs20.x
functions:
main:
handler: dist/lambda.handler
events:
- http:
path: /
method: any
9.4 クラウドプロバイダ
- Heroku → 簡単にデプロイ可能(ただし有料化後は利用減)
- AWS ECS / Fargate → Docker ベースで本番運用に最適
- GCP Cloud Run → Docker イメージをサーバレス実行
- Azure App Service → Node.js アプリを簡単にホスティング
9.5 ベストプラクティス
- 環境変数 で設定を管理(ConfigModule と併用)
- マルチステージビルド を使って Docker イメージを軽量化
- 本番環境では プロセスマネージャ(PM2, systemd) を利用して安定稼働
- ログ・監視は クラウドのモニタリングサービス(CloudWatch, Stackdriver, Application Insights 等) と連携
9.6 まとめ
- Docker → 最も基本的なデプロイ方法
- Kubernetes → 大規模・高可用性に対応
- Serverless → コスト効率重視の軽量デプロイ
- クラウドサービス → AWS / GCP / Azure でマネージド運用可能