Skip to content

課題39: マーケティングSaaSのAWSコスト最適化

難易度: 🟡 中級


分類情報

項目内容
難易度中級
カテゴリコスト管理・最適化
処理タイプバッチ
使用IaCCloudFormation
想定所要時間4-5時間

シナリオ

企業プロファイル

  • 企業名: 〇〇株式会社
  • 業種: マーケティングSaaS(広告効果測定・分析)
  • 規模: 従業員80名、エンジニア20名
  • 顧客数: 500社、月間データ処理量50TB
  • 現状インフラ: AWS(月額コスト300万円)

現状の課題

〇〇株式会社は急成長に伴いAWSコストが急増しています。 CFO から「コストを30%削減しつつ、パフォーマンスを維持せよ」という指示が出ました。

  1. コスト可視性の欠如

    • 部門・プロジェクト別のコストが把握できていない
    • 無駄なリソースの特定ができない
    • 予算超過の早期検知ができない
  2. リソースの非効率な利用

    • EC2インスタンスの平均CPU使用率が15%
    • 開発環境が24時間稼働
    • 未使用のEBSボリューム・EIPが多数存在
  3. 購入オプションの未活用

    • すべてオンデマンド課金
    • Reserved Instances/Savings Plans 未導入
    • Spot インスタンス未活用

現状のAWSコスト内訳

月額コスト: 300万円($20,000相当)

カテゴリコスト割合
EC2 (コンピュート)120万円40%
RDS (データベース)60万円20%
S3 (ストレージ)45万円15%
Data Transfer30万円10%
ElastiCache15万円5%
その他30万円10%

ビジネス要件

機能要件:
- コストの部門・プロジェクト別可視化
- 異常コストの自動検知・通知
- 最適化推奨の自動生成
- 月次コストレポートの自動化

非機能要件:
- コスト30%削減(300万円 → 210万円)
- パフォーマンス維持(レイテンシ悪化なし)
- 可用性維持(99.9%)
- 実装期間:3ヶ月

成功指標(KPI)

指標現状目標
月額AWSコスト300万円210万円(30%削減)
EC2 CPU使用率15%50-70%
Reserved/Savings カバレッジ0%60%
コスト可視性(タグ付け率)30%95%
無駄リソース数50+0

達成目標

本課題で習得するスキル

1. コスト可視化(理解度:詳細)
   - AWS Cost Explorer の活用
   - コスト配分タグの設計・実装
   - Cost and Usage Report (CUR) の分析

2. コスト最適化(理解度:実装)
   - Compute Optimizer によるサイジング
   - Reserved Instances / Savings Plans
   - Spot インスタンスの活用

3. コストガバナンス(理解度:実装)
   - AWS Budgets によるアラート
   - Trusted Advisor の活用
   - 自動停止・削除の実装

使用するAWSサービス

メインサービス

サービス役割使用機能
AWS Cost Explorerコスト分析可視化、予測、推奨
AWS Compute Optimizerリソース最適化EC2/Lambda/EBS推奨
AWS Trusted Advisorベストプラクティスコスト最適化チェック
AWS Budgets予算管理アラート、アクション

サポートサービス

サービス用途
Cost and Usage Report詳細コストデータ
AWS Organizations一括請求、SCP
Amazon S3CUR保存
Amazon AthenaCUR分析
Amazon QuickSightダッシュボード
AWS Lambda自動化処理
Amazon EventBridgeスケジュール実行

アーキテクチャ図

コンポーネント役割
Cost Explorerコスト分析・予測・RI推奨
CUR S3/Athenaコスト詳細データ
QuickSightダッシュボード
Compute OptimizerEC2・Lambda・EBS最適化推奨
Trusted Advisor未使用リソース検出
Savings PlansCompute/EC2 Savings Plans
AWS Budgets予算・アラート設定
EventBridgeスケジュール実行
Lambda自動停止・削除処理
SNS通知配信
Slack/Email/PagerDuty通知先

前提条件

必要な環境

bash
# AWS CLI v2
aws --version  # 2.x以上

# Python 3.9以上
python3 --version

# jq(JSON処理)
jq --version

# Excel/スプレッドシート(レポート確認用)

AWSアカウント要件

- Cost Explorer が有効化されていること
- Cost and Usage Report が設定済み(推奨)
- IAM 権限:Billing管理、Cost Explorer、Compute Optimizer
- Trusted Advisor:Business または Enterprise Support プラン(推奨)

事前準備スクリプト

