Skip to content

課題33: 広告テック企業のマイクロサービスCI/CD

難易度: 🟡 中級


分類情報

項目内容
難易度中級
カテゴリIaC・DevOps
処理タイプ非同期
使用IaCTerraform
想定所要時間6-7時間

シナリオ

企業プロフィール

〇〇株式会社は、プログラマティック広告配信プラットフォームを提供するアドテック企業です。10個のマイクロサービスで構成されるシステムを運用しており、毎秒数万リクエストを処理しています。

現状の課題

マイクロサービス化は完了したものの、デプロイとテストの運用が追いついていません:

  1. デプロイの複雑化:10サービスの依存関係管理が困難
  2. 統合テストの不足:サービス間連携のテストが手動
  3. 環境の再現性:開発環境と本番環境の差異で障害発生
  4. リリースサイクルの遅延:全サービスの足並みを揃えるのに時間がかかる

数値で見る問題

  • サービスあたりのデプロイ時間:45分
  • 統合テスト実行時間:3時間(手動)
  • 環境差異による障害:月 5件
  • リリースサイクル:2週間(目標:毎日)

成功指標(KPI)

指標現状目標
個別サービスデプロイ時間45分10分
統合テスト実行時間3時間30分(自動)
環境差異障害5件/月0件/月
リリース頻度2週間毎日可能

達成目標

主要な学習成果

  1. マイクロサービスごとの独立したCI/CDパイプラインの構築
  2. サービス間依存関係を考慮した統合テストの自動化
  3. ECRを使ったコンテナイメージ管理とタグ戦略
  4. GitOpsパターンの基礎理解

習得するスキル

  • CodePipeline + CodeBuildによるマルチサービスCI/CD
  • ECRイメージスキャンとセキュリティ対策
  • サービスメッシュ(App Mesh)でのトラフィック制御
  • Contract Testing(Pact等)の概念

使用するAWSサービス

コアサービス

サービス用途重要度
CodePipelineCI/CDパイプライン
CodeBuildビルド・テスト実行
ECRコンテナイメージ保存
ECS Fargateマイクロサービス実行
App Meshサービスメッシュ
ALBAPI Gateway / ロードバランサー

補助サービス

サービス用途
CloudWatchログ・メトリクス
X-Ray分散トレーシング
Secrets Managerシークレット管理
SNS通知
S3アーティファクト保存
DynamoDBサービス設定管理

前提条件

必要な知識

  • マイクロサービスアーキテクチャの基本概念
  • Dockerの基本操作
  • CI/CDの基本概念
  • RESTful APIの設計

事前準備

  1. AWSアカウント
  2. GitHubアカウントとCodeStar Connection設定済み
  3. AWS CLI v2
  4. Docker Desktop
  5. Terraform CLI

環境要件

bash
terraform --version  # 1.5以上
docker --version
aws --version

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

Challenge 1: パイプラインの連鎖失敗

状況: ad-serverのデプロイが失敗し、依存するreportingサービスのパイプラインも停止

調査ポイント:

  1. 各パイプラインのステージ状態を確認
  2. サービス依存関係マトリクスを確認
  3. ロールバック対象の特定

解決コマンド:

bash
# 全パイプラインの状態を確認
for pipeline in ad-bidder ad-server user-service reporting; do
  echo "=== $pipeline ==="
  aws codepipeline get-pipeline-state --name adoptimizer-$pipeline \
    --query 'stageStates[*].[stageName,latestExecution.status]' \
    --output table
done

Challenge 2: イメージスキャンでCritical脆弱性検出

状況: ECRのイメージスキャンでCritical脆弱性が見つかり、デプロイがブロック

調査ポイント:

  1. 脆弱性の詳細を確認
  2. 影響を受けるベースイメージを特定
  3. 一時的な除外か、即座の修正が必要か判断

Challenge 3: 統合テストのフレーキーテスト

状況: 統合テストが時々失敗し、パイプラインが不安定

調査ポイント:

  1. テストログで失敗パターンを分析
  2. 競合状態やタイムアウトの有無を確認
  3. テストデータの分離状況を確認

設計考慮ポイント

ディスカッション1: モノレポ vs マルチレポ

テーマ: マイクロサービスのリポジトリ戦略

戦略メリットデメリット
モノレポ依存関係管理が容易、アトミックな変更ビルド時間増加、権限管理が複雑
マルチレポチーム独立性高い、ビルド高速依存関係の同期が困難
ハイブリッドバランスが取れる複雑性増加

ディスカッション2: テスト戦略

テーマ: テストピラミッドのバランス

        /\
       /  \  E2E Tests (少量・遅い)
      /----\
     /      \  Integration Tests
    /--------\
   /          \  Unit Tests (大量・高速)
  --------------

ディスカッション3: サービス間通信

テーマ: 同期 vs 非同期通信

パターンユースケース考慮点
REST/gRPC即座の応答が必要タイムアウト、サーキットブレーカー
イベント駆動疎結合、耐障害性結果整合性、デバッグの複雑さ

発展課題

Advanced 1: GitOpsの導入

課題: ArgoCD または Flux を使って、Git をソースオブトゥルースとした宣言的デプロイを実装

Advanced 2: カオスエンジニアリング

課題: AWS Fault Injection Simulator を使って、サービス障害時の振る舞いをテスト

Advanced 3: 動的環境(Preview Environment)

課題: PRごとに一時的な環境を自動作成し、レビュー後に削除


コスト見積もり

月額コスト概算(10サービス × 3環境)

環境サービス構成月額コスト
DevECS Fargate0.25 vCPU / 0.5GB × 10サービス × 1タスク$90
ALB1$16
NAT Gateway1$32
小計$138
StgECS Fargate0.25 vCPU / 0.5GB × 10サービス × 2タスク$180
ALB1$16
NAT Gateway1$32
小計$228
ProdECS Fargate0.5 vCPU / 1GB × 10サービス × 4タスク$720
ALB1$16
NAT Gateway2$65
App Mesh10 Virtual Nodes$50
小計$851
CI/CDCodePipeline10 pipelines$10
CodeBuild月1000分想定$50
ECR10GB$1
S3 (Artifacts)50GB$1
小計$62

合計: 約 $1,279/月(約192,000円)

コスト削減のヒント

  1. 開発環境の自動停止: 夜間・休日はタスク数を0に
  2. スポットインスタンス: CodeBuildでスポット利用
  3. ビルドキャッシュ: Docker layer cacheで時間短縮

学習のポイント

重要な概念の整理

  1. 独立デプロイ可能性

    • 各サービスが独立してデプロイ可能
    • 後方互換性のあるAPI設計が重要
    • Contract Testingで依存関係を検証
  2. パイプラインの独立性

    • サービスごとに独立したパイプライン
    • 共通モジュールは別途管理
    • 環境ごとのゲート(承認)
  3. イメージタグ戦略

    • Semantic Versioning(v1.2.3)
    • Git Commit Hash(abc1234)
    • 環境タグ(dev-latest, prod-latest)

次のステップ

  1. Feature Flags(AWS AppConfig)の導入
  2. サービスメッシュでの高度なトラフィック制御
  3. Observabilityプラットフォームの統合