生成AI:1.在庫管理システム基本設計書

Note)本設計書及びプログラムの最新版はGitHubのRayoo-Nakano/InventoryAllocationに常時更新しています。

在庫管理システム基本設計書

1. 概要

本設計書は、在庫管理システムの基本設計について説明する。システムはFastAPIを用いて実装され、注文の作成、在庫の管理、在庫の割り当てなどの機能を提供する。UIにはReactを採用し、API Gatewayを介して認証を行う。バックエンドの処理にはAWS Lambdaを使用し、スケーラビリティと柔軟性を確保する。

2. 前提条件

  • システムはクラウド環境(AWS)で運用される
  • 認証にはAmazon CognitoとAPI Gatewayを使用する
  • データベースにはAmazon RDSを使用し、Private Subnetに配置する
  • 注文と在庫の情報は、外部システムとのAPI連携により取得される
  • 在庫割り当ては、先入先出法(FIFO)に基づいて行われる
  • 在庫の補充は、外部システムからの入荷情報に基づいて行われる
  • インフラストラクチャのプロビジョニングにはIaCを採用し、AWS CloudFormationを使用してコード化する
  • システムの開発にはCI/CDパイプラインを構築し、自動化されたビルド、テスト、デプロイメントを行うことで生産性を向上させる

3. システム構成

  • React: UIの構築に使用するJavaScriptライブラリ
  • FastAPI: Pythonの高速なWebフレームワーク
  • AWS Lambda: サーバーレスコンピューティングサービス
  • SQLAlchemy: PythonのORMライブラリ
  • JWT: 認証にはJSON Web Tokenを使用
  • Amazon Cognito: 認証プロバイダ
  • Amazon API Gateway: APIの管理とセキュリティの提供
  • Amazon RDS: リレーショナルデータベースサービス
  • AWS CloudFormation: インフラストラクチャのコード化とプロビジョニング
  • AWS CodePipeline: CI/CDパイプラインの構築

3.1 システムアーキテクチャ

graph LR
    A[Client] --> B[React]
    B --> C[API Gateway]
    C --> D[Lambda]
    D --> E[FastAPI]
    E --> F[SQLAlchemy]
    F --> G[Amazon RDS]
    C --> H[Amazon Cognito]
    I[AWS CloudFormation] --> J[Infrastructure]
    K[AWS CodePipeline] --> L[Build/Test/Deployment]

このシステムアーキテクチャ図は、在庫管理システムの主要なコンポーネントとその関係を示しています。クライアントはReactを使用してUIを構築し、API GatewayとAmazon Cognitoを介してLambdaにアクセスします。LambdaはFastAPIを呼び出し、FastAPIはSQLAlchemyを使用してAmazon RDSとやり取りします。AWS CloudFormationを使用してインフラストラクチャをコード化し、AWS CodePipelineを使用してCI/CDパイプラインを構築します。

3.2 VPC構成

graph LR
    Client[Client] --> WAF[WAF]
    WAF --> Cognito[Cognito]
    Cognito --> APIGateway[API Gateway]
    subgraph VPC
        subgraph Public Subnet
            APIGateway
            NATGateway[NAT Gateway]
        end
        subgraph Private Subnet
            RDS[RDS Instance]
            Lambda[Lambda]
        end
        subgraph Endpoint Subnet
            VPCe[VPC Endpoint]
        end
        Lambda --> VPCe
        VPCe --> S3[S3 Bucket]
        Lambda --> RDS
        Lambda ---> NATGateway
    end
    APIGateway --> Lambda

在庫管理システムは、以下のVPC構成を採用します。

  • VPC外:
    • クライアント、WAF、およびCognitoを配置し、インターネットからアクセス可能な層を形成する
  • Public Subnet:
    • API GatewayとNAT Gatewayを配置する
  • Private Subnet:
    • Lambdaをデプロイし、NAT Gateway経由でインターネットにアクセスする
    • RDSインスタンスを配置し、データベースを保護する
  • Endpoint Subnet:
    • VPC EndpointとしてS3エンドポイントを配置し、LambdaがS3バケットにアクセスできるようにする

注)Lambdaは直接Privateサブネットにデプロイすることはできません。ただし、VPC内のPrivateサブネットにLambda関数をデプロイし、NAT Gateway経由でインターネットにアクセスすることで、実質的にPrivateサブネットで動作させることが可能です。

4. 機能一覧

