目次

AWSコスト最適化実践ガイド

周辺資料: 学習インデックス · AWSサービス一覧(2026) · Well-Architectedチェックリスト · アーキテクチャパターン集


FinOpsの3フェーズを軸にAWSコスト削減施策を体系化した実践ガイド。


1. FinOps フレームワーク

3フェーズサイクル

[Inform(可視化)]
  コスト・使用量データを正確に把握
  タグ戦略 → Cost Explorer → Budgets → 異常検知

        ↓

[Optimize(最適化)]
  無駄を削減・効率化施策を実施
  右サイズ化 → RI/SP → Spot → アーキ刷新

        ↓

[Operate(運用化)]
  継続的改善サイクルの確立
  KPI設定 → 定期レビュー → 責任分担 → 自動化

        ↓(繰り返し)

FinOps 組織の役割分担

役割 主な責務
FinOps Lead 全社コスト戦略・KPI設定・ステークホルダー調整
Cloud Architect サービス選定・アーキ最適化
開発チーム タグ付け・アプリレベルの最適化
SRE / Ops 右サイズ化・不要リソース削除
財務 予算管理・RI/SP購入承認

2. コスト可視化(Inform フェーズ)

タグ戦略の設計

[必須タグ(コスト配賦に使用)]
  Environment: prod / staging / dev / sandbox
  Team:        platform / backend / frontend / data / ml
  Service:     auth / order / payment / notification
  CostCenter:  CC-001 / CC-002 ...(財務コードと連携)

[推奨タグ]
  Owner:       担当者名またはチームSlackチャンネル
  Project:     プロジェクトコード
  Expiry:      2026-06-30(一時的リソースの自動削除に活用)

[タグ強制の仕組み]
  SCP で必須タグのないリソース作成を Deny
  AWS Config Rule: required-tags ルールで継続監視
  tag:GetResources で未タグリソースを週次レポート

Cost Explorer の活用

[主要な分析軸]
  グループ化: サービス / リージョン / タグ(Team/Service)
  フィルタ:  アカウント / 購入オプション(オンデマンド/RI/Spot)
  期間:     前月比 / 3ヶ月移動平均 / 前年比

[Cost Explorer 推奨ビュー]
  1. サービス別コスト(月次トップ10)
     → どのサービスが主要コストドライバーか把握
  2. 購入オプション別コスト
     → オンデマンド vs RI vs Spot の比率確認
  3. タグ別コスト(Team/Serviceタグ)
     → チーム・サービス単位の責任配賦
  4. 日次コスト(直近30日)
     → コスト急増を早期検知

[Savings Plans Coverage Report]
  推奨: Commitment のカバレッジ目標 70〜80%
  未カバー部分 = 最適化余地

AWS Budgets の設定

[推奨バジェット構成]
  1. 全体予算アラート
     しきい値: 予算の 80% / 100% / 110%
     通知先: 財務担当 + FinOps Lead(SNS → Slack/メール)

  2. チーム別予算
     フィルタ: Team タグで絞り込み
     しきい値: 予算の 90% / 100%
     通知先: 各チームリード

  3. サービス別予算(高コストサービス)
     EC2 / ECS / RDS / Lambda を個別に設定
     異常値の早期発見

  4. Budget Action(自動対応)
     しきい値超過時: EC2 / RDS の自動停止アクション
     対象: 開発・検証環境のみ(本番は通知のみ)

Cost Anomaly Detection

[設定方法]
  モニター: AWS サービス別 / リンクアカウント別 / コストカテゴリ別
  アラート:
    - 個別アラート(件ごとに通知)
    - 日次ダイジェスト(毎日まとめて通知)

[推奨しきい値]
  絶対値: $100 超過
  割合: 前週比 20% 超過
  → 小規模システムでは絶対値、大規模では割合が効果的

[異常検知の限界]
  新しいサービス起動直後は「異常」として検知されやすい
  → 初回デプロイ後2〜4週間は False Positive に注意

