研究開発

生成AI:3.システムアーキテクチャー設計書(環境構築CloudFormation)

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

システムアーキテクチャ設計書

1. 概要

本設計書は、AWS上に構築されるシステムのアーキテクチャについて説明します。このシステムは、東京リージョンのVPC内にパブリックサブネットとプライベートサブネットを持ち、RDS(PostgreSQL)、API Gateway、Cognito User Poolsを活用して、セキュアかつスケーラブルなアプリケーションを提供します。

2. アーキテクチャ概要

このアプリケーションは、以下のAWSリソースを使用して構築されます:

graph TB
    subgraph VPC
        subgraph Public Subnet
            IGW[Internet Gateway]
            ALB[Application Load Balancer]
        end
        subgraph Private Subnet 1
            RDS1[RDS - PostgreSQL]
            Lambda1[Lambda Function]
        end
        subgraph Private Subnet 2
            RDS2[RDS - PostgreSQL]
            Lambda2[Lambda Function]
        end
    end
    IGW --> ALB
    ALB --> Lambda1
    ALB --> Lambda2
    Lambda1 --> RDS1
    Lambda2 --> RDS2
    Client((Client)) --> IGW
    APIGateway[API Gateway] --> ALB
    Cognito[Cognito User Pools] --> APIGateway

このアーキテクチャの説明:

  • VPCは、パブリックサブネットとプライベートサブネットで構成されています。
  • パブリックサブネットには、インターネットゲートウェイ(IGW)とアプリケーションロードバランサー(ALB)が配置されています。
  • プライベートサブネットには、RDSインスタンス(RDS1とRDS2)が配置されています。
  • Lambda関数(Lambda1とLambda2)は、図ではプライベートサブネット内に配置されていますが、実際にはAWS Lambdaサービスによって管理されており、VPC外部で実行されます。
  • クライアントからのリクエストは、インターネットゲートウェイ(IGW)を経由してアプリケーションロードバランサー(ALB)に到達します。
  • ALBは、トラフィックをLambda関数(Lambda1とLambda2)に分散します。
  • Lambda関数は、対応するRDSインスタンス(RDS1とRDS2)と通信し、必要なデータ処理を実行します。
  • 処理結果はLambda関数からALBを経由してクライアントに返されます。
  • API Gatewayは、アプリケーション用のAPIエンドポイントを提供します。
  • Cognito User Poolsは、ユーザー認証と認可を処理し、API Gatewayへのセキュアなアクセスを提供します。

4. コンポーネント

パラメータ (parameters.json)

環境構築時に以下のパラメータを使用します:

パラメータ名 説明 デフォルト値
EnvironmentName 環境名 dev
VpcCIDR VPCのCIDRブロック 10.0.0.0/16
PublicSubnet1CIDR パブリックサブネット1のCIDRブロック 10.0.1.0/24
PrivateSubnet1CIDR プライベートサブネット1のCIDRブロック 10.0.2.0/24
PrivateSubnet2CIDR プライベートサブネット2のCIDRブロック (パラメータ)
DBMasterUsername RDSマスターユーザー名 mydbuser
DBMasterUserPassword RDSマスターパスワード mydbpassword

4.1 VPC

コンポーネント 名称 説明 設定値
VPC dev-VPC アプリケーション全体を含むバーチャルプライベートクラウド CIDR: 10.0.0.0/16
パブリックサブネット dev-Public-Subnet-1 インターネットアクセス可能なサブネット CIDR: 10.0.1.0/24, AZ: ap-northeast-1a
プライベートサブネット dev-Private-Subnet-1 インターネットアクセスができないサブネット CIDR: 10.0.2.0/24, AZ: ap-northeast-1a
プライベートサブネット dev-Private-Subnet-2 インターネットアクセスができないサブネット CIDR: (パラメータ), AZ: ap-northeast-1c
インターネットゲートウェイ dev-IGW VPCをインターネットに接続
NATゲートウェイ NatGateway1 プライベートサブネットからインターネットへのアクセスを提供

4.2 RDS (PostgreSQL)

コンポーネント 名称 説明 設定値
RDS (PostgreSQL) RDSInstance アプリケーションデータを保存 インスタンスクラス: db.t3.micro, ストレージ: 20GB, マスターユーザー名: mydbuser, マスターパスワード: mydbpassword

4.3 API Gateway

コンポーネント 名称 説明 設定値
API Gateway dev-API アプリケーション用のAPI Gateway リソース: items, orders

4.4 Cognito User Pools

コンポーネント 名称 説明 設定値
Cognito ユーザープール dev-UserPool ユーザー認証と認可を処理 ユーザープール名: dev-UserPool

5. ロール関係

コンポーネント ロール名称 ロール
VPC VPCRole アプリケーション全体のネットワーク環境を提供
パブリックサブネット PublicSubnetRole インターネットアクセス可能なリソースを配置
プライベートサブネット PrivateSubnetRole インターネットアクセスを制限し、セキュリティを強化
インターネットゲートウェイ InternetGatewayRole VPCとインターネット間の通信を可能にする
NATゲートウェイ NATGatewayRole プライベートサブネットからインターネットへのアクセスを提供
RDS (PostgreSQL) RDSInstanceRole アプリケーションデータを保存
API Gateway APIGatewayRole アプリケーション用のAPIエンドポイントを提供
Cognito ユーザープール CognitoUserPoolRole ユーザー認証と認可を処理

6. データフロー

sequenceDiagram
    Client->>API Gateway: リクエスト
    API Gateway->>Cognito User Pools: 認証と認可
    Cognito User Pools-->>API Gateway: 認証と認可の結果
    API Gateway->>Lambda: リクエストの転送
    Lambda->>RDS: データの読み書き
    RDS-->>Lambda: データの返却
    Lambda-->>API Gateway: レスポンスの返却
    API Gateway-->>Client: レスポンス

このデータフロー図は、システム内のコンポーネント間のデータの流れを示しています。クライアントからのリクエストは、API Gateway、Cognito User Pools、Lambda、RDSを経由して処理され、最終的にクライアントにレスポンスが返されます。

7. スケーラビリティと保守性

  • API Gatewayは、トラフィックに応じて自動的にスケールアップまたはスケールダウンします。
  • RDSは、必要に応じて手動でスケーリングできます。
  • Lambda関数は、トラフィックに応じて自動的にスケールアップまたはスケールダウンします。
  • 各コンポーネントは独立しており、必要に応じて個別に更新または変更できます。

8. セキュリティ

  • RDSはプライベートサブネットに配置され、インターネットから直接アクセスできません。
  • API GatewayとCognito User Poolsは、APIエンドポイントへのセキュアなアクセスを提供します。
  • Lambda関数は、VPC外部で実行されるため、VPC内のリソースへのアクセスを制限できます。

9. 結論

このアーキテクチャ設計は、スケーラビリティ、保守性、セキュリティを考慮しながら、AWS上でモダンなアプリケーションを構築するための基盤を提供します。各コンポーネントは、それぞれの役割を果たし、全体としてシームレスに連携します。Lambda関数の追加により、アプリケーションのロジックを柔軟に実装し、スケーラビリティを向上させることができます。