はじめに
本記事はポートフォリオアプリ「DevJourney」開発の過程をまとめた連載の第4回です。
今回は、第3回で選定した技術スタックを具体的にどう組み合わせたのか、システムの「骨組み」となるインフラアーキテクチャとデータベース設計について解説します。
システムアーキテクチャ図
本アプリのインフラは、AWS上に「堅牢性」と「拡張性」を意識した構成で構築しました。
設計のポイント
1. 高可用性の確保(Multi-AZ): 図の通り、2つのアベイラビリティゾーン(AZ)を利用した構成です。ALB(Application Load Balancer)から各AZのECS Fargateへトラフィックを分散させ、万が一の障害時にもサービスが継続できる設計にしました。
2. ネットワーク分離によるセキュリティ: パブリックサブネットにはALBのみを配置。API本体(ECS)やデータベース(RDS)はプライベートサブネットに配置し、外部からの直接攻撃を防ぐ多層防御を採用しています。
3. CI/CDの統合: 図の下部にある通り、CodePipeline、S3、CodeBuildを組み合わせ、GitHubへのプッシュをトリガーとした自動デプロイフローを構築しています。
4. フロントエンドのデプロイ・運用 (AWS Amplify): フロントエンド(Next.js)の配信にはAWS Amplifyを採用しました。以下の2点にメリットがあります。
- フルマネージドなCI/CD:
- GitHubのリポジトリと連携するだけで、プッシュ時にビルドからデプロイまでのパイプラインが自動で実行されます。これにより、フロントエンドのインフラ管理コストを大幅に削減しつつ、高速な開発サイクルを実現しました。
- SSR/SSG対応:
- Next.jsのサーバーサイドレンダリング機能をネイティブにサポートしており、パフォーマンスとSEOを両立した配信が可能です。
■インフラ構成図
データベース設計 (ER図)
「学習ロードマップの可視化」を実現するため、ユーザーの進捗状況やスキル体系を厳密に管理できるデータモデルを構築しました。
設計のポイント
1. ユーザー成長の可視化: ユーザーマスタを中心に、スキル取得状況やクエスト進捗状況を紐付けることで、経験値やレベル、取得スキルを一元管理できる構造にしています。
2. 柔軟なクエスト構造: ノードマスタやクエストマスタといった階層構造を持たせることで、複雑なロードマップを表現可能にしています。
3. JSONB型の戦略的活用: 「学習目標」「達成条件」「チェックリスト」などは、将来的な項目追加やフロントエンドでの表示形式の変更に対応しやすくするため、ノードマスタテーブル内にJSONB型として格納しています。
■ER図
インフラの実装方針(AWS CDK)
1. 環境変数の型安全な管理: CDK内で定義した「DBの接続先」や「CognitoのクライアントID」などのリソース情報を、ECSの環境変数設定としてコード上で直接参照できるため、手動設定によるタイポや設定漏れを防いでいます。
2. Amplifyとの役割分担: VPCやDBなどの基盤インフラはCDKで厳密に管理しつつ、フロントエンドのデプロイフローに関してはAmplifyのマネージドな機能を活用することで、「自由度」と「運用の手軽さ」を両立させています。
セキュリティ・スケーラビリティへの配慮
実務レベルのポートフォリオとして、以下の観点を盛り込んでいます。
1. 最小権限のIAMロール: 各リソース間の権限は必要最小限に絞り、セキュリティリスクを低減。
2. Secrets Managerによる秘匿情報管理: DB接続情報などはAWSのマネージドサービスで安全に管理。
3. サーバーレスによる運用負担軽減: FargateとAmplifyを組み合わせることで、サーバー管理から解放されたモダンな運用を実現。
まとめ
第4回では、DevJourneyの心臓部である設計面を紹介しました。 Amplifyによるフロントエンドの高速デプロイと、CDKによる堅牢なバックエンド設計を組み合わせることで、安定した開発基盤を構築できました。
次回は、いよいよ具体的な実装の中身に踏み込む「第5回:設計・実装編②(バックエンド・フロントエンド・認証)」をお届けします!