3. コンピューティングコスト最適化

購入オプション比較

オプション 割引率 向いているワークロード 注意点
オンデマンド 0%(基準) 開発・一時的・予測不能な負荷 最も高い
Savings Plans(Compute) 最大66% Lambda/Fargate/EC2混在 1〜3年コミット
Savings Plans(EC2 Instance) 最大72% 特定インスタンスファミリー固定 ファミリー縛り
Reserved Instances(Standard) 最大72% 長期安定稼働の DB/AP サーバー 変更困難
Reserved Instances(Convertible) 最大54% 中長期だが変更余地を残したい Standard より低割引
Spot Instances 最大90% バッチ/CI/非重要ワークロード 中断リスクあり

RI / Savings Plans 購入判断フロー

過去3ヶ月の EC2/Fargate/Lambda コストを確認
         │
         ├── オンデマンド比率が 60% 以上?
         │       YES → RI/SP を検討
         │       NO  → 既存のカバレッジを確認
         │
         ├── インスタンスファミリーが安定?(変更頻度低い)
         │       YES → EC2 Instance Savings Plans(高割引)
         │       NO  → Compute Savings Plans(柔軟)
         │
         ├── 1年 vs 3年
         │       プロダクトロードマップが不透明 → 1年
         │       安定運用フェーズ → 3年(割引最大化)
         │
         └── 支払い方法
               All Upfront > Partial Upfront > No Upfront(割引順)
               キャッシュフローに余裕あれば All Upfront を選択

EC2 右サイズ化(Compute Optimizer)

[Compute Optimizer の推奨を確認する手順]
  1. Compute Optimizer → EC2 インスタンス
  2. 推奨理由別にフィルタ:
     - Over-provisioned(過剰プロビジョニング)← 主な対象
     - Under-provisioned(不足)
     - Optimized(最適)
  3. 推奨インスタンスタイプへの変更計画を作成

[よくある最適化パターン]
  m5.4xlarge → m5.2xlarge(CPU 平均使用率が 15%以下)
  r5.2xlarge → m5.2xlarge(メモリ使用率が 30%以下)
  c5.xlarge  → t3.large  (バースト可能な開発サーバー)

[注意点]
  - 変更前に CloudWatch メモリエージェント(CWAgent)でメモリ使用率を計測
  - CPU使用率だけでなくネットワーク帯域・ディスクI/Oも確認
  - RDS は Performance Insights を参照してサイズダウン可否を判断

Spot Instance 活用戦略

[Spot に向くワークロード]
  ✓ バッチ処理(EMR / AWS Batch)
  ✓ CI/CD パイプライン(GitLab Runner / Jenkins)
  ✓ ECS Fargate Spot(本番トラフィックでも活用可)
  ✓ 機械学習訓練ジョブ(SageMaker Managed Spot Training)
  ✓ 開発・検証環境

[Spot 中断対策]
  - ASG の複数インスタンスタイプ指定(5〜7種)
  - capacity-optimized 配置戦略(中断リスク最小)
  - Spot Instance Advisor で中断頻度を事前確認
  - チェックポイント処理の実装(S3 にジョブ状態を保存)

[ECS Fargate Spot の設定例]
capacity_provider_strategy:
  - capacityProvider: FARGATE_SPOT
    weight: 3    ← 75%をSpotで実行
  - capacityProvider: FARGATE
    weight: 1    ← 25%をオンデマンドで確保(可用性保証)

Lambda コスト最適化

[メモリ最適化]
  AWS Lambda Power Tuning(OSS)を使い最適メモリを特定
  例: 1024MB → 512MB に削減でコスト50%削減
      ただし実行時間が延びる場合はトレードオフを計算
      コスト = GB-秒 × 単価(512MB で 5秒 vs 1024MB で 3秒)

