NestJS

NestJSマイクロサービス入門:セットアップとベストプラクティス

ⓘ本ページはプロモーションが含まれています

スポンサードリンク

NestJS マイクロサービスの概要とセットアップ

NestJS は HTTP、WebSocket、マイクロサービスという 3 種類のトランスポート層を統一的に扱えるフレームワークです。@nestjs/microservices パッケージを導入すれば、gRPC・Kafka・NATS といった業界標準プロトコルでの通信が数行の設定だけで実現できます【1】。本節では、パッケージのインストール手順と最小構成アプリへの組み込み方を解説します。

パッケージのインストール

@nestjs/microservices と依存ライブラリをプロジェクトに追加します。

基本的なブートストラップコード

以下は main.ts にマイクロサービス用の設定を組み込む最小例です。gRPC 用オプションだけを書きましたが、Transport を変えるだけで Kafka や NATS へも拡張できます。

このコードだけで Nest アプリはマイクロサービスとして起動し、localhost:50051(デフォルト)で gRPC エンドポイントが公開されます【2】。


アーキテクチャ設計とサービス分割

大規模システムでは「機能ごとに独立したサービス」を意識して設計することが、信頼性・スケーラビリティ向上の鍵となります。本稿で扱う構成は API Gateway → 認証サービス → 注文サービス → 在庫サービス の 4 層モデルです【3】。各コンポーネントを単一責任の Nest アプリとしてデプロイし、Kubernetes 上で Service と Ingress によって外部アクセスを制御します。

コンポーネント概要

  • API Gateway: 外部 HTTP/gRPC エントリポイント。認証トークンの検証とルーティングだけを担当
  • Auth Service: JWT 発行・検証、ユーザー情報管理
  • Order Service: 受注処理、イベント発行(Kafka/NATS)
  • Inventory Service: 在庫確保・減算、在庫更新通知

これらはすべて DNS ベースのサービスディスカバリで相互参照できるようにします。Consul と Kubernetes の連携により、Pod が再スケジュールされても名前解決が自動的に追従します【4】。

Kubernetes Service 定義(例)

上記の order-service は同一名前空間内の他サービスから http://order-service:50051 のように呼び出せます。


通信方式の実装例

マイクロサービス間の通信は 同期 (gRPC)非同期 (Kafka/NATS) の二本柱で設計します。ここではそれぞれの実装手順とベストプラクティスを示します。

gRPC 実装

proto 定義 (order.proto)

サーバ側実装 (order.service.ts)

クライアント側呼び出し (order.client.ts)

mTLS(相互 TLS)設定

  1. 証明書の用意
    bash
    # CA の作成
    openssl genrsa -out ca.key 4096
    openssl req -x509 -new -nodes -key ca.key -sha256 -days 3650 -out ca.crt

# サーバ証明書
openssl genrsa -out server.key 4096
openssl req -new -key server.key -out server.csr
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 3650 -sha256

# クライアント証明書は同様に作成

2. **Nest 側のオプション**(
@grpc/grpc-jsServerCredentials.createSsl
を使用)

この設定により、クライアントが有効な証明書を提示しない限り接続が拒否されます。相互認証で内部通信の安全性が格段に向上します【5】。

Kafka/NATS を用いたイベント駆動

Kafka モジュール (kafka.module.ts)

発行側(注文サービス)

購読側(在庫サービス)

Kafka/NATS のメッセージは Protobuf でシリアライズするとサイズが小さく、serializer: new ProtobufSerializer()ClientsModule.register に付与すれば自動的に変換できます。


デプロイと運用基盤

ローカル環境の素早い立ち上げと本番 Kubernetes へのデプロイを両方サポートするため、Docker ComposeHelm Chart の二段階アプローチを採ります。

Docker Compose(ローカル開発向け)

以下はすべてのサービスとミドルウェアを網羅した docker-compose.yml です。depends_on を全サービスに記述し、起動順序が明確になるようにしています。

docker compose up -d だけで、API Gateway → 各マイクロサービス → Kafka/Zookeeper → Consul が起動し、ローカルでも本番に近い環境を再現できます。

Helm Chart(本番 Kubernetes)

ディレクトリ構成例

共通 values.yaml の抜粋

Consul と Kubernetes の連携手順

  1. Consul Helm Chart をインストール(公式チャート)
    bash
    helm repo add hashicorp https://helm.releases.hashicorp.com
    helm install consul hashicorp/consul \
    --set server.replicaCount=3 \
    --set client.enabled=true
  2. 各マイクロサービスの Deployment に CONSUL_HTTP_ADDR 環境変数を注入
    yaml
    env:

    • name: CONSUL_HTTP_ADDR
      value: "consul-server.consul.svc.cluster.local:8500"
  3. 起動時に Service Registration API を呼び出す Init コンテナ(例)

  1. Kubernetes の Service 名と Consul の DNS 名前空間を統一
  2. Consul が提供する *.service.consul ドメインで名前解決できるよう、Pod に dnsPolicy: "ClusterFirstWithHostNet" を設定。

この手順により、Pod の再スケジュールや水平スケーリングが起きても Consul のカタログが自動的に更新され、他サービスは DNS 名だけで最新エンドポイントを取得できます。


信頼性・テスト・モニタリング

マイクロサービスの運用では「障害検知」「リトライ」「回復」の三本柱が重要です。NestJS は公式パッケージ @nestjs/terminus と外部ライブラリ opossum を組み合わせることで、ヘルスチェックとサーキットブレーカーを簡単に実装できます。

ヘルスチェック(Terminus)

サーキットブレーカー(opossum)

ユニットテストと E2E テスト

Nest の TestingModule と Jest を組み合わせれば、DI コンテナをそのままモックできるため高速なテストが可能です。

可観測性:Metrics と Logging

Prometheus メトリクス(order.service.ts)

Grafana ダッシュボード例

パネル メトリクス
Panel 1 order_created_total の時間推移
Panel 2 gRPC latency(Histogram)
Panel 3 Kafka consumer lag (kafka_consumer_lag)

Winston + Elastic Stack

構造化ログとメトリクスを同時に取得すれば、Grafana のアラートから Elastic の検索まで一貫した障害対応フローが実現します。


セキュリティベストプラクティス

mTLS と JWT の二層防御

  • mTLS: ネットワークレベルで相互認証を行い、通信路の盗聴・改ざんを防止
  • JWT: アプリケーションレイヤーでユーザー単位の権限チェックを実装

JWT ガード例

コントローラに @UseGuards(JwtAuthGuard) を付与すれば、認証済みリクエストのみが処理されます。

機密情報の管理

  • ローカル開発: .envdotenv パッケージで環境変数をロード
  • 本番環境: Kubernetes Secret に格納し、Pod の envFrom で注入

コード側では process.env.JWT_SECRET を直接参照し、リポジトリに平文が残らないよう徹底します。


次のステップ

  1. ローカルで動作確認
    bash
    docker compose up -d
    # すべてのサービスが起動したら curl http://localhost:8080/health を実行
  2. GitHub リポジトリへクローン(サンプルコード一式を公開)
  3. Helm Chart を本番クラスターにデプロイ
    bash
    helm upgrade --install prod ./helm -f values-prod.yaml
  4. Prometheus/Grafana でメトリクス確認、Alertmanager による通知設定

以上の手順を踏めば、NestJS を核にしたマイクロサービス基盤が実務レベルで利用可能になります。継続的インテグレーション・デリバリー(CI/CD)と組み合わせて、コード変更から本番デプロイまで自動化することを推奨します。


参考文献

番号 出典
【1】 NestJS公式マイクロサービスガイド – https://docs.nestjs.com/microservices/basics
【2】 MicroserviceOptions の型定義と使用例 – https://docs.nestjs.com/microservices/grpc
【3】 マイクロサービスアーキテクチャのベストプラクティス(Martin Fowler) – https://martinfowler.com/articles/microservices.html
【4】 Consul と Kubernetes の統合手順 – https://www.consul.io/docs/k8s/installation
【5】 NestJS での gRPC + mTLS 実装例 – https://docs.nestjs.com/microservices/grpc#secure-grpc-connection

スポンサードリンク

-NestJS