bash
#!/bin/bash
# setup-cost-optimization.sh

# ディレクトリ構造の作成
mkdir -p admetrics-cost/{analysis,automation,reports,dashboards}
cd admetrics-cost

# Cost Explorer の有効化確認
echo "=== Checking Cost Explorer Status ==="
aws ce get-cost-and-usage \
    --time-period Start=2024-01-01,End=2024-01-02 \
    --granularity MONTHLY \
    --metrics "BlendedCost" \
    2>/dev/null && echo "Cost Explorer is enabled" || echo "Enable Cost Explorer in Billing Console"

# Compute Optimizer の有効化
echo "=== Enabling Compute Optimizer ==="
aws compute-optimizer update-enrollment-status \
    --status Active \
    --include-member-accounts

# Trusted Advisor の確認
echo "=== Checking Trusted Advisor ==="
aws support describe-trusted-advisor-checks \
    --language en \
    --query 'checks[?category==`cost_optimizing`].name' \
    --output table 2>/dev/null || echo "Trusted Advisor requires Business/Enterprise Support"

# Cost Allocation Tags の確認
echo "=== Checking Cost Allocation Tags ==="
aws ce list-cost-allocation-tags \
    --query 'CostAllocationTags[*].[TagKey,Status]' \
    --output table

アーキテクチャ設計

コスト配分タグ設計

yaml
# cost-allocation-tags.yaml
cost_allocation_tags:
  # 必須タグ(全リソース)
  required:
    - key: Environment
      values: [production, staging, development, test]
      description: "環境識別"

    - key: Project
      values: [analytics, api, data-pipeline, infrastructure]
      description: "プロジェクト識別"

    - key: Team
      values: [platform, backend, data, frontend]
      description: "担当チーム"

    - key: CostCenter
      values: [engineering, marketing, sales, operations]
      description: "コストセンター"

  # 推奨タグ(追加情報)
  recommended:
    - key: Owner
      description: "リソース所有者(メールアドレス)"

    - key: Application
      description: "アプリケーション名"

    - key: AutoStop
      values: ["true", "false"]
      description: "自動停止対象"

# タグ付けポリシー(Organizations Tag Policy)
tag_policy:
  enforce_required_tags: true
  allowed_values_only: true
  non_compliant_action: report  # report | deny

コスト最適化戦略

yaml
# cost-optimization-strategy.yaml
optimization_targets:
  # Phase 1: Quick Wins(即効性のある最適化)
  quick_wins:
    target_savings: 15%  # 45万円/月
    timeline: 1週間
    actions:
      - type: unused_resources
        items:
          - Unattached EBS volumes
          - Unused Elastic IPs
          - Idle load balancers
          - Old snapshots (>90 days)
        estimated_savings: 10万円/月

      - type: development_scheduling
        items:
          - Stop dev/test EC2 at night (19:00-08:00)
          - Stop dev/test RDS at night
          - Weekend shutdown
        estimated_savings: 20万円/月

      - type: s3_optimization
        items:
          - Enable Intelligent-Tiering
          - Delete incomplete multipart uploads
          - Lifecycle policies for old data
        estimated_savings: 15万円/月

  # Phase 2: Right-sizing(適正サイジング)
  right_sizing:
    target_savings: 10%  # 30万円/月
    timeline: 1ヶ月
    actions:
      - type: ec2_right_sizing
        criteria:
          - CPU utilization < 40% for 14 days
          - Memory utilization < 40%
        approach: downsize_one_generation

      - type: rds_right_sizing
        criteria:
          - CPU utilization < 30% for 14 days
          - Connection count < 50% of max
        approach: consider_aurora_serverless

      - type: ebs_optimization
        criteria:
          - IOPS utilization < 50%
          - Throughput utilization < 50%
        approach: gp3_migration

  # Phase 3: Commitment(コミットメント購入)
  commitment:
    target_savings: 5%  # 15万円/月
    timeline: 3ヶ月
    actions:
      - type: savings_plans
        coverage_target: 60%
        type: Compute Savings Plans
        term: 1_year
        payment: no_upfront

      - type: reserved_instances
        coverage_target: 40%
        term: 1_year
        payment: partial_upfront
        targets:
          - RDS (stable workloads)
          - ElastiCache (stable workloads)

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

課題1: Cost Explorer のデータが表示されない

症状:

Cost Explorer を開いたが、コストデータが表示されない。
「Data is not available」というメッセージが表示される。

調査コマンド:

bash
# Cost Explorer の有効化状態確認
aws ce get-cost-and-usage \
    --time-period Start=2024-01-01,End=2024-01-31 \
    --granularity MONTHLY \
    --metrics "BlendedCost"

# IAM 権限の確認
aws iam get-user
aws iam list-attached-user-policies --user-name YOUR_USER_NAME

原因と解決:

解答を見る

原因: 複数の原因が考えられる

パターン1: Cost Explorer が有効化されていない

bash
# Cost Explorer は Billing コンソールで有効化が必要
# AWS マネジメントコンソール → Billing → Cost Explorer → Enable Cost Explorer

# 有効化後、データが表示されるまで24時間かかる場合がある

パターン2: IAM 権限不足

bash
# 必要な権限
# - ce:GetCostAndUsage
# - ce:GetCostForecast
# - ce:GetReservationPurchaseRecommendation

# IAM ポリシーの例
aws iam attach-user-policy \
    --user-name YOUR_USER_NAME \
    --policy-arn arn:aws:iam::aws:policy/AWSBillingReadOnlyAccess

パターン3: 組織アカウントでのアクセス制限

bash
# Organizations を使用している場合、
# 管理アカウントで以下を有効化する必要がある:
# - IAM User and Role Access to Billing Information

# AWS Organizations → Policies → Service Control Policies
# Billing へのアクセスを許可する SCP が必要

パターン4: リージョン設定

bash
# Cost Explorer は us-east-1 リージョンで API を呼び出す
aws ce get-cost-and-usage \
    --region us-east-1 \
    --time-period Start=2024-01-01,End=2024-01-31 \
    --granularity MONTHLY \
    --metrics "BlendedCost"

課題2: Compute Optimizer の推奨が表示されない

症状:

Compute Optimizer を有効化したが、EC2 インスタンスの推奨が
「推奨なし」と表示される。

調査コマンド:

bash
# Compute Optimizer の状態確認
aws compute-optimizer get-enrollment-status

# EC2 インスタンスの推奨取得
aws compute-optimizer get-ec2-instance-recommendations \
    --query 'instanceRecommendations[*].[instanceArn,finding,findingReasonCodes]' \
    --output table

原因と解決:

解答を見る

原因: データ収集期間が不足している

解決手順:

bash
# 1. Compute Optimizer は最低14日間のデータが必要
# 新規インスタンスの場合は14日待つ必要がある

# 2. CloudWatch Agent がインストールされているか確認
# メモリメトリクスの収集には Agent が必要
aws ssm describe-instance-information \
    --query 'InstanceInformationList[*].[InstanceId,PingStatus]' \
    --output table

# 3. 詳細モニタリングの有効化(オプション)
aws ec2 monitor-instances --instance-ids i-1234567890abcdef0

# 4. インスタンスの状態確認
# 停止中のインスタンスは分析対象外
aws ec2 describe-instances \
    --query 'Reservations[*].Instances[*].[InstanceId,State.Name]' \
    --output table

# 5. Finding Reason Codes の確認
aws compute-optimizer get-ec2-instance-recommendations \
    --query 'instanceRecommendations[?finding==`NotOptimized`].[instanceArn,findingReasonCodes]'

# 主な Reason Codes:
# - CPUOverprovisioned: CPU が過剰プロビジョニング
# - MemoryOverprovisioned: メモリが過剰(Agent 必要)
# - EBSThroughputOverprovisioned: EBS スループットが過剰

課題3: Budget アラートが送信されない

症状:

AWS Budget で予算を設定し、閾値を超えたはずだが、
通知メールが届かない。

調査コマンド:

bash
# Budget の設定確認
aws budgets describe-budget \
    --account-id $(aws sts get-caller-identity --query Account --output text) \
    --budget-name "Monthly-Total-Cost"

# 通知設定の確認
aws budgets describe-notifications-for-budget \
    --account-id $(aws sts get-caller-identity --query Account --output text) \
    --budget-name "Monthly-Total-Cost"

原因と解決:

解答を見る

原因: 複数の原因が考えられる

パターン1: メールアドレスの確認が未完了

bash
# SNS サブスクリプションの場合、確認メールのリンクをクリックする必要がある
aws sns list-subscriptions-by-topic \
    --topic-arn arn:aws:sns:REGION:ACCOUNT_ID:cost-alerts

パターン2: 閾値の設定ミス

bash
# FORECASTED vs ACTUAL の違い
# - FORECASTED: 予測値が閾値を超えた場合
# - ACTUAL: 実際のコストが閾値を超えた場合