[アーキテクチャの工夫]
  - コールドスタートが問題でない処理はデフォルト設定で OK
  - 定期バッチには EventBridge Scheduler(Lambda より安価な場合も)
  - 同一処理が 24/7 常時起動なら Fargate への移行を検討

[Lambda コストの計算]
  コスト ≒ リクエスト数 × 実行時間(GB-秒) × $0.0000166667
  無料枠: 100万リクエスト/月 + 400,000 GB-秒/月

4. ストレージコスト最適化

S3 ライフサイクル設計

[典型的なライフサイクルルール]

  ログデータ:
    0日目:  S3 Standard(アップロード)
    30日後: S3 Standard-IA(アクセス頻度低下)
    90日後: S3 Glacier Instant Retrieval(長期保管)
    365日後: S3 Glacier Deep Archive(低コスト最終保管)
    2555日後(7年): 削除 or 期限なし保管

  一時ファイル / キャッシュ:
    7日後: 削除(Expiration アクション)

  バックアップ:
    30日後: S3 Standard-IA
    180日後: S3 Glacier Flexible Retrieval
    規制要件に応じた削除禁止(Object Lock)

[S3 Intelligent-Tiering の判断基準]
  ✓ アクセスパターンが読めない(コンテンツ種別が多様)
  ✓ オブジェクト数が多く手動管理が困難
  × 小さいオブジェクト(128KB 未満)が多い → コスト増
  × アクセス頻度が明確 → 手動ライフサイクルの方が安価

EBS コスト最適化

[よくある無駄]
  - 停止中 EC2 の EBS ボリューム(課金継続)
  - 孤立したスナップショット(AMI 削除後も残留)
  - gp2 → gp3 未移行(同性能で 20% コスト削減)

[gp2 → gp3 移行の効果]
  gp2: $0.10/GB/月
  gp3: $0.08/GB/月(20%削減)+ IOPS/スループット独立設定可
  → 全 gp2 ボリュームを gp3 に変更するだけでコスト削減

[スナップショット整理の自動化]
  AWS Backup のライフサイクルポリシーで自動削除設定
  または Lambda + EventBridge で孤立スナップショット検出スクリプト

CloudWatch Logs コスト

[コスト削減策]
  1. 保持期間を設定(デフォルト: 無期限 → 90日/365日に変更)
  2. 冗長なログを削減(DEBUG ログを本番で出力しない)
  3. S3 → Athena でログ分析(CloudWatch Logs Insights より安価)
  4. Kinesis Firehose でリアルタイムに S3 へ転送 → S3 に統合

[CloudWatch Logs Insights コスト]
  $0.005/GB スキャン
  → クエリに時間範囲とフィルタを必ず指定してスキャン量を最小化

5. ネットワーク転送コスト最適化

データ転送コスト構造

[無料の転送]
  ✓ インターネット → AWS(インバウンド)
  ✓ 同一AZ内のEC2間(プライベートIP使用)
  ✓ CloudFront → クライアント(CloudFront の転送費はより安価)

[コストが発生する転送]
  × AWS → インターネット(アウトバウンド: $0.09/GB~)
  × AZ間転送(同一リージョン: $0.01/GB 双方向)
  × リージョン間転送($0.02/GB~)
  × VPC Peering 越えの転送

[コスト削減のポイント]
  1. CloudFront の活用
     オリジンへのリクエストをキャッシュで削減
     CloudFront Transfer: $0.0085/GB(東京)
     直接 ALB 経由: $0.114/GB(アウトバウンド)
     → CloudFront 経由で ~25% の転送コスト削減

  2. VPC エンドポイントの活用
     S3 / DynamoDB の Gateway エンドポイント: 無料
     → EC2 → S3 のインターネット経由転送コストをゼロに

  3. AZ アフィニティの設計
     ECS タスクと RDS を同一 AZ に配置(AZ間転送ゼロ)
     ALB の Cross-Zone Load Balancing を無効化(コスト最適時)

NAT Gateway コスト削減

[NAT Gateway の課金]
  処理データ: $0.045/GB
  稼働時間:  $0.045/時間

[削減策]
  1. VPC エンドポイント(PrivateLink / Gateway)を優先使用
     S3・DynamoDB は Gateway エンドポイント(無料)
     その他 AWS サービスは Interface エンドポイント(要検討)

  2. Lambda/ECS のプライベートサブネット配置の見直し
     「S3 にしかアクセスしない Lambda」に NAT は不要
     → Gateway エンドポイントで代替

  3. VPC あたりの NAT Gateway 数を最適化
     テスト: AZ ごとに NAT を設置 vs 1つに集約のトレードオフを比較

6. データベースコスト最適化

RDS / Aurora の最適化

[右サイズ化]
  Performance Insights で CPU/メモリ/接続数を確認
  Aurora Serverless v2 への移行(不定期トラフィックに有効)

[Aurora Serverless v2 の採用基準]
  ✓ 開発・検証環境(夜間はほぼゼロ)
  ✓ 日中と夜間のトラフィック差が大きい
  × 常時高負荷(Provisioned の方が安価)

[リザーブドインスタンスの活用]
  本番稼働で安定したRDS は Reserved(1年/3年)を適用
  開発環境は On-Demand + 夜間停止スクリプト

[RDS Proxy]
  Lambda → RDS の接続数爆発を防ぎコスト安定化
  コスト: $0.015/vCPU/時間 × RDS のvCPU数

DynamoDB コスト最適化

[キャパシティモード選択]
  オンデマンドモード:
    - トラフィックが予測不能
    - 月単位でのアクセス量変動が大きい
    - 書き込み: $1.25/百万ユニット / 読み取り: $0.25/百万ユニット

  プロビジョニングモード + Auto Scaling:
    - トラフィックがある程度予測可能
    - 割引: オンデマンドより 50〜80% 安価
    - Reserved Capacity(1/3年)で さらに 76% 削減

[コスト爆発の防止]
  - FilterExpression はコスト節約にならない(スキャン課金は変わらない)
  - テーブルスキャン(Scan 操作)を避けSparse Indexを活用
  - TTL を設定して不要データを自動削除
  - DynamoDB Streams の消費者がいない場合は無効化

7. 継続的なコスト管理(Operate フェーズ)

週次・月次レビューの運用手順

[週次(毎週月曜15分)]
  1. Cost Anomaly Detection の通知を確認
  2. Cost Explorer で前週の日次コストを確認
  3. 急増サービスがあれば原因を特定しチケット起票

[月次(毎月1日 1時間)]
  1. 先月コストを予算対比で確認(チーム別・サービス別)
  2. Savings Plans の Coverage Report を確認
     カバレッジ < 70% → 追加購入を検討
  3. Compute Optimizer の推奨を確認し、右サイズ化タスク登録
  4. 未使用リソースレポート(EIP / EBS / ALB)を確認
  5. 削減効果の測定(前月施策の ROI 計算)

[四半期(3ヶ月ごと 半日)]
  1. アーキテクチャ観点のコスト見直し(大きな刷新余地の評価)
  2. RI/SP の満了・更新確認(90日前から対応)
  3. 新しい AWS 値下げ・新サービスによる代替可能性の検討
  4. FinOps KPI の更新と次四半期目標設定

コスト自動化スクリプト

import boto3
from datetime import datetime, timedelta

class CostOptimizationAnalyzer:
    def __init__(self):
        self.ce = boto3.client('ce')
        self.ec2 = boto3.client('ec2')
        self.cloudwatch = boto3.client('cloudwatch')

    def get_top_cost_services(self, days=30, top_n=10):
        """過去N日間のサービス別コストTOP10を取得"""
        end_date = datetime.now().strftime('%Y-%m-%d')
        start_date = (datetime.now() - timedelta(days=days)).strftime('%Y-%m-%d')

        response = self.ce.get_cost_and_usage(
            TimePeriod={'Start': start_date, 'End': end_date},
            Granularity='MONTHLY',
            Metrics=['UnblendedCost'],
            GroupBy=[{'Type': 'DIMENSION', 'Key': 'SERVICE'}]
        )

        costs = []
        for group in response['ResultsByTime'][0]['Groups']:
            service = group['Keys'][0]
            amount = float(group['Metrics']['UnblendedCost']['Amount'])
            costs.append({'service': service, 'cost': amount})

        return sorted(costs, key=lambda x: x['cost'], reverse=True)[:top_n]

    def find_idle_ec2_instances(self, cpu_threshold=5.0, days=14):
        """CPU使用率が低いEC2インスタンスを特定"""
        ec2_response = self.ec2.describe_instances(
            Filters=[{'Name': 'instance-state-name', 'Values': ['running']}]
        )

        idle_instances = []
        end_time = datetime.now()
        start_time = end_time - timedelta(days=days)

        for reservation in ec2_response['Reservations']:
            for instance in reservation['Instances']:
                instance_id = instance['InstanceId']

                metrics = self.cloudwatch.get_metric_statistics(
                    Namespace='AWS/EC2',
                    MetricName='CPUUtilization',
                    Dimensions=[{'Name': 'InstanceId', 'Value': instance_id}],
                    StartTime=start_time,
                    EndTime=end_time,
                    Period=86400,
                    Statistics=['Average']
                )

                if metrics['Datapoints']:
                    avg_cpu = sum(d['Average'] for d in metrics['Datapoints']) / len(metrics['Datapoints'])
                    if avg_cpu < cpu_threshold:
                        idle_instances.append({
                            'instance_id': instance_id,
                            'instance_type': instance['InstanceType'],
                            'avg_cpu': round(avg_cpu, 2),
                            'name': next((t['Value'] for t in instance.get('Tags', [])
                                        if t['Key'] == 'Name'), 'N/A')
                        })

        return idle_instances

    def get_savings_plans_coverage(self):
        """Savings Plans のカバレッジを取得"""
        end_date = datetime.now().strftime('%Y-%m-%d')
        start_date = (datetime.now() - timedelta(days=30)).strftime('%Y-%m-%d')

        response = self.ce.get_savings_plans_coverage(
            TimePeriod={'Start': start_date, 'End': end_date},
            Granularity='MONTHLY'
        )

        total = response['Total']
        coverage_pct = float(total['Coverage']['CoveragePercentage'])
        on_demand_cost = float(total['Coverage']['OnDemandCost'])

        return {
            'coverage_percentage': coverage_pct,
            'on_demand_cost': on_demand_cost,
            'recommendation': 'カバレッジを増やすことを検討' if coverage_pct < 70 else '適切なカバレッジ'
        }

    def find_unattached_ebs_volumes(self):
        """アタッチされていない EBS ボリュームを検索"""
        response = self.ec2.describe_volumes(
            Filters=[{'Name': 'status', 'Values': ['available']}]
        )

        unattached = []
        for volume in response['Volumes']:
            unattached.append({
                'volume_id': volume['VolumeId'],
                'size_gb': volume['Size'],
                'volume_type': volume['VolumeType'],
                'created': volume['CreateTime'].strftime('%Y-%m-%d'),
                'estimated_monthly_cost': volume['Size'] * 0.08  # gp3 概算
            })

        return unattached

    def generate_cost_report(self):
        """コスト最適化レポートを生成"""
        print("=== AWS コスト最適化レポート ===\n")

        print("【サービス別コスト TOP10】")
        for i, svc in enumerate(self.get_top_cost_services(), 1):
            print(f"  {i:2}. {svc['service']:<50} ${svc['cost']:>10.2f}")

        print("\n【Savings Plans カバレッジ】")
        sp = self.get_savings_plans_coverage()
        print(f"  カバレッジ: {sp['coverage_percentage']:.1f}%")
        print(f"  オンデマンドコスト: ${sp['on_demand_cost']:.2f}")
        print(f"  判定: {sp['recommendation']}")

        print("\n【アイドル EC2 インスタンス(CPU < 5%)】")
        idle = self.find_idle_ec2_instances()
        if idle:
            for inst in idle:
                print(f"  {inst['instance_id']} ({inst['instance_type']}) "
                      f"Name={inst['name']} 平均CPU={inst['avg_cpu']}%")
        else:
            print("  なし")

        print("\n【未使用 EBS ボリューム】")
        vols = self.find_unattached_ebs_volumes()
        if vols:
            total_cost = sum(v['estimated_monthly_cost'] for v in vols)
            for v in vols:
                print(f"  {v['volume_id']} {v['size_gb']}GB ({v['volume_type']}) "
                      f"作成日: {v['created']} 推定月額: ${v['estimated_monthly_cost']:.2f}")
            print(f"  合計削減可能額: ${total_cost:.2f}/月")
        else:
            print("  なし")

# 実行例
if __name__ == '__main__':
    analyzer = CostOptimizationAnalyzer()
    analyzer.generate_cost_report()

開発・検証環境の自動停止

import boto3

def auto_stop_non_prod_resources(event, context):
    """非本番環境のリソースを夜間・週末に自動停止"""
    ec2 = boto3.client('ec2')
    rds = boto3.client('rds')

    # Environment=dev or staging のEC2を停止
    ec2_response = ec2.describe_instances(
        Filters=[
            {'Name': 'tag:Environment', 'Values': ['dev', 'staging']},
            {'Name': 'instance-state-name', 'Values': ['running']},
            {'Name': 'tag:AutoStop', 'Values': ['true']}  # オプトイン制
        ]
    )

    instance_ids = [
        i['InstanceId']
        for r in ec2_response['Reservations']
        for i in r['Instances']
    ]

    if instance_ids:
        ec2.stop_instances(InstanceIds=instance_ids)
        print(f"停止したEC2: {instance_ids}")

    # 非本番 RDS を停止(最大7日間停止可能)
    rds_response = rds.describe_db_instances()
    for db in rds_response['DBInstances']:
        tags = rds.list_tags_for_resource(
            ResourceName=db['DBInstanceArn']
        )['TagList']
        env_tag = next((t['Value'] for t in tags if t['Key'] == 'Environment'), '')
        auto_stop = next((t['Value'] for t in tags if t['Key'] == 'AutoStop'), 'false')

        if env_tag in ('dev', 'staging') and auto_stop == 'true':
            if db['DBInstanceStatus'] == 'available':
                rds.stop_db_instance(DBInstanceIdentifier=db['DBInstanceIdentifier'])
                print(f"停止したRDS: {db['DBInstanceIdentifier']}")

# EventBridge Scheduler 設定例:
# 平日夜間停止:  cron(0 21 ? * MON-FRI *)  → 毎週月〜金 21:00 (JST)
# 平日朝起動:   cron(0 8  ? * MON-FRI *)  → 毎週月〜金 08:00 (JST)
# 週末停止:     cron(0 22 ? * FRI *)       → 毎週金曜 22:00 (JST)
# 週末起動:     cron(0 8  ? * MON *)       → 毎週月曜 08:00 (JST)

8. コスト最適化 KPI と目標設定

FinOps KPI 一覧

KPI 算出方法 目標値例 用途
Cost per Request 月次総コスト / 月次リクエスト数 < $0.001 API コスト効率
Cost per Active User 月次総コスト / MAU < $1.00 SaaS ユニットエコノミクス
RI/SP Coverage カバーされた使用量 / 総使用量 > 70% コミットメント活用率
Waste Ratio 無駄なコスト / 総コスト < 10% 効率性
Unit Cost Trend 今月のCost per Unit / 先月 < 1.0(改善) コスト効率の改善傾向
Forecast Accuracy |予測 - 実績| / 実績 × 100 < 15% 予算管理精度
Tagging Coverage タグ付きリソース / 全リソース × 100 > 95% 配賦精度

コスト削減ロードマップ例

[Month 1-2: Quick Win(即効性の高い施策)]
  □ 未使用リソース削除(孤立EBS/EIP/ALB)
  □ gp2 → gp3 移行(全EBSボリューム)
  □ CloudWatch Logs 保持期間設定
  □ 開発環境の夜間・週末自動停止
  期待削減額: 月次コストの 10〜15%

[Month 3-4: Right-Sizing(中期施策)]
  □ Compute Optimizer 推奨の適用(EC2/RDS/Lambda)
  □ Lambda メモリ最適化(Power Tuning 実施)
  □ S3 ライフサイクル設定
  □ NAT Gateway → VPC エンドポイント移行
  期待削減額: さらに 5〜10%

[Month 5-6: Commitment(長期施策)]
  □ Savings Plans 購入(Compute SP を最初に)
  □ RDS Reserved Instance 購入
  □ 高コストサービスのアーキ見直し
  期待削減額: さらに 15〜25%

9. コスト最適化クイックチェックリスト

[即日対応(無料・低リスク)]
□ AWS Budgets でコスト上限アラート設定
□ Cost Anomaly Detection を有効化
□ タグ戦略を定義し必須タグを既存リソースに付与
□ CloudWatch Logs の保持期間を全ロググループに設定
□ S3 パブリックアクセスブロック確認(誤公開による不正利用防止)

[1週間以内(低リスク)]
□ gp2 EBS ボリュームをすべて gp3 に変更
□ 孤立した EBS ボリューム / EIP を削除
□ 開発・検証環境の自動停止スクリプト適用
□ Compute Optimizer 推奨リストを確認してチケット化
□ S3 ライフサイクルポリシーを主要バケットに設定

[1ヶ月以内(中リスク・要テスト)]
□ EC2 / RDS の右サイズ化(本番に適用)
□ Spot Instance を可能な環境(バッチ/CI)に展開
□ NAT Gateway 経由トラフィックの S3/DynamoDB を VPC エンドポイントへ移行
□ Lambda メモリを Power Tuning で最適化
□ CloudFront キャッシュ設定を見直し(Cache-Control ヘッダー)

[四半期(長期・大きな変更)]
□ Savings Plans / RI の購入検討・実施
□ Aurora Serverless v2 への移行評価
□ マルチリージョン構成のデータ転送コスト見直し
□ アーキテクチャ全体のコスト構造レビュー
□ FinOps KPI の目標値更新と次期ロードマップ策定

10. よくある失敗パターンと対策

失敗パターン 問題 対策
タグなしでリソース作成 コスト配賦不能、無駄を特定できない SCP でタグなし作成を Deny
RI/SP を買いすぎる 使いきれず損失(未使用分は割引なし) まず 50% カバレッジから始め段階的に増やす
本番環境のスポット採用 中断時にサービス停止 ステートレスワーカーのみ Spot に、フロントは On-Demand
コスト最適化を後回し 運用フェーズで削減が困難 設計フェーズから Well-Architected のコスト最適化柱を考慮
クロスAZ転送を見落とす 隠れたネットワークコストが増大 VPC Flow Logs 分析でAZ間フローを特定
NAT Gateway 集中 AZ間転送コストが発生 AZごとに NAT を配置(AZ間転送コストと比較)
DynamoDB フルスキャン多用 スキャン課金で急増 GSI / LSI でアクセスパターンをカバー
CloudWatch メトリクス過剰カスタム カスタムメトリクス課金が予想外に高い 標準メトリクスで代替可能か検討