Advanced

Claude Codeでマイクロサービスを設計・実装する方法

Claude Codeを活用してマイクロサービスアーキテクチャの設計から実装まで効率化する方法を解説。サービス分割、API設計、Docker構成の実例を紹介します。

マイクロサービス開発でClaude Codeが活きる場面

マイクロサービスアーキテクチャでは、サービス間通信、データの整合性、共通ライブラリの管理など、考慮すべき点が多くあります。Claude Codeはプロジェクト全体を俯瞰した上で、複数サービスにまたがる変更を一貫して行えます。

サービス分割の設計

> ECサイトをマイクロサービスに分割したい。
> ドメイン駆動設計の境界づけられたコンテキストを参考に、
> サービス分割案を提示して。各サービスのAPIも設計して。

Claude Codeは以下のようなサービス構成を提案します。

  • user-service: ユーザー管理・認証
  • product-service: 商品カタログ管理
  • order-service: 注文処理
  • payment-service: 決済処理
  • notification-service: 通知配信

サービス間通信の実装

REST APIによる同期通信

// order-service/src/clients/product-client.ts
import axios from 'axios';

const PRODUCT_SERVICE_URL = process.env.PRODUCT_SERVICE_URL || 'http://product-service:3001';

export class ProductClient {
  async getProduct(productId: string) {
    const { data } = await axios.get(
      `${PRODUCT_SERVICE_URL}/api/products/${productId}`,
      { timeout: 5000 }
    );
    return data;
  }

  async checkStock(productId: string, quantity: number): Promise<boolean> {
    const { data } = await axios.post(
      `${PRODUCT_SERVICE_URL}/api/products/${productId}/check-stock`,
      { quantity },
      { timeout: 5000 }
    );
    return data.available;
  }
}

イベント駆動による非同期通信

// order-service/src/events/publisher.ts
import { SNSClient, PublishCommand } from '@aws-sdk/client-sns';

const sns = new SNSClient({ region: 'ap-northeast-1' });

export async function publishOrderCreated(order: Order) {
  await sns.send(new PublishCommand({
    TopicArn: process.env.ORDER_EVENTS_TOPIC_ARN,
    Message: JSON.stringify({
      type: 'ORDER_CREATED',
      data: {
        orderId: order.id,
        userId: order.userId,
        items: order.items,
        totalAmount: order.totalAmount,
      },
      timestamp: new Date().toISOString(),
    }),
    MessageAttributes: {
      eventType: { DataType: 'String', StringValue: 'ORDER_CREATED' },
    },
  }));
}
// notification-service/src/handlers/order-handler.ts
import { SQSEvent } from 'aws-lambda';

export async function handleOrderEvent(event: SQSEvent) {
  for (const record of event.Records) {
    const message = JSON.parse(record.body);
    const orderEvent = JSON.parse(message.Message);

    if (orderEvent.type === 'ORDER_CREATED') {
      await sendOrderConfirmationEmail(orderEvent.data);
    }
  }
}

Docker Compose構成

> 全サービスをdocker-composeで起動できるようにして。
> ホットリロード対応、共有ネットワーク、ヘルスチェック付きで。
version: '3.8'

services:
  user-service:
    build: ./services/user-service
    ports: ['3001:3000']
    environment:
      - DATABASE_URL=postgresql://postgres:pass@user-db:5432/users
    depends_on:
      user-db:
        condition: service_healthy
    volumes:
      - ./services/user-service/src:/app/src
    healthcheck:
      test: ['CMD', 'curl', '-f', 'http://localhost:3000/health']
      interval: 10s
      retries: 3

  product-service:
    build: ./services/product-service
    ports: ['3002:3000']
    environment:
      - DATABASE_URL=postgresql://postgres:pass@product-db:5432/products
    depends_on:
      product-db:
        condition: service_healthy
    volumes:
      - ./services/product-service/src:/app/src

  order-service:
    build: ./services/order-service
    ports: ['3003:3000']
    environment:
      - DATABASE_URL=postgresql://postgres:pass@order-db:5432/orders
      - PRODUCT_SERVICE_URL=http://product-service:3000
      - USER_SERVICE_URL=http://user-service:3000
    depends_on:
      order-db:
        condition: service_healthy

  user-db:
    image: postgres:16-alpine
    environment:
      POSTGRES_DB: users
      POSTGRES_PASSWORD: pass
    healthcheck:
      test: ['CMD-SHELL', 'pg_isready -U postgres']
      interval: 5s
      retries: 5

  product-db:
    image: postgres:16-alpine
    environment:
      POSTGRES_DB: products
      POSTGRES_PASSWORD: pass
    healthcheck:
      test: ['CMD-SHELL', 'pg_isready -U postgres']
      interval: 5s
      retries: 5

  order-db:
    image: postgres:16-alpine
    environment:
      POSTGRES_DB: orders
      POSTGRES_PASSWORD: pass
    healthcheck:
      test: ['CMD-SHELL', 'pg_isready -U postgres']
      interval: 5s
      retries: 5

共通ライブラリの管理

> サービス間で共有する型定義とユーティリティをpackages/sharedに作成して。
> npmワークスペースで管理する構成にして。
// packages/shared/src/types/events.ts
export interface DomainEvent<T = unknown> {
  type: string;
  data: T;
  timestamp: string;
  correlationId: string;
}

export interface OrderCreatedEvent extends DomainEvent<{
  orderId: string;
  userId: string;
  items: Array<{ productId: string; quantity: number }>;
  totalAmount: number;
}> {
  type: 'ORDER_CREATED';
}

開発効率を高めるコツ

マイクロサービス開発では、CLAUDE.mdにサービス構成やAPI規約を記述しておくと効果的です。書き方の詳細はCLAUDE.mdの書き方完全ガイドで解説しています。また、コードの品質を維持するためにリファクタリングの自動化も活用しましょう。サービスごとの開発フローにフック機能を設定するのも有効です。

まとめ

Claude Codeを使えば、マイクロサービスの設計から各サービスの実装、Docker構成、CI/CDまでを効率的に構築できます。特にサービス間の型定義の共有やイベントスキーマの一貫性維持など、複数サービスにまたがる作業で威力を発揮します。

詳しくはAnthropic公式ドキュメントをご覧ください。

#Claude Code #マイクロサービス #Docker #API設計 #アーキテクチャ