# 確認
aws budgets describe-notifications-for-budget \
    --account-id $(aws sts get-caller-identity --query Account --output text) \
    --budget-name "Monthly-Total-Cost" \
    --query 'Notifications[*].[NotificationType,Threshold,ThresholdType]'

パターン3: SNS トピックの権限

bash
# Budget から SNS へのパブリッシュ権限を確認
aws sns get-topic-attributes \
    --topic-arn arn:aws:sns:REGION:ACCOUNT_ID:cost-alerts \
    --query 'Attributes.Policy'

# 必要な権限を付与
aws sns set-topic-attributes \
    --topic-arn arn:aws:sns:REGION:ACCOUNT_ID:cost-alerts \
    --attribute-name Policy \
    --attribute-value '{
        "Statement": [{
            "Effect": "Allow",
            "Principal": {"Service": "budgets.amazonaws.com"},
            "Action": "SNS:Publish",
            "Resource": "arn:aws:sns:REGION:ACCOUNT_ID:cost-alerts"
        }]
    }'

パターン4: Budget アラートの遅延

bash
# Budget アラートは最大24時間の遅延がある場合がある
# Cost Explorer のデータ更新タイミングに依存

# テスト用に低い閾値で Budget を作成
aws budgets create-budget \
    --account-id $(aws sts get-caller-identity --query Account --output text) \
    --budget '{
        "BudgetName": "Test-Alert",
        "BudgetLimit": {"Amount": "1", "Unit": "USD"},
        "BudgetType": "COST",
        "TimeUnit": "MONTHLY"
    }' \
    --notifications-with-subscribers '[{
        "Notification": {
            "NotificationType": "ACTUAL",
            "ComparisonOperator": "GREATER_THAN",
            "Threshold": 1,
            "ThresholdType": "ABSOLUTE_VALUE"
        },
        "Subscribers": [{
            "SubscriptionType": "EMAIL",
            "Address": "your-email@example.com"
        }]
    }]'

設計課題

設計課題: エンタープライズ規模のコストガバナンス体制

シナリオ: 〇〇社は急成長に伴い、AWS アカウントが10個に増加しました。 全社的なコストガバナンス体制を設計してください。

現状:

- 10 AWS アカウント(本番、開発、テスト、各チーム用など)
- 月額総コスト:1,500万円
- コスト可視性:各アカウント個別管理
- 購入オプション:未活用

要件:

1. ガバナンス要件
   - 全アカウントのコスト一元管理
   - 部門・プロジェクト別のコスト配分
   - 予算超過の自動検知・対応
   - 月次レポートの自動生成

2. 最適化要件
   - 全アカウント合計で20%コスト削減
   - Savings Plans の組織レベル活用
   - 未使用リソースの自動検出・削除

3. セキュリティ要件
   - コスト情報へのアクセス制御
   - 高額リソース作成の承認フロー
   - 監査ログの保持

設計すべき項目:

1. Organizations 設計(OU 構造)
2. コスト配分タグ戦略
3. Budget・アラート設計
4. 自動化・レポート設計
設計例を見る

エンタープライズコストガバナンスアーキテクチャ

コスト配分タグ戦略

yaml
tagging_strategy:
  # 必須タグ(SCP で強制)
  mandatory_tags:
    - key: Environment
      allowed_values: [production, staging, development, test, sandbox]
      enforcement: deny_if_missing

    - key: CostCenter
      allowed_values: [platform, backend, data, frontend, ml, shared]
      enforcement: deny_if_missing

    - key: Project
      description: プロジェクトコード(自由入力)
      enforcement: report_if_missing

    - key: Owner
      description: リソース所有者のメールアドレス
      enforcement: report_if_missing

  # 自動タグ付け
  auto_tagging:
    - source: IAM User/Role
      target_tag: CreatedBy
    - source: AWS Service Catalog
      target_tag: ProvisionedProduct

  # コストカテゴリ(Cost Categories)
  cost_categories:
    - name: BusinessUnit
      rules:
        - value: Engineering
          match: CostCenter IN [platform, backend, data, frontend, ml]
        - value: Operations
          match: CostCenter = shared

    - name: Environment
      rules:
        - value: Production
          match: Environment = production
        - value: Non-Production
          match: Environment IN [staging, development, test]
        - value: Sandbox
          match: Environment = sandbox

Budget 階層設計

