Skip to content

課題13: ヘルスケアアプリのマイクロサービス化

難易度: 🟡 中級


1. 分類情報

項目内容
難易度初級〜中級
カテゴリマイクロサービス・API
処理タイプ非同期
使用IaCTerraform
想定所要時間6-7時間

2. シナリオ

企業プロフィール

〇〇株式会社は、健康管理アプリを提供するヘルスケアスタートアップです。ユーザー数は20万人を超え、日々の活動量、食事記録、睡眠データを管理するサービスを展開しています。

現状の課題

サービス開始から3年が経過し、モノリシックなアーキテクチャの限界に直面しています:

  1. デプロイの複雑化:全機能が1つのアプリケーションに集約され、小さな変更でも全体のデプロイが必要
  2. スケーリングの非効率:特定機能(活動量記録)に負荷が集中しても、全体をスケール
  3. 技術的負債の蓄積:PHP製のモノリスに新機能追加が困難
  4. チーム間の競合:5チームが1つのコードベースを共有し、マージコンフリクトが多発

数値で見る問題

  • デプロイ頻度:月 2回(リスクが高く慎重になる)
  • デプロイ所要時間:4時間
  • インシデント発生率:デプロイごとに 30%
  • 機能追加のリードタイム:3ヶ月

成功指標(KPI)

指標現状目標
デプロイ頻度2回/月週1回以上/サービス
デプロイ時間4時間30分/サービス
インシデント発生率30%/デプロイ5%以下
機能追加リードタイム3ヶ月2週間

3. 達成目標

主要な学習成果

  1. モノリスからマイクロサービスへの段階的移行手法
  2. ECS Fargateによるコンテナ基盤の構築
  3. ALBを使ったパスベースルーティング
  4. サービス間通信パターンの理解

習得するスキル

  • Strangler Fig パターンによる移行
  • Docker マルチステージビルド
  • ECS サービスディスカバリ
  • ALB ターゲットグループの管理

4. 学習するAWSサービス

メインサービス

サービス用途重要度
ECS Fargateマイクロサービス実行
ALBルーティング・ロードバランシング
RDS (Aurora)データベース
ElastiCache (Redis)キャッシュ・セッション

補助サービス

サービス用途
ECRコンテナイメージ保存
Cloud Mapサービスディスカバリ
Secrets Manager認証情報管理
CloudWatchログ・メトリクス
X-Ray分散トレーシング

5. 最終構成図

現状(モノリス)

目標(マイクロサービス)

移行計画(5フェーズ)

フェーズ内容期間目安
1インフラ基盤構築(VPC、ECS、ALB)-
2User Service 抽出・移行-
3Activity Service 抽出・移行-
4Meal / Sleep Service 移行-
5モノリス廃止・最終検証-

6. 前提条件

必要な知識

  • コンテナとDockerの基本
  • REST API設計の基礎
  • データベース設計の基礎

事前準備

  1. AWSアカウント
  2. AWS CLI v2
  3. Docker Desktop
  4. Terraform CLI

7. トラブルシューティング課題

Challenge 1: サービス間通信のタイムアウト

状況: Activity Service から User Service への呼び出しがタイムアウト

調査ポイント:

  1. Security Group のルールを確認
  2. Service Discovery の名前解決を確認
  3. ターゲットのヘルスチェック状態を確認

Challenge 2: データ整合性の問題

状況: User Service でユーザーを削除したが、Activity Service に古いデータが残っている

調査ポイント:

  1. キャッシュの TTL を確認
  2. イベント駆動の同期を検討
  3. Saga パターンの導入を検討

Challenge 3: デプロイ順序の依存関係

状況: User Service の API 変更により、Activity Service が動作しなくなった

調査ポイント:

  1. API のバージョニング戦略を確認
  2. 後方互換性の維持
  3. Consumer-Driven Contract Testing の導入

8. 設計の考察ポイント

ディスカッション1: データ分割戦略

テーマ: 共有DBからサービス別DBへの移行

パターンメリットデメリット
Shared Databaseシンプル、トランザクション結合度が高い
Database per Service独立性高い分散トランザクション
Shared Schema移行が容易中途半端

ディスカッション2: 同期 vs 非同期通信

テーマ: サービス間通信パターンの選択

パターンユースケース
REST (同期)即座の応答が必要
gRPC (同期)高パフォーマンス要件
Event (非同期)疎結合、耐障害性重視

ディスカッション3: Strangler Fig パターン

テーマ: 段階的移行の進め方

ステップ:

  1. ファサードの導入(ALB ルーティング)
  2. 機能単位での切り出し
  3. データ移行
  4. 旧機能の廃止

9. 発展課題

Advanced 1: サービスメッシュの導入

課題: AWS App Mesh を導入し、サービス間通信の可観測性とトラフィック制御を向上

Advanced 2: イベント駆動アーキテクチャ

課題: Amazon EventBridge を使って、サービス間をイベント駆動で疎結合に

Advanced 3: CQRS パターン

課題: 読み取りと書き込みを分離し、読み取り専用のビューを作成


10. 想定コストと削減方法

月額コスト概算

サービス構成月額コスト
ECS Fargate0.5vCPU / 1GB × 10タスク$180
ALB1$16
Aurora Serverless v24 ACU$345
ElastiCachecache.t3.small$24
NAT Gateway1$32
ECR10GB$1
CloudWatchログ・メトリクス$20

合計: 約 $618/月(約93,000円)


11. 学習のポイント

重要な概念の整理

  1. Strangler Fig パターン

    • 段階的にモノリスを置き換え
    • リスクを最小化しながら移行
    • ファサード(ALB)でルーティング制御
  2. サービス境界の設計

    • ドメイン駆動設計(DDD)の境界付けられたコンテキスト
    • データの所有権を明確に
    • API契約の重要性
  3. 分散システムの課題

    • ネットワーク障害への対応
    • 結果整合性の受け入れ
    • 分散トランザクションの回避

GCPとの比較

概念AWSGCP
コンテナ実行ECS FargateCloud Run
ロードバランサーALBCloud Load Balancing
サービスディスカバリCloud MapService Directory
マネージドDBAuroraCloud SQL / AlloyDB
キャッシュElastiCacheMemorystore

次のステップ

  1. 残りのサービス(Meal, Sleep)の移行
  2. CI/CD パイプラインの構築
  3. 可観測性の強化(X-Ray, CloudWatch)