機能説明
注文の作成外部システムから受け取った注文情報を登録する
在庫の管理外部システムから受け取った入荷情報に基づいて在庫を更新する
在庫の割り当て注文に対して、指定された引当方法に基づいて在庫を割り当てる
割り当て結果の取得在庫割り当ての結果を取得する
在庫引当方法の選択以下の6種類の在庫引当方法から選択する
- 先入先出法(FIFO)最も古い在庫から順に割り当てる
- 後入先出法(LIFO)最も新しい在庫から順に割り当てる
- 単価の安い在庫から引当単価の安い在庫から優先的に割り当てる
- 単価の高い在庫から引当単価の高い在庫から優先的に割り当てる
- 賞味期限の近い在庫から引当賞味期限が近い在庫から優先的に割り当てる
- ロケーション優先引当指定されたロケーションの在庫から優先的に割り当てる

5. データベース設計

5.1 ERD

erDiagram
    Order ||--o{ AllocationResult : has
    Inventory ||--o{ AllocationResult : has

    Order {
        int id PK
        string item_code
        int quantity
        bool allocated
    }

    Inventory {
        int id PK
        string item_code
        int quantity
        date receipt_date
        float unit_price
        date expiration_date
        string location
        datetime created_at
    }

    AllocationResult {
        int id PK
        int order_id FK
        string item_code
        int allocated_quantity
        float allocated_price
        date allocation_date
    }

5.2 テーブル定義

Orderテーブル

カラム名データ型説明
idint注文ID(プライマリキー)
item_codestring商品コード
quantityint数量
allocatedbool割当済みフラグ

Inventoryテーブル

カラム名データ型説明
idint在庫ID(プライマリキー)
item_codestring商品コード
quantityint数量
receipt_datedate入荷日
unit_pricefloat単価
expiration_datedate賞味期限
locationstringロケーション
created_atdatetime作成日時

AllocationResultテーブル

カラム名データ型説明
idint割当結果ID(プライマリキー)
order_idint注文ID(外部キー)
item_codestring商品コード
allocated_quantityint割当数量
allocated_pricefloat割当価格
allocation_datedate割当日

6. API設計

6.1 エンドポイント一覧

エンドポイントメソッド説明
/ordersPOST注文の作成
/ordersGET注文の取得
/inventoriesPOST在庫の作成
/inventoriesGET在庫の取得
/orders/{order_id}/allocatePOST在庫の割り当て
/allocation-resultsGET割り当て結果の取得

6.2 リクエスト/レスポンス例

注文の作成

  • リクエスト
    {
    "item_code": "ABC123",
    "quantity": 10
    }
  • レスポンス
    {
    "order_id": 1,
    "item_code": "ABC123",
    "quantity": 10,
    "allocated": false
    }

在庫の作成

  • リクエスト
    {
    "item_code": "ABC123",
    "quantity": 100,
    "receipt_date": "2023-06-01",
    "unit_price": 9.99
    }
  • レスポンス
    {
    "id": 1,
    "item_code": "ABC123",
    "quantity": 100,
    "receipt_date": "2023-06-01",
    "unit_price": 9.99,
    "created_at": "2023-06-01T10:00:00Z"
    }

在庫の割り当て

  • リクエスト
    {
    "order_id": 1,
    "item_code": "ABC123",
    "quantity": 5,
    "allocation_date": "2023-06-02"
    }
  • レスポンス
    {
    "id": 1,
    "order_id": 1,
    "item_code": "ABC123",
    "allocated_quantity": 5,
    "allocated_price": 49.95,
    "allocation_date": "2023-06-02"
    }

6.3 シーケンス図

注文の作成

sequenceDiagram
    participant Client
    participant React
    participant API Gateway
    participant Lambda
    participant FastAPI
    participant SQLAlchemy
    participant Database

    Client->>React: Create order
    React->>API Gateway: POST /orders
    API Gateway->>Lambda: Forward request
    Lambda->>FastAPI: Forward request
    FastAPI->>SQLAlchemy: Create order
    SQLAlchemy->>Database: Insert order
    Database-->>SQLAlchemy: Order inserted
    SQLAlchemy-->>FastAPI: Order created
    FastAPI-->>Lambda: Order response
    Lambda-->>API Gateway: Order response
    API Gateway-->>React: Order response
    React-->>Client: Display order

在庫の割り当て

sequenceDiagram
    participant Client
    participant React
    participant API Gateway
    participant Lambda
    participant FastAPI
    participant SQLAlchemy
    participant Database

    Client->>React: Allocate inventory
    React->>API Gateway: POST /orders/{order_id}/allocate
    API Gateway->>Lambda: Forward request
    Lambda->>FastAPI: Forward request
    FastAPI->>SQLAlchemy: Allocate inventory
    SQLAlchemy->>Database: Query inventory
    Database-->>SQLAlchemy: Inventory data
    SQLAlchemy->>SQLAlchemy: Apply allocation method
    SQLAlchemy->>Database: Update inventory
    Database-->>SQLAlchemy: Inventory updated
    SQLAlchemy->>Database: Create allocation result
    Database-->>SQLAlchemy: Allocation result created
    SQLAlchemy-->>FastAPI: Allocation result
    FastAPI-->>Lambda: Allocation result response
    Lambda-->>API Gateway: Allocation result response
    API Gateway-->>React: Allocation result response
    React-->>Client: Display allocation result

割り当て結果の取得

sequenceDiagram
    participant Client
    participant React
    participant API Gateway
    participant Lambda
    participant FastAPI
    participant SQLAlchemy
    participant Database

    Client->>React: Get allocation results
    React->>API Gateway: GET /allocation-results
    API Gateway->>Lambda: Forward request
    Lambda->>FastAPI: Forward request
    FastAPI->>SQLAlchemy: Get allocation results
    SQLAlchemy->>Database: Query allocation results
    Database-->>SQLAlchemy: Allocation results data
    SQLAlchemy-->>FastAPI: Allocation results
    FastAPI-->>Lambda: Allocation results response
    Lambda-->>API Gateway: Allocation results response
    API Gateway-->>React: Allocation results response
    React-->>Client: Display allocation results

以上が、在庫管理システムの基本設計書のAPI設計セクションに含まれるシーケンス図です。これらのシーケンス図は、注文の作成、在庫の割り当て、および割り当て結果の取得の各プロセスにおけるコンポーネント間の相互作用を示しています。

7. 非機能要件

7.1 セキュリティ

  • 認証にはAmazon CognitoとAPI Gatewayを使用し、JWTトークンによるアクセス制御を行う
  • VPCを使用し、APIサーバーをPublic Subnet、データベースをPrivate Subnetに配置することで、セキュリティを向上させる

7.2 パフォーマンス

  • FastAPIを使用することで、高速なレスポンスを実現する
  • システムは、1日あたり1,000件以上の注文を処理できる必要がある
  • システムは、99.9%以上の可用性を維持する必要がある
  • システムは、ピーク時でも3秒以内にレスポンスを返す必要がある

7.3 拡張性

  • SQLAlchemyを使用することで、データベースの変更に柔軟に対応できる
  • AWS Lambdaを使用することで、スケーラビリティと柔軟性を確保する

7.4 ログ出力

  • 開発・運用の目的で、システムの動作状況や例外情報をログに出力する
  • ログレベルを適切に設定し、必要な情報を出力する
  • ログ出力先はファイルまたはログ管理システムとする

7.5 自動化

  • インフラストラクチャのプロビジョニングにはAWS CloudFormationを使用し、コード化することで環境の再現性を確保する
  • CI/CDパイプラインを構築し、自動化されたビルド、テスト、デプロイメントを行うことで、開発の効率化と品質の向上を図る

7.6 データ保護

  • システムは、個人情報を含む機密データを安全に保護する必要がある

7.7 監査証跡

  • システムは、監査証跡を提供し、トレーサビリティを確保する必要がある

8. 今後の課題

  • 在庫割り当ての最適化
  • 在庫の自動補充機能の実装
  • 注文のキャンセル機能の追加
  • 外部システムとのAPI連携の拡張
  • モニタリングとアラート機能の追加
  • UIのユーザビリティの向上
  • モバイルアプリの開発
  • 国際化対応
  • パフォーマンスチューニング
  • セキュリティ監査の実施
  • 在庫補充プロセスの自動化
  • 在庫最適化アルゴリズムの導入
  • 異常検知とアラート機能の実装
  • パフォーマンスとスケーラビリティのテストと最適化

9. 参考資料

10. 変更履歴

バージョン日付変更内容
1.02023-06-01初版作成
1.12023-06-02UIにReactを採用、API Gatewayによる認証を追加
1.22023-06-02VPC構成を追加、RDSをPrivate Subnetに配置
1.32023-06-03非機能要件を更新、今後の課題を追加

以上が、在庫管理システムの基本設計書の最新版です。非機能要件を更新し、セキュリティ、パフォーマンス、拡張性、ログ出力、自動化、データ保護、監査証跡の各項目を詳細化しました。また、今後の課題に新たな項目を追加し、システムの継続的な改善と拡張に向けた計画を示しました。

今後は、この設計書に基づいてシステムの実装を進めていきます。実装の過程で新たな課題や改善点が見つかった場合は、適宜設計書をアップデートしていきます。