yaml
budget_hierarchy:
  # 組織全体予算
  organization_level:
    - name: Total-Monthly-Cost
      amount: 10000000  # 1,000万円
      alerts:
        - threshold: 80%
          type: forecasted
          action: notify_cfo
        - threshold: 100%
          type: actual
          action: [notify_all_managers, create_incident]

  # OU レベル予算
  ou_level:
    workloads:
      amount: 7000000  # 700万円
      alerts:
        - threshold: 90%
          action: notify_platform_manager

    sandbox:
      amount: 1500000  # 150万円
      alerts:
        - threshold: 100%
          action: auto_stop_non_essential

  # アカウントレベル予算
  account_level:
    per_team_account:
      amount: varies_by_team
      alerts:
        - threshold: 80%
          action: notify_team_lead
        - threshold: 100%
          action: [notify_team_lead, restrict_ec2_launch]

  # 自動アクション
  budget_actions:
    - trigger: sandbox_over_budget
      action:
        type: lambda
        function: stop_non_production_resources

    - trigger: team_over_budget
      action:
        type: scp_attach
        policy: DenyEC2Launch

推定コスト削減効果

最適化施策対象削減見込み
Savings Plans (組織レベル)EC2/Fargate150万円 (20%)
開発環境スケジューリングDev/Test50万円
ライトサイジング全アカウント50万円
未使用リソース削除全アカウント30万円
データ転送最適化全アカウント20万円
合計300万円 (20%)

発展課題

発展課題1: FinOps プラクティスの導入(難易度:上級)

課題内容: FinOps Foundation のフレームワークに基づき、組織的なクラウドコスト管理プラクティスを導入してください。

要件:

  • Inform(情報提供): リアルタイムコスト可視化
  • Optimize(最適化): 継続的な最適化サイクル
  • Operate(運用): コスト責任の分散

発展課題2: 機械学習によるコスト予測(難易度:上級)

課題内容: Amazon Forecast を使用して、より精度の高いコスト予測モデルを構築してください。

要件:

  • CUR データを使用した予測モデル
  • 季節性・イベント要因の考慮
  • 異常検知の実装

発展課題3: マルチクラウドコスト管理(難易度:中級)

課題内容: AWS + GCP のマルチクラウド環境でのコスト統合管理ダッシュボードを構築してください。

要件:

  • 両クラウドのコストデータ統合
  • 統一されたタグ体系
  • 比較分析ダッシュボード

振り返りと次のステップ

学習のまとめ

本課題で学んだこと:
□ Cost Explorer によるコスト分析と予測
□ Compute Optimizer によるライトサイジング
□ Trusted Advisor による未使用リソース検出
□ AWS Budgets によるコスト管理とアラート
□ コスト配分タグの設計と実装
□ 自動化によるコスト最適化

推奨される次のステップ

1. AWS Certified Cloud Practitioner の学習
   - コスト管理の基礎を体系的に理解

2. FinOps Foundation 認定の取得
   - クラウドコスト管理のベストプラクティス

3. 実環境での最適化実施
   - 本課題の手法を実際の環境に適用
   - 効果測定と継続的改善

4. 関連課題への挑戦
   - 課題28: オブザーバビリティ(コストとパフォーマンスの相関)
   - 課題30: 統合課題(コスト効率の良いアーキテクチャ設計)

推定コストと注意事項

本課題の推定コスト

サービス使用量推定コスト(演習時)
Cost Explorer分析無料
Compute Optimizer分析無料
Trusted Advisor基本無料(Business以上は別途)
AWS Budgets予算設定無料(最初の2つ)
Lambda自動化< $1
S3 (CUR)保存< $1
合計< $5

コスト最適化の ROI 計算

本課題での学習投資:
- 所要時間: 4-5時間
- AWSコスト: ~$5
- 合計コスト: 約 $50(時間コスト含む)

期待される効果(〇〇 のケース):
- 月額削減額: 90万円(30%削減)
- 年間削減額: 1,080万円
- ROI: 21,600倍

注意事項

⚠️ Reserved Instances / Savings Plans 購入
- 1年/3年のコミットメントが必要
- 購入前に十分な使用量分析を実施
- 返金不可のため慎重に判断

⚠️ 自動停止・削除の実装
- 本番環境への適用は慎重に
- DRY_RUN モードでの十分なテスト
- 保護タグ(DoNotDelete)の活用

⚠️ Trusted Advisor の制限
- 基本サポートでは一部チェックのみ
- 全機能利用には Business Support 以上が必要

課題作成日: 2024年1月 最終更新日: 2024年1月 作成者: AWS学習プログラム