NestJS

NestJSマイクロサービス入門:構成例・Docker化・CI/CD完全ガイド

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

スポンサードリンク

1. NestJS マイクロサービスの基本概念と代表的構成例

NestJS は @nestjs/microservices パッケージにより、TCP・gRPC・NATS など複数のトランスポート層を統一的に扱えるフレームワークです。マイクロサービス化すると、機能単位で独立したプロセスとしてデプロイできるため、障害が特定サービスに限定されやすくなります。

1‑1. マイクロサービスとは

マイクロサービス は「単一機能を独立したサービスとして提供」する設計思想です。
各サービスは自前のデータベースと API を持ち、軽量プロトコルで相互に連携します。

  • 独立性:障害が局所化しやすく、他サービスへの波及を防げます。
  • スケーラビリティ:負荷が高いサービスだけを個別に水平拡張できます。
  • 技術選択の自由:言語・フレームワークをサービスごとに最適化できます。

1‑2. NestJS が提供する主要トランスポート

トランスポート 特徴 主な利用シーン
TCP シンプルでバイナリ通信。設定が最小限。 小規模・低遅延が求められる内部連携
gRPC Protocol Buffers による高速かつ型安全な RPC。 大規模サービス間、厳密なスキーマ管理が必要な場合
NATS Pub/Sub とキューイングを同時に提供する軽量メッセージブローカー。 イベント駆動アーキテクチャ、非同期処理全般

NestJS は Transport 列挙体でこれらを切り替えられるため、コードベースはほぼ変わりません。

1‑3. 代表的なアーキテクチャパターン

  • API Gateway パターン
    外部からの入口を統一し、認証・ルーティング・集約処理を集中管理します。NestJS の @nestjs/microservices と組み合わせると、Gateway が各マイクロサービスへリクエストを転送できます。

  • Event‑Driven パターン
    NATS や Kafka を利用し、非同期メッセージで疎結合な連携を実現します。イベントソーシングや CQRS と相性が高いです。

  • Sidecar パターン
    各サービスに監視・ログ収集用のサイドカーコンテナ(例: Prometheus exporter)を付与し、機能拡張を外部化します。


2. 推奨プロジェクトレイアウトとコード整理方法

大規模マイクロサービス群ではディレクトリ構造が保守性の鍵となります。この章では、機能別モジュール共通ライブラリ を明確に分離したレイアウト例を示します。

2‑1. 全体ディレクトリ構成

  • modules 配下に機能単位のモジュールを配置することで、@Module デコレーターだけで依存関係が把握できます。
  • common は全サービスで再利用できるユーティリティやバリデーションロジックを集約し、重複実装を防ぎます。
  • libs には外部パッケージのラップや社内共通ライブラリを置き、バージョン管理とテストが容易になります。

2‑2. モジュール別ディレクトリ詳細

users モジュールは典型的な CRUD API とマイクロサービスハンドラの両方を持つ例です。

  • controllers/ – HTTP エンドポイントや microservice メッセージハンドラを配置
  • services/ – ビジネスロジックを実装し、@Injectable() で提供
  • users.module.tsimports, providers, exports を定義し、他モジュールからの利用を許可

2‑3. 共有ライブラリ・ユーティティの配置指針

ディレクトリ 主な内容 利点
common/dto 入出力データ構造(クラスバリデーション付き) 型安全かつ自動ドキュメント生成が容易
common/pipes バリデーション・変換ロジック コントローラの記述量を削減
libs/logger Winston や Pino をラップしたロガーモジュール 各サービスで同一ログフォーマットを使用

3. Docker 化:マルチステージ Dockerfile と docker‑compose 設定

Docker による環境統一は、開発・テスト・本番の差異をなくす最も実用的な手段です。ここではビルド効率とセキュリティに配慮した構成を示します。

3‑1. マルチステージ Dockerfile(非特権ユーザー設定付き)

  • キャッシュ最適化package*.json のみを先にコピーし、依存変更が無い限り再ビルドを防止。
  • 非特権ユーザーappuser(UID 1000)で実行することで、コンテナ内の root 権限によるリスクを回避します。

3‑2. docker‑compose.yml のサービス定義

  • ネットワークnest_micro_net と名前付けし、サービス間の DNS 解決をシンプルに。
  • 環境変数管理.env.production はサーバ側でのみ保持し、コードリポジトリには含めません。
  • 起動順序とヘルスチェックdepends_oncondition: service_healthy により、依存サービスが正常になるまで待機します。

4. CI/CD パイプラインと本番デプロイのベストプラクティス

自動化されたパイプラインは手作業ミスを排除し、リリースサイクルを短縮します。ここでは GitHub Actions を用いたフローと、セキュリティ面で特に注意すべきポイントを解説します。

4‑1. GitHub Actions ワークフロー全体像

  • シークレット管理PROD_HOST, PROD_USER, SSH_PRIVATE_KEY は GitHub Secrets に格納し、平文で残さない。
  • 非特権コンテナの継承:Dockerfile で設定した USER appuser がビルド・実行時にそのまま適用されます。

4‑2. 本番環境向け追加セキュリティ対策

項目 推奨設定例
実行ユーザー Dockerfile の USER appuser(UID 1000)
イメージスキャン Trivy / Snyk を CI に組み込み、Critical/High はビルド失敗させる
シークレット保管 .env.production はサーバ側にのみ配置し、リポジトリには絶対に含めない
ネットワーク分離 bridge ネットワーク上で内部サービスは名前解決だけで通信。外部公開は必要なポート(例: 80, 443)のみ開放
リソース制限 docker-compose.yml の各サービスに cpu_shares, mem_limit を設定し、DoS 攻撃時の影響を抑える

5. 運用・トラブルシューティングと次のアクション

本番運用では 可観測性迅速な復旧手順 が成功の鍵です。以下に実装例と、よくある障害への対処法をまとめます。

5‑1. ヘルスチェック・ロギング・メトリクスの統合

  • Loggerapp.useLogger(new Logger('NestApp')) により、ログレベルとタグを統一。
  • Prometheus Exporter@willsoto/nestjs-prometheus をインストールし、/metrics エンドポイントでメトリクスを公開。Grafana ダッシュボードは公式テンプレートからカスタマイズ可能です。

5‑2. よくあるエラーと対処法(Q&A)

問題 主な原因 推奨解決策
ポート競合 ローカルで 3000 が既に使用中 docker-compose.ymlports"4000:3000" などに変更し、.env.production に変数化
依存サービスの起動順序エラー api-gateway が DB/Orders 起動前にリクエスト送信 depends_onhealthcheck を併用し、サービスが healthy になるまで待機
Docker ビルド失敗(キャッシュ破損) 古いレイヤーが残り node_modules が不整合 CI ランナーで docker builder prune --all 実行後、再ビルド
メモリ不足による OOM キラー発動 本番イメージに不要な devDependencies が含まれる マルチステージビルドで --omit=dev を使用し、本番イメージを軽量化

5‑3. 次のアクションプラン

  1. モニタリング基盤の構築
  2. Prometheus + Grafana のスタックを別サービスとしてデプロイ。
  3. 障害シナリオの演習
  4. docker compose down やネットワーク切断を意図的に実行し、復旧手順をドキュメント化。
  5. CI に自動ロールバック機構追加
  6. デプロイ失敗時は前バージョンのタグ (latest-stable) に即座にロールバックするスクリプトを組み込む。

まとめ

  • NestJS はマルチトランスポート対応が標準装備 のため、要件に合わせて TCP・gRPC・NATS を柔軟に選択できる。
  • 機能別モジュールと共通ライブラリを分離したディレクトリ構成 が保守性を大幅に向上させる。
  • マルチステージ Dockerfile と非特権ユーザー設定 により、イメージは軽量かつ安全になる。
  • GitHub Actions + Trivy の CI/CD パイプライン は自動ビルド・テスト・脆弱性チェック・デプロイを一元化し、人的ミスを最小化する。
  • ヘルスチェック・ロギング・Prometheus による可観測性 が整備されていれば、障害検知と復旧が迅速に行える。

このガイドを参考に、自社プロジェクトのマイクロサービス化を段階的に進めてください。質問や実装上の課題があれば、コメントで遠慮なくお問い合わせください。

スポンサードリンク

-NestJS