課題33: 広告テック企業のマイクロサービスCI/CD
難易度: 🟡 中級
分類情報
| 項目 | 内容 |
|---|---|
| 難易度 | 中級 |
| カテゴリ | IaC・DevOps |
| 処理タイプ | 非同期 |
| 使用IaC | Terraform |
| 想定所要時間 | 6-7時間 |
シナリオ
企業プロフィール
〇〇株式会社は、プログラマティック広告配信プラットフォームを提供するアドテック企業です。10個のマイクロサービスで構成されるシステムを運用しており、毎秒数万リクエストを処理しています。
現状の課題
マイクロサービス化は完了したものの、デプロイとテストの運用が追いついていません:
- デプロイの複雑化:10サービスの依存関係管理が困難
- 統合テストの不足:サービス間連携のテストが手動
- 環境の再現性:開発環境と本番環境の差異で障害発生
- リリースサイクルの遅延:全サービスの足並みを揃えるのに時間がかかる
数値で見る問題
- サービスあたりのデプロイ時間:45分
- 統合テスト実行時間:3時間(手動)
- 環境差異による障害:月 5件
- リリースサイクル:2週間(目標:毎日)
成功指標(KPI)
| 指標 | 現状 | 目標 |
|---|---|---|
| 個別サービスデプロイ時間 | 45分 | 10分 |
| 統合テスト実行時間 | 3時間 | 30分(自動) |
| 環境差異障害 | 5件/月 | 0件/月 |
| リリース頻度 | 2週間 | 毎日可能 |
達成目標
主要な学習成果
- マイクロサービスごとの独立したCI/CDパイプラインの構築
- サービス間依存関係を考慮した統合テストの自動化
- ECRを使ったコンテナイメージ管理とタグ戦略
- GitOpsパターンの基礎理解
習得するスキル
- CodePipeline + CodeBuildによるマルチサービスCI/CD
- ECRイメージスキャンとセキュリティ対策
- サービスメッシュ(App Mesh)でのトラフィック制御
- Contract Testing(Pact等)の概念
使用するAWSサービス
コアサービス
| サービス | 用途 | 重要度 |
|---|---|---|
| CodePipeline | CI/CDパイプライン | 高 |
| CodeBuild | ビルド・テスト実行 | 高 |
| ECR | コンテナイメージ保存 | 高 |
| ECS Fargate | マイクロサービス実行 | 高 |
| App Mesh | サービスメッシュ | 中 |
| ALB | API Gateway / ロードバランサー | 高 |
補助サービス
| サービス | 用途 |
|---|---|
| CloudWatch | ログ・メトリクス |
| X-Ray | 分散トレーシング |
| Secrets Manager | シークレット管理 |
| SNS | 通知 |
| S3 | アーティファクト保存 |
| DynamoDB | サービス設定管理 |
前提条件
必要な知識
- マイクロサービスアーキテクチャの基本概念
- Dockerの基本操作
- CI/CDの基本概念
- RESTful APIの設計
事前準備
- AWSアカウント
- GitHubアカウントとCodeStar Connection設定済み
- AWS CLI v2
- Docker Desktop
- Terraform CLI
環境要件
bash
terraform --version # 1.5以上
docker --version
aws --versionトラブルシューティング課題
Challenge 1: パイプラインの連鎖失敗
状況: ad-serverのデプロイが失敗し、依存するreportingサービスのパイプラインも停止
調査ポイント:
- 各パイプラインのステージ状態を確認
- サービス依存関係マトリクスを確認
- ロールバック対象の特定
解決コマンド:
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
doneChallenge 2: イメージスキャンでCritical脆弱性検出
状況: ECRのイメージスキャンでCritical脆弱性が見つかり、デプロイがブロック
調査ポイント:
- 脆弱性の詳細を確認
- 影響を受けるベースイメージを特定
- 一時的な除外か、即座の修正が必要か判断
Challenge 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環境)
| 環境 | サービス | 構成 | 月額コスト |
|---|---|---|---|
| Dev | ECS Fargate | 0.25 vCPU / 0.5GB × 10サービス × 1タスク | $90 |
| ALB | 1 | $16 | |
| NAT Gateway | 1 | $32 | |
| 小計 | $138 | ||
| Stg | ECS Fargate | 0.25 vCPU / 0.5GB × 10サービス × 2タスク | $180 |
| ALB | 1 | $16 | |
| NAT Gateway | 1 | $32 | |
| 小計 | $228 | ||
| Prod | ECS Fargate | 0.5 vCPU / 1GB × 10サービス × 4タスク | $720 |
| ALB | 1 | $16 | |
| NAT Gateway | 2 | $65 | |
| App Mesh | 10 Virtual Nodes | $50 | |
| 小計 | $851 | ||
| CI/CD | CodePipeline | 10 pipelines | $10 |
| CodeBuild | 月1000分想定 | $50 | |
| ECR | 10GB | $1 | |
| S3 (Artifacts) | 50GB | $1 | |
| 小計 | $62 |
合計: 約 $1,279/月(約192,000円)
コスト削減のヒント
- 開発環境の自動停止: 夜間・休日はタスク数を0に
- スポットインスタンス: CodeBuildでスポット利用
- ビルドキャッシュ: Docker layer cacheで時間短縮
学習のポイント
重要な概念の整理
独立デプロイ可能性
- 各サービスが独立してデプロイ可能
- 後方互換性のあるAPI設計が重要
- Contract Testingで依存関係を検証
パイプラインの独立性
- サービスごとに独立したパイプライン
- 共通モジュールは別途管理
- 環境ごとのゲート(承認)
イメージタグ戦略
- Semantic Versioning(v1.2.3)
- Git Commit Hash(abc1234)
- 環境タグ(dev-latest, prod-latest)
次のステップ
- Feature Flags(AWS AppConfig)の導入
- サービスメッシュでの高度なトラフィック制御
- Observabilityプラットフォームの統合