なぜ Cost Optimization Vol1 か — コスト最適化5層アーキテクチャ概観
AWSの月次コスト請求書を見て「なぜここまで費用がかかるのか」と困惑した経験はないでしょうか。クラウドのコスト管理はオンプレミス時代の固定費管理と根本的に異なります。従量課金モデル・数百種類のサービス・マルチアカウント構成・リザーブドキャパシティのコミットメント判断 — これらを統合的に把握・制御するには体系化されたフレームワークが不可欠です。
AWSが提供するコスト最適化ツールは強力ですが、個別のツールを点で使うだけでは真の最適化に届きません。Cost ExplorerでコストのWHYを可視化し、BudgetsでHOW MUCHを制御し、Savings PlansでIT支出をコミットして割引を確保し、Compute Optimizerでリソース単体のムダを検出し、Cost Anomaly Detectionで異常支出を早期に捉える — この5層が連携することで、FinOps実践の真の価値が引き出されます。
本記事では、AWSコスト最適化5層フレームワークを本番運用レベルで実装・運用するための実践知識を体系的に解説します。AWS CLIコマンド・boto3コード例・アーキテクチャ図を交えながら、手を動かしながら習得できる構成です。
AWS本番運用シリーズ Cost Optimization Vol1 — 5層コスト最適化ガイド
本記事ではAWSコスト最適化の本番運用を 5層フレームワーク で解説します。
| 層 | サービス | 本記事での主題 |
|—|—|—|
| 可視化層 | Cost Explorer | 分析ダッシュボード / フィルタ / 予測 / Right Sizing |
| 制御層 | Budgets | 予算タイプ / アラート / Budget Actions / 複数アカウント |
| 購入最適化層 | Savings Plans | Compute SP / EC2 SP / カバレッジ分析 / RI比較 |
| リソース最適化層 | Compute Optimizer | リソース推奨 / Enhanced Metrics / Graviton推奨 |
| 異常検知層 | Cost Anomaly Detection | ML異常検知 / モニター設定 / SNS連携 |
Cost Optimization本番運用シリーズはVol1(本記事)を起点に、FinOps実践と高度なコスト最適化を展開します。
FinOps 3サイクルと5層フレームワークの対応
クラウドコスト最適化の業界標準フレームワーク FinOps は、Inform(可視化)→ Optimize(最適化)→ Operate(運用) の3サイクルで継続的に実践されます。本記事の5層フレームワークはこのFinOpsサイクルと直接対応しています。
| FinOpsサイクル | 主活動 | 本記事の対応層 |
|---|---|---|
| Inform(可視化) | コストの可視化・配分・予測・異常検知 | Cost Explorer / Cost Anomaly Detection |
| Optimize(最適化) | リソース適正化・購入戦略の実行 | Savings Plans / Compute Optimizer |
| Operate(運用) | 予算制御・自動アクション・継続的改善 | Budgets + Budget Actions |
FinOpsの核心は「コスト情報を組織全体で共有し、責任の所在を明確にすること」です。Cost ExplorerによるInform(可視化)が全ての出発点となり、可視化なくして最適化は始まらず、最適化なくして継続的運用は成立しません。
AWSにおけるFinOps実践の3つの柱
FinOpsをAWS環境で実践するには、ツール・プロセス・組織文化の3つの柱が揃う必要があります。
- ツール(本記事の主題): Cost Explorer / Budgets / Savings Plans / Compute Optimizer / Cost Anomaly DetectionによるコストのInform→Optimize→Operateサイクルの技術基盤
- プロセス: 月次コストレビュー・Savings Plans購入サイクル・Right Sizing定期実施・異常検知対応フロー等の標準化されたオペレーション手順
- 組織文化: エンジニアがコストを意識する「FinOps文化」の醸成 — 個人/チームへのコスト配分・KPI設定・コスト最適化成果の可視化と共有
本記事はツール層の実装に集中しますが、プロセスと組織文化の整備なしにツールだけ導入しても継続的な効果は限定的です。ツール実装と並行して、週次コストレビューの場を設け、チーム内でコスト情報を共有する習慣を構築することを強く推奨します。
クラウドコスト最適化の現場課題
FinOps Foundationの調査によれば、クラウドコストの約30%が最適化可能な状態にあると言われています。本番環境でよく見られる課題と、5層フレームワークでの対処方針を整理します。
| 課題カテゴリ | 典型的な症状 | 5層フレームワークでの対処 |
|---|---|---|
| コスト不可視 | 「なぜ高い?」の原因特定に時間がかかる | Cost Explorer: フィルタ・グループ化による多次元分析 |
| 予算超過の発覚遅れ | 月末に予算オーバーが発覚する | Budgets: 多段階閾値アラート + Budget Actions自動制御 |
| コミットメント未活用 | On-Demand料金を払い続けている | Savings Plans: カバレッジ分析と段階的購入最適化 |
| 過剰スペックの放置 | 利用率20%以下のインスタンスが継続稼働 | Compute Optimizer: Right Sizing推奨の自動検出 |
| コスト異常への対応遅延 | 異常支出が請求確認まで気づかない | Cost Anomaly Detection: MLベースのリアルタイム検知 |
これらの課題は独立していません。例えば「コスト不可視(タグ未整備)」は「予算超過の発覚遅れ」にも「コミットメント未活用」にも連鎖します。5層フレームワークを基盤として整備することで、課題の連鎖を断ち切ることができます。
対象読者と前提知識
本記事は以下のロールを主な対象とします。
FinOps Engineer
- AWSの複数アカウント管理経験あり
- コスト削減施策を主導・設計したい
- Savings Plans / RIの購入額判断に迷っている
- コスト可視化・配分の仕組みをゼロから構築したい
Cloud Architect / Platform Engineer
- 新規サービス設計時のコスト見積もり精度を向上させたい
- Compute Optimizerの推奨をどこまで信頼するか判断したい
- 予算超過アラートを自動化してオペレーション負荷を削減したい
- マルチアカウント環境でのコスト配分ルールを整備したい
前提知識として、AWSマネジメントコンソールの基本操作とEC2・RDS・S3の基礎知識を想定しています。Savings Plans・RIの基本概念(コミットメント型割引)を理解していると、より深く読み進められます。
なお、コスト最適化の施策によっては権限が必要な場合があります。マネジメントアカウントへのアクセス権限(Cost Explorer・Budgets・Savings Plans管理)と、各リソースの変更権限(Compute Optimizerの推奨適用時)を事前に確認してから作業を開始してください。
本記事の読み方ガイド
本記事は §2〜§5を独立したリファレンスとして活用できる構成です。課題に応じて必要なセクションへジャンプしながら参照してください。
| 目的 | 推奨セクション |
|---|---|
| まずコスト可視化基盤を構築したい | §2(Cost Explorer) から着手 |
| 予算超過アラートを今すぐ設定したい | §3(Budgets + Budget Actions) へジャンプ |
| Savings Plans購入の判断基準を知りたい | §4(Savings Plans本番運用) へジャンプ |
| 過剰スペックリソースを自動検出したい | §5(Compute Optimizer) へジャンプ |
| 5層の全体像と典型的な失敗パターンを把握したい | 本記事を通読後、§6(詰まりポイント7選) へ |
各セクションではAWS CLIコマンド・boto3コード例・Mermaidアーキテクチャ図を組み合わせ、本番環境に直接適用できる実装ガイドとして構成しています。§6の詰まりポイント7選と§7のアンチパターン演習は、本番適用時のトラブルを事前に回避するための実践内容です。
コスト最適化成熟度モデルと本記事の位置付け
AWSのコスト最適化には段階的な成熟度があります。組織の現在地を把握し、次のステップに向けた優先施策を決定するための参考として、以下の成熟度モデルを示します。
| 成熟度レベル | 状態 | 典型的な特徴 | 次のステップ |
|---|---|---|---|
| レベル1: 認識 | コストの存在を認識 | 請求書を月次で確認する程度 | Cost Explorerを有効化・タグ付与開始 |
| レベル2: 可視化 | コストを可視化・分類 | サービス別・プロジェクト別のコストを把握 | Budgets設定・Cost配分タグ整備 |
| レベル3: 制御 | 予算と実績を管理 | 予算超過アラート・Right Sizing実施 | Savings Plans購入・Budget Actions自動化 |
| レベル4: 最適化 | 継続的な最適化サイクル | SP/RIカバレッジ80%以上・Compute Optimizer活用 | Cost Anomaly Detection・FinOps組織化 |
| レベル5: 高度化 | FinOps文化の定着 | コスト配分の完全自動化・部門別チャージバック | 組織横断FinOps実践・高度予測モデル |
本記事は レベル2〜4の達成を目的として設計されています。レベル1相当の組織でも、§2(Cost Explorer)から順に読み進めることでレベル4に到達できる実践内容を網羅しています。
5層フレームワークのサービス間連携
5層の各サービスは独立して機能しますが、連携させることで相乗効果が生まれます。特に重要な連携パターンを以下に示します。
Cost Explorer → Budgets: Cost Explorerの予測データをBudgetsのアラート閾値設計に活用。季節性を考慮した予測上限値を予算閾値として設定することで、誤報アラートを削減しながら実質的な予算超過を確実に検知できます。
Cost Explorer → Savings Plans: Cost ExplorerのSP推奨機能が、購入すべきSP種別・金額・期間の最適案を自動計算します。購入前に必ずSP推奨を確認し、推奨額の70〜80%から開始して段階的に追加購入するアプローチが安全策です。
Compute Optimizer → Cost Explorer: Compute OptimizerのRight Sizing推奨を実施後、Cost ExplorerのRight Sizing機能で削減効果を実績データとして確認します。推奨適用前後のコスト比較により、最適化効果を定量化できます。
Cost Anomaly Detection → Budgets: Cost Anomaly Detectionが検知したコスト異常はSNSで通知されます。Budget Actionsと組み合わせることで、異常検知時に自動的にコスト制御アクション(IAMポリシー適用・リソース停止等)を発動させる高度な自動化が実現できます。
これら5層の連携を設計段階から意識することで、個々のツールを点で使う状態から「統合されたコスト最適化基盤」へと進化させることができます。各セクションの実装手順を読み進めながら、自社環境での連携設計を検討してください。
AWS Cost Explorer 本番運用

%% Mermaid01: Cost Explorer 分析フロー
graph LR
CUR[Cost & Usage Report] --> CE[Cost Explorer]
CE --> Filter[フィルタ/グループ化]
Filter --> Analyze[分析/可視化]
Analyze --> Forecast[コスト予測]
Analyze --> RS[Right Sizing]
RS --> Action[最適化アクション]
Forecast --> Budget[Budgets連携]
Cost Explorer Right Sizing — 本番コスト削減の即効薬
Right Sizing推奨はEC2・RDSインスタンスの過去14日間のCPU/メモリ利用率を分析し、適正サイズを提案する機能。CloudWatch Agent連携でメモリメトリクスを取得すると推奨精度が大幅向上する。本番環境ではピーク時利用率70%を閾値に、段階的なダウンサイジングを実施するのが安全策。
分析ダッシュボード — コスト可視化の起点
Cost Explorerはマネジメントコンソールから直接アクセスできるコスト分析ツールです。初回有効化後24〜48時間でデータが反映され、過去12ヶ月分のコストデータを最大日次粒度で参照できます(月次/週次/日次切り替え可能)。有効化コストは無料ですが、API呼び出しは1,000リクエストあたり$0.01の課金が発生するため、Lambda等での自動取得設計では呼び出し頻度の最適化が必要です。
日次・月次コスト推移ビュー
日次コスト推移グラフは、コストスパイクの発生タイミングを特定するための基本ビューです。棒グラフ(積み上げ/グルーピング)と折れ線グラフを切り替えながら、サービス別・アカウント別の寄与を視覚的に確認できます。
典型的な分析手順は以下のとおりです。
- 「月次コスト推移」で前月比変化率の高いサービスを特定する
- 対象サービスを選択して「日次」粒度に切り替える
- スパイク発生日の前後でCloudTrailの操作ログと照合する
- 根本原因(新規リソース作成・想定外のデータ転送・APIコール増加等)を特定する
サービス別ビューとアカウント別ビュー
| ビュータイプ | 用途 | グループ化キー |
|---|---|---|
| サービス別 | どのAWSサービスがコスト主因かを把握 | Service |
| アカウント別 | マルチアカウント環境でのコスト配分確認 | Linked Account |
| リージョン別 | リージョン間のコスト偏りを検出 | Region |
| 使用タイプ別 | EC2インスタンスタイプや操作タイプを詳細分析 | Usage Type |
| 購入タイプ別 | On-Demand/Spot/SP/RIの割合を把握 | Purchase Type |
AWS Organizationsを使用したマルチアカウント環境では、管理アカウント(Management Account)からLinked Account別のコストを統合参照できます。各アカウントのコスト責任者に個別ビューを共有する際は、IAMポリシーでCost Explorerへのアクセスを制御します(ce:GetCostAndUsage アクションを該当アカウントに付与)。
カスタムビューの活用
Cost Explorerのカスタムビューを使用すると、繰り返し確認するフィルタ条件を保存して再利用できます(1アカウント最大50件)。本番環境で有効なカスタムビューの例を以下に示します。
- 本番環境コスト:
Environment=productionタグでフィルタし、開発・ステージングのコストを除外 - プロジェクト別コスト:
Project=<project-name>タグでフィルタし、チャージバックの根拠データとして活用 - EC2 On-Demand vs SP/RI: Purchase TypeでOn-Demand/Spot/Reserved/Savings Plans分類し、コミットメント活用率を確認
# Cost Explorerのサービス別月次コストデータ取得 (AWS CLI)
aws ce get-cost-and-usage \
--time-period Start=2026-05-01,End=2026-06-01 \
--granularity MONTHLY \
--metrics "BlendedCost" "UnblendedCost" "UsageQuantity" \
--group-by Type=DIMENSION,Key=SERVICE \
--query 'ResultsByTime[0].Groups[*].[Keys[0],Metrics.BlendedCost.Amount]' \
--output table
フィルタ・グループ化 — コストの多次元分析
Cost Explorerのフィルタとグループ化は、コスト分析の精度を左右する最重要機能です。複数の次元を組み合わせることで、コストの原因を高精度に絞り込めます。
主要フィルタ次元
| フィルタ次元 | 説明 | 活用場面 |
|---|---|---|
| Service | AWSサービス(EC2, S3, RDSなど) | サービス別コスト比較・突出コストの特定 |
| Linked Account | Organizations配下のアカウント | アカウント別コスト配分・チャージバック |
| Usage Type | 使用タイプ(BoxUsage:t3.medium等) | インスタンスタイプ・操作種別の詳細分析 |
| Tag | カスタムタグ(Environment, Project等) | コスト配分タグによる部門別・プロジェクト別分析 |
| Charge Type | 課金タイプ(Usage/Purchase/Tax等) | One-Time費用の除外・純利用コストの算出 |
| Region | AWSリージョン | リージョン別コスト配分・不要リージョンの検出 |
| Purchase Type | 購入タイプ(On-Demand/SP/Reserved/Spot) | コミットメント活用率の分析 |
| AZ | アベイラビリティーゾーン | AZ間のコスト偏りの検出 |
タグによるコスト配分
タグによるコスト配分は、Cost Explorerを最大限に活用するための前提条件です。AWSコンソールの「Cost Allocation Tags(コスト配分タグ)」でアクティベートしたタグのみが、Cost Explorerのフィルタ次元として使用可能になります。アクティベート後、反映まで24時間かかることに注意してください。
{
"Filter": {
"And": [
{
"Dimensions": {
"Key": "SERVICE",
"Values": ["Amazon Elastic Compute Cloud - Compute"]
}
},
{
"Tags": {
"Key": "Environment",
"Values": ["production"]
}
}
]
},
"Granularity": "MONTHLY",
"TimePeriod": {
"Start": "2026-05-01",
"End": "2026-06-01"
},
"Metrics": ["BlendedCost"],
"GroupBy": [
{"Type": "TAG", "Key": "Project"}
]
}
タグ未付与リソースは「No tag key」としてグルーピングされ、コスト配分の精度を低下させます。新規リソース作成時のタグ付与強制(AWS Config + SCP)は、Cost Explorerを有効活用するための必須施策です。具体的には、AWS Configのルールとして required-tags を設定し、必須タグ(Environment・Project・Owner等)が付与されていないリソースに対してSCPでアクション制限をかけるパターンが推奨されます。
コスト予測 — 12ヶ月先の支出計画
Cost Explorerのコスト予測機能は、過去のコストパターン(季節性・トレンド・異常値)を機械学習モデルで分析し、今後12ヶ月のコストを信頼区間付きで予測します。Budgetsと組み合わせることで、予測コストが予算上限に近づいた時点でアラートを発報する「予測ベースアラート」が実現できます。
予測精度と信頼区間
予測精度は過去データの蓄積量に大きく依存します。
| データ蓄積期間 | 予測精度 | 活用上の注意 |
|---|---|---|
| 3ヶ月未満 | 低(データ不足) | 予測値を計画の参考程度に留める |
| 3〜6ヶ月 | 中(トレンド把握可能) | 月次の大まかな傾向に活用 |
| 6〜12ヶ月 | 高(季節性も考慮) | 年次予算計画の根拠データとして活用 |
| 12ヶ月以上 | 非常に高(季節性精度向上) | 長期コミットメント購入の判断根拠に活用 |
信頼区間(80%信頼区間)は予測値の上下限を示します。上限値をBudgetsのアラート閾値設計に活用すると、「季節性の高いアクセス集中期」の予算オーバーを事前に検知できます。
季節性への対応
ECサイトや年度末処理など、季節性のあるワークロードでは、前年同期比でのコスト推移を参照することが重要です。Cost Explorerのカスタム期間設定を使用して前年同月と比較し、季節性によるコスト増加を「想定内」として予算に組み込む設計が推奨されます。
# コスト予測取得 — 今後6ヶ月の月次予測 (AWS CLI)
aws ce get-cost-forecast \
--time-period Start=2026-06-01,End=2026-12-01 \
--metric BLENDED_COST \
--granularity MONTHLY \
--query 'ForecastResultsByTime[*].[TimePeriod.Start,MeanValue,PredictionIntervalLowerBound,PredictionIntervalUpperBound]' \
--output table
APIによるプログラム予測取得
import boto3
from datetime import datetime, timedelta
ce = boto3.client('ce', region_name='us-east-1')
# 今後3ヶ月のコスト予測
today = datetime.today()
forecast_end = today + timedelta(days=90)
response = ce.get_cost_forecast(
TimePeriod={
'Start': today.strftime('%Y-%m-%d'),
'End': forecast_end.strftime('%Y-%m-%d')
},
Metric='BLENDED_COST',
Granularity='MONTHLY',
Filter={
'Dimensions': {
'Key': 'LINKED_ACCOUNT',
'Values': ['123456789012']
}
}
)
total = response['Total']
print(f"3ヶ月コスト予測合計: {float(total['Amount']):.2f} {total['Unit']}")
for month in response['ForecastResultsByTime']:
start = month['TimePeriod']['Start']
mean = float(month['MeanValue'])
lower = float(month['PredictionIntervalLowerBound'])
upper = float(month['PredictionIntervalUpperBound'])
print(f" {start}: 予測={mean:.2f} (下限={lower:.2f} 〜 上限={upper:.2f})")
Right Sizing推奨 — 過剰スペックリソースの自動検出
Cost Explorer Right Sizing推奨は、EC2・RDSインスタンスの過去14日間(デフォルト)または過去30・60日間の実際の利用率を分析し、ダウンサイジングまたは停止の推奨を提供します。月額数万〜数十万円規模の削減機会が自動的にリストアップされるため、本番環境で定期的に確認すべき最重要機能の一つです。
利用率閾値の設計
Right Sizing推奨では、CPU利用率・メモリ利用率(CloudWatch Agent連携時)・ネットワーク利用量を総合的に分析します。
| 利用率状況 | 推奨アクション | 本番適用の注意点 |
|---|---|---|
| CPU < 10%(全期間を通じて) | 停止または削除を検討 | 利用実態の再確認必須 |
| CPU < 40%(ピーク除く) | 1〜2サイズのダウンサイジング | スケールアウト構成か確認 |
| CPU 40〜70% | 現状維持(適切範囲) | — |
| CPU > 80%(継続的) | アップサイジングを検討 | スケールアウト先検討を先行 |
| メモリ > 90%(継続的) | メモリ最適化インスタンスへの変更 | CloudWatch Agent連携が前提 |
本番環境でのRight Sizing適用は、ピーク時利用率70%以上を安全マージンとして設定し、推奨のフィルタに活用します。一括適用は避け、ステージング環境でパフォーマンステストを実施してから段階的に本番適用することが鉄則です。
Graviton推奨
Cost Explorer Right SizingはGraviton(Arm64)インスタンスへの移行推奨も提供します。同等性能でコスト10〜20%削減が見込める場合、推奨リストに表示されます。
Graviton移行の主な考慮点は以下のとおりです。
- x86バイナリはGraviton(arm64)上でそのまま動作しないため、コンテナイメージのマルチアーキテクチャビルドが必要
- Amazon Linux 2023はGraviton最適化済みのため、新規構築時はGravitonを優先検討
- RDS Aurora はGraviton2対応(db.r6g・db.m6g系)でコスト削減効果が高い
- Java・Go・Python・Node.jsはGraviton上でも互換性が高く、移行リスクが低い
CloudWatch Agent連携による推奨精度の向上
デフォルトのRight Sizing推奨はCPU利用率のみを分析します。CloudWatch Agentをインストールしてメモリ利用率をCloudWatchに送信すると、メモリ制約のあるワークロードの推奨精度が大幅に向上します。Cost ExplorerのRight Sizing設定で「CloudWatch Agentメモリメトリクスを含める」を有効化します。
# Right Sizing推奨を取得 — 同一インスタンスファミリー内での推奨 (AWS CLI)
aws ce get-rightsizing-recommendation \
--service "AmazonEC2" \
--configuration \
'{"RecommendationTarget":"SAME_INSTANCE_FAMILY","BenefitsConsidered":true}' \
--query 'RightsizingRecommendations[*].{
ResourceId:CurrentInstance.ResourceId,
CurrentType:CurrentInstance.ResourceDetails.EC2ResourceDetails.InstanceType,
Action:RightsizingType,
TargetType:ModifyRecommendationDetail.TargetInstances[0].ResourceDetails.EC2ResourceDetails.InstanceType,
MonthlySavings:ModifyRecommendationDetail.TargetInstances[0].EstimatedMonthlySavings.Value}' \
--output table
カスタムレポート — 定期配信とCUR連携
Cost Explorerのカスタムレポートは、保存したビュー設定をベースに定期的なコスト報告を自動化し、ステークホルダーへの情報共有コストを削減します。
レポートの保存と共有
Cost Explorerで作成したビューは「保存済みレポート」として保存できます(1アカウント最大50件)。マネジメントコンソールから直接アクセスできるほか、IAMで制御されたメンバーアカウントへのアクセス共有も可能です。
スケジュール配信の自動化パターン
Cost Explorer単体のスケジュール配信機能は限定的です。本番環境では以下の組み合わせで定期レポートを自動化します。
- EventBridge + Lambda + Cost Explorer API: 毎週月曜日にLambdaが週次コストレポートを生成し、SES/SNSでメール送信する
- AWS Cost and Usage Report (CUR) + S3 + Athena: 詳細レポートをS3に自動出力し、AthenaでSQLクエリを実行してQuickSightで可視化する
- Budgets Reports(§3で詳説): 予算の週次/月次レポートをS3に自動配信する
Cost Explorer API活用
import boto3
ce = boto3.client('ce', region_name='us-east-1')
# タグ別・サービス別の月次コスト取得
response = ce.get_cost_and_usage(
TimePeriod={'Start': '2026-05-01', 'End': '2026-06-01'},
Granularity='MONTHLY',
Metrics=['BlendedCost', 'UsageQuantity'],
GroupBy=[
{'Type': 'DIMENSION', 'Key': 'SERVICE'},
{'Type': 'TAG', 'Key': 'Environment'}
],
Filter={
'Dimensions': {
'Key': 'RECORD_TYPE',
'Values': ['Usage']
}
}
)
# 上位5サービスのコストを出力
groups = response['ResultsByTime'][0]['Groups']
groups.sort(
key=lambda x: float(x['Metrics']['BlendedCost']['Amount']),
reverse=True
)
print("サービス別コスト Top5:")
for group in groups[:5]:
service = group['Keys'][0]
env = group['Keys'][1] if len(group['Keys']) > 1 else 'N/A'
cost = float(group['Metrics']['BlendedCost']['Amount'])
print(f" {service} [{env}]: ${cost:.2f}")
CUR(Cost and Usage Report)との使い分け
Cost ExplorerはサマリーレポートやUIベースの分析向け、CURは詳細分析・チャージバック・BI連携向けの使い分けが基本です。
| 機能 | Cost Explorer | CUR + Athena |
|---|---|---|
| 粒度 | 日次/月次 | 時間単位まで |
| 詳細度 | サービス/アカウント/タグ | リソースID・使用量単位 |
| 保持期間 | 過去12〜38ヶ月 | S3に無制限保存可 |
| コスト | 無料(API呼び出しは$0.01/1000件) | S3ストレージ + Athenaクエリ費用 |
| 活用場面 | 日常的なコスト確認・アラート設計 | 詳細チャージバック・BI連携・監査 |
本番環境では、Cost Explorerで日常的なコスト監視と傾向分析を行い、月次のチャージバックや部門別の詳細分析にCUR + Athenaを組み合わせるのが推奨パターンです。CURのデータはパーティション分割されたParquet形式で出力することで、Athenaのクエリコストを大幅に削減できます。
AWS Budgets 本番運用

AWS Budgets の予算タイプ — 5種類の使い分け
AWS Budgetsは5種類の予算タイプを提供しており、監視対象に応じて適切なタイプを選択することが本番運用の起点となる。
| 予算タイプ | 監視対象 | 代表的な用途 |
|---|---|---|
| コスト予算 | 月間/四半期コスト総額 | プロジェクト別・チーム別コスト管理 |
| 使用量予算 | EC2時間/S3容量/API呼び出し数 | サービス利用量の上限管理 |
| RI利用率予算 | Reserved Instancesの使用率 | RI稼働率監視・未使用RI早期検知 |
| SP利用率予算 | Savings Plansの適用率 | SP購入額の回収率モニタリング |
| SPカバレッジ予算 | On-Demand費用に対するSPカバレッジ率 | SP追加購入タイミングの判断 |
コスト予算の設計指針
本番環境でコスト予算を設計する際、予算期間は 月次固定 を基本とし、AWS Organizationsのタグ(CostCenter, Team, Environment等)でフィルタリングすることで、チームごとのコスト責任を明確化できる。予算名には環境・チーム・用途を含めた命名規則を徹底する(例: prod-api-team-monthly)。
{
"BudgetName": "prod-api-monthly-budget",
"BudgetLimit": {
"Amount": "50000",
"Unit": "USD"
},
"BudgetType": "COST",
"TimeUnit": "MONTHLY",
"CostFilters": {
"TagKeyValue": ["user:Environment$production", "user:Team$api"]
}
}
使用量予算 — EC2/S3個別監視
サービス単位の使用量予算はコスト予算との組み合わせが効果的。EC2インスタンス時間でスパイクを検知し、コスト予算でトータル影響を測定する2段階監視が本番推奨パターン。
aws budgets create-budget \
--account-id 123456789012 \
--budget '{
"BudgetName": "ec2-usage-hours-budget",
"BudgetLimit": {"Amount": "10000", "Unit": "Hours"},
"BudgetType": "USAGE",
"TimeUnit": "MONTHLY",
"CostFilters": {
"Service": ["Amazon Elastic Compute Cloud - Compute"]
}
}'
RI利用率・SPカバレッジ予算の活用
RI利用率予算は閾値を80%以上に設定することで、未使用RI(利用率低下=損失)を早期検知できる。SPカバレッジ予算は「このOn-Demand費用のうちSPで何%カバーできているか」を監視するため、SP追加購入の判断材料になる。RI利用率が3ヶ月連続で90%を超える場合はSP移行のシグナルとして捉えることができる。
アラート閾値設計 — 多段階通知の実装
単一閾値(100%のみ)では対応が遅れるため、本番環境では 4段階アラート が標準設計。各段階で通知先と対応アクションを明確に定義することで、コスト超過の早期対応体制を構築できる。
| アラート段階 | 閾値 | タイプ | 通知先 | 対応アクション |
|---|---|---|---|---|
| 警告 | 80%到達 | 実績(ACTUAL) | チームSlack/メール | コスト傾向確認・原因調査開始 |
| 危険 | 100%到達 | 実績(ACTUAL) | チームSlack+管理者メール | 不要リソース停止・Budget Actions起動検討 |
| 緊急 | 120%到達 | 実績(ACTUAL) | 管理者+CTO/経営層+PagerDuty | Budget Actions自動発動・緊急コスト削減対応 |
| 予測超過 | 100%超見込み | 予測(FORECASTED) | 管理者+経営層 | 追加予算申請または緊急コスト削減 |
予測ベースアラートの精度と活用
FORECASTEDアラートはCost Explorerの機械学習予測を活用するが、月初から8日以上経過しないと精度が安定しない特性がある。月初5日間はACTUALアラートのみを信頼し、FORECASTEDアラートは月中旬以降の判断指標として活用する運用設計が本番向け。予測が実績より先行して超過を示した場合は、コスト削減着手のシグナルとして活用できる。
{
"NotificationsWithSubscribers": [
{
"Notification": {
"NotificationType": "ACTUAL",
"ComparisonOperator": "GREATER_THAN",
"Threshold": 80,
"ThresholdType": "PERCENTAGE"
},
"Subscribers": [
{"SubscriptionType": "EMAIL", "Address": "team@example.com"},
{"SubscriptionType": "SNS",
"Address": "arn:aws:sns:ap-northeast-1:123456789012:cost-alert-warning"}
]
},
{
"Notification": {
"NotificationType": "ACTUAL",
"ComparisonOperator": "GREATER_THAN",
"Threshold": 100,
"ThresholdType": "PERCENTAGE"
},
"Subscribers": [
{"SubscriptionType": "SNS",
"Address": "arn:aws:sns:ap-northeast-1:123456789012:cost-alert-critical"}
]
},
{
"Notification": {
"NotificationType": "ACTUAL",
"ComparisonOperator": "GREATER_THAN",
"Threshold": 120,
"ThresholdType": "PERCENTAGE"
},
"Subscribers": [
{"SubscriptionType": "SNS",
"Address": "arn:aws:sns:ap-northeast-1:123456789012:cost-alert-emergency"},
{"SubscriptionType": "EMAIL", "Address": "cto@example.com"}
]
},
{
"Notification": {
"NotificationType": "FORECASTED",
"ComparisonOperator": "GREATER_THAN",
"Threshold": 100,
"ThresholdType": "PERCENTAGE"
},
"Subscribers": [
{"SubscriptionType": "EMAIL", "Address": "manager@example.com"}
]
}
]
}
AWS Chatbot統合 — Slack連携通知
SNSトピックをAWS Chatbotに連携することで、Slack/Amazon Chimeチャンネルへのリアルタイム通知を実現できる。Chatbotの通知メッセージにはコスト詳細とCost Explorerへのリンクが自動付与され、担当者が即座にコスト分析画面に遷移できる。
import boto3
def create_budget_with_sns_alert(
account_id: str,
budget_name: str,
amount: str,
sns_arn: str
) -> dict:
client = boto3.client('budgets', region_name='us-east-1')
return client.create_budget(
AccountId=account_id,
Budget={
'BudgetName': budget_name,
'BudgetLimit': {'Amount': amount, 'Unit': 'USD'},
'BudgetType': 'COST',
'TimeUnit': 'MONTHLY'
},
NotificationsWithSubscribers=[
{
'Notification': {
'NotificationType': 'ACTUAL',
'ComparisonOperator': 'GREATER_THAN',
'Threshold': 80,
'ThresholdType': 'PERCENTAGE',
'NotificationState': 'ALARM'
},
'Subscribers': [
{'SubscriptionType': 'SNS', 'Address': sns_arn}
]
}
]
)
Budget Actions — 自動コスト制御の実装
Budget Actions — コスト超過時の自動制御
Budget Actionsは予算閾値超過時にIAMポリシー適用(新規リソース作成制限)、SCP適用(OU単位制限)、EC2/RDS停止を自動実行する。承認ワークフローを組み合わせることで、本番環境への影響を制御しながらコスト暴走を防止できる。ただし本番EC2の自動停止はSLAリスクがあるため、開発環境限定での適用が推奨起点。
Budget Actionsは3種類のアクションタイプを提供しており、コスト超過の深刻度と対象環境に応じて組み合わせる設計が本番で有効。
| アクションタイプ | 効果範囲 | 推奨適用環境 | リスク |
|---|---|---|---|
| IAMポリシー適用 | 対象ユーザー/ロールの新規リソース作成を制限 | 全環境 | 低(既存リソースは影響なし) |
| SCP適用 | OU配下の全アカウントで操作制限 | 開発/検証OU | 中(広範囲に影響) |
| EC2/RDS停止 | 指定インスタンスの強制停止 | 開発環境のみ | 高(本番SLAリスク) |
IAMポリシーアクションの実装例
新規リソース作成を制限するIAMポリシーをBudget Actions用に事前作成し、予算超過時に自動適用する設計が最も安全な起点。ポリシーは事前にテスト環境で動作を確認してから本番の承認ワークフローに組み込む。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "BudgetActionDenyNewResources",
"Effect": "Deny",
"Action": [
"ec2:RunInstances",
"rds:CreateDBInstance",
"eks:CreateCluster",
"lambda:CreateFunction"
],
"Resource": "*"
}
]
}
Budget Actionsの作成(Python)
import boto3
def create_iam_policy_budget_action(
account_id: str,
budget_name: str,
iam_policy_arn: str,
execution_role_arn: str,
target_role_arns: list
) -> str:
client = boto3.client('budgets', region_name='us-east-1')
response = client.create_budget_action(
AccountId=account_id,
BudgetName=budget_name,
NotificationType='ACTUAL',
ActionType='APPLY_IAM_POLICY',
ActionThreshold={
'ActionThresholdValue': 100.0,
'ActionThresholdType': 'PERCENTAGE'
},
Definition={
'IamActionDefinition': {
'PolicyArn': iam_policy_arn,
'Users': [],
'Groups': [],
'Roles': target_role_arns
}
},
ExecutionRoleArn=execution_role_arn,
ApprovalModel='MANUAL',
Subscribers=[
{
'SubscriptionType': 'EMAIL',
'Address': 'admin@example.com'
}
]
)
return response['ActionId']
承認ワークフロー — 本番環境への安全弁
ApprovalModelにMANUALを指定することで、Actions発動前に管理者が承認コンソールで確認・実行するフローになる。自動実行(AUTOMATIC)は開発環境の非重要インスタンスに限定し、本番ではMANUALで運用することが事故防止の基本。Budget Actionsのロールバックも同じ承認フローで安全に操作できる。
複数アカウント統合 — Organizations連携
マルチアカウント構成でのBudgets管理はOrganizations構造を活用した3層設計が標準パターン。全社、OU単位、Linked Account個別という階層で予算を設定することで、コスト責任の可視化とアラート粒度を両立できる。
3層予算設計の概念図
Organizations Management Account
├── 全社予算: コスト予算 $500,000/月 (全Linked Account合算)
├── OU別予算
│├── Production OU: $300,000/月
│├── Development OU: $100,000/月
│└── Staging OU: $50,000/月
└── Linked Account個別予算
├── Account A (API Team): $80,000/月
├── Account B (Data Platform): $120,000/月
└── Account C (ML Platform): $60,000/月
Management AccountからのLinked Account予算作成
Organizations管理アカウントからLinked Accountのコストを対象とした予算を作成する場合、CostFiltersにLinkedAccountを指定する。管理アカウントはすべてのLinked AccountのBudgets設定を一元管理できるため、ガバナンス基盤として機能する。
aws budgets create-budget \
--account-id MANAGEMENT_ACCOUNT_ID \
--budget '{
"BudgetName": "linked-account-api-team",
"BudgetLimit": {"Amount": "80000", "Unit": "USD"},
"BudgetType": "COST",
"TimeUnit": "MONTHLY",
"CostFilters": {
"LinkedAccount": ["LINKED_ACCOUNT_ID"]
}
}'
コスト配分タグとBudgets連携
OrganizationsコンソールでCostCenter, Team, Project等のコスト配分タグを有効化すると、BudgetsのフィルタでタグベースのFine-Grainedな予算管理が可能になる。新規タグはActivateから集計反映まで最大24時間かかるため、月初より前に有効化しておくことが重要。タグ命名規則は全Organization共通で統一し、TerraformなどのIaCで強制適用するとガバナンスが維持しやすい。
import boto3
def activate_cost_allocation_tags(tag_keys: list) -> None:
client = boto3.client('ce', region_name='us-east-1')
client.update_cost_allocation_tags_status(
CostAllocationTagsStatus=[
{'TagKey': key, 'Status': 'Active'}
for key in tag_keys
]
)
Budget Reports — 定期レポート自動配信
Budget ReportsはS3への自動保存とメール配信で、週次・月次のコストレビューを自動化する機能。経営層向けのコスト報告をBudget Reportsで定型化すると、手動レポート作成工数を削減できる。Cost and Usage Report(CUR)と組み合わせることで、BIツールによる詳細分析基盤も構築できる。
| 設定項目 | 推奨値 | 補足 |
|---|---|---|
| 配信頻度 | DAILY/WEEKLY/MONTHLY | 目的別に使い分け |
| 対象予算 | 全社予算 + OU別予算 | Linked Account個別は週次 |
| S3パス | cost-reports/{year}/{month}/ | 年月別ディレクトリで管理 |
| 通知 | SNS連携メール | 配信完了をSlackに通知 |
aws cur put-report-definition \
--report-definition '{
"ReportName": "monthly-cost-report",
"TimeUnit": "MONTHLY",
"Format": "Parquet",
"Compression": "Parquet",
"AdditionalSchemaElements": ["RESOURCES"],
"S3Bucket": "cost-reports-bucket",
"S3Prefix": "cur-reports/",
"S3Region": "ap-northeast-1",
"ReportVersioning": "OVERWRITE_REPORT"
}'
Cost and Usage Report(CUR)はBudgetsの予算実績より詳細なリソースレベルのコストデータを提供する。AtenaやQuickSightと統合することで、プロジェクト別・リソース別の詳細コスト分析を経営ダッシュボードとして可視化できる。
Savings Plans 本番運用

Compute SP vs EC2 Instance SP — 本番での選択基準
Savings Plansには4種類あるが、本番環境で主に検討するのはCompute SPとEC2 Instance SPの2種類。選択基準はインフラの柔軟性要件で決まる。
| 項目 | Compute SP | EC2 Instance SP |
|---|---|---|
| 割引率(目安) | 最大66%(On-Demand比) | 最大72%(On-Demand比) |
| 適用範囲 | EC2全ファミリー/リージョン/OS + Fargate + Lambda | 特定リージョン + 特定ファミリー固定 |
| 柔軟性 | 高(インスタンスファミリー変更・リージョン移行に追随) | 低(購入後のインスタンスファミリー変更不可) |
| 推奨ケース | マルチリージョン・Fargate/Lambda混在環境 | 特定インスタンスが長期固定の環境 |
Compute SP が本番のデフォルト推奨な理由
Compute SPは割引率はEC2 Instance SPより若干低いが、インスタンスファミリー変更・リージョン変更・Fargate移行などに自動的に追随する。本番環境はインフラ構成変更が発生しやすいため、Compute SPで柔軟性を確保したうえで、長期固定が確実なワークロードのみEC2 Instance SPを追加購入するハイブリッド戦略が有効。
SageMaker SP — ML基盤の独立した最適化
SageMaker SPはSageMakerのトレーニング/推論インスタンスに特化したSavings Plans。EC2/FargateのCompute SPとは別枠で購入し、ML基盤のコストを独立して最適化できる。SageMaker利用額が月$10,000を超える場合は個別検討を推奨。
aws savingsplans describe-savings-plans \
--query 'savingsPlans[*].{Type:savingsPlanType,State:state,Commitment:commitment}'
Lambda SP — サーバーレス基盤向け
Lambda SPはComputeリクエストとDuration(GB-秒)に対して割引を提供。Compute SPはLambdaにも自動適用されるため、Lambdaのみ独立して購入するケースは稀。Fargate + Lambda混在環境ではCompute SPを主軸に、Lambda単独の高負荷ワークロードのみ個別検討する。
カバレッジ分析 — SP購入額の科学的決定
SP購入前のカバレッジ分析は、過剰コミットと過少コミットの両リスクを避けるために不可欠なステップ。Cost Explorerの推奨レポートをそのまま鵜呑みにせず、実態に合わせた調整が本番運用の要点。
SP Utilization Report — 購入済みSPの活用率把握
SP Utilization Reportは購入済みSavings Plansの利用率(Utilization Rate)を時系列で把握する。利用率が80%を下回る状態が継続する場合、購入額を超えた不要なコミットが発生していることを示す。
import boto3
def get_sp_utilization(start_date: str, end_date: str) -> dict:
client = boto3.client('ce', region_name='us-east-1')
response = client.get_savings_plans_utilization(
TimePeriod={
'Start': start_date,
'End': end_date
},
Granularity='MONTHLY'
)
utilization = response['Total']['Utilization']
print(f"SP利用率: {utilization['UtilizationPercentage']}%")
print(f"利用済みコミット: ${utilization['UsedCommitment']}")
print(f"未利用コミット: ${utilization['UnusedCommitment']}")
return response
SP Coverage Report — On-Demandコストに対するカバレッジ率
SP Coverage Reportは「SP適用可能なOn-Demand利用のうち、何%をSPでカバーできているか」を示す。カバレッジが低い場合はSP追加購入の余地があり、高い場合は追加購入でさらなる削減が見込める。
def get_sp_coverage(start_date: str, end_date: str) -> dict:
client = boto3.client('ce', region_name='us-east-1')
response = client.get_savings_plans_coverage(
TimePeriod={
'Start': start_date,
'End': end_date
},
Granularity='MONTHLY',
GroupBy=[
{'Type': 'DIMENSION', 'Key': 'LINKED_ACCOUNT'},
{'Type': 'DIMENSION', 'Key': 'SERVICE'}
]
)
return response
推奨購入額の計算手法
def calculate_recommended_sp_commitment(
average_ondemand_spend: float,
coverage_target: float = 0.70,
safety_margin: float = 0.85
) -> float:
raw_commitment = average_ondemand_spend * coverage_target
safe_commitment = raw_commitment * safety_margin
return round(safe_commitment, 2)
Savings Plans 購入戦略 — FinOpsの最重要決断
Savings Plans 購入戦略 — 本番FinOpsの最重要決断
Savings Plansの購入額を誤ると「過剰コミット(未利用分が無駄)」か「過少コミット(割引機会の損失)」が発生する。Cost Explorer のSP推奨を起点に、過去3ヶ月のOn-Demand利用額の60-70%をCompute SPで確保し、残り30-40%をOn-Demandで柔軟性を維持するのが本番推奨戦略。3ヶ月ごとにカバレッジを再評価し、段階的に追加購入する。
支払いオプション(Payment Option)の選択
| 支払いオプション | 割引率(目安) | 推奨ユースケース |
|---|---|---|
| All Upfront | 最大(前払い全額) | キャッシュフロー余裕あり・長期確定済み |
| Partial Upfront | 中程度 | 一般的な本番環境のバランス選択 |
| No Upfront | 最小 | キャッシュフロー制約・初期検討段階 |
本番環境では Partial Upfront 1年 が最もバランスの良い起点。All Upfront 3年は割引率は最大だが、インフラ変更リスクを3年間負うため、ワークロードが確実に固定化した後に検討する。
段階的購入戦略 — 四半期レビューサイクル
Month 1-3: On-Demand利用実績の収集・Cost Explorer推奨確認
Month 3: 第1回購入 — 推奨額の50%(保守的スタート)
Month 6: カバレッジ確認 → 利用率90%超なら追加購入
Month 9: 第2回購入 — カバレッジ75%目標に調整
Month 12:年次レビュー → 更新判断 / 3年プラン検討
aws savingsplans create-savings-plan \
--savings-plan-offering-id OFFERING_ID \
--commitment 1000.00 \
--payment-option PARTIAL_UPFRONT \
--purchase-time "2026-05-25T00:00:00Z"
import boto3
def purchase_savings_plan(
offering_id: str,
commitment: float,
payment_option: str = 'PARTIAL_UPFRONT'
) -> dict:
client = boto3.client('savingsplans', region_name='us-east-1')
response = client.create_savings_plan(
savingsPlanOfferingId=offering_id,
commitment=str(commitment),
paymentOption=payment_option,
tags={
'PurchasedBy': 'FinOps-Team',
'ReviewDate': '2026-08-25'
}
)
return response
SP vs RI — 判断基準と移行戦略
Savings PlansとReserved Instancesは目的が重なるため、既存のRI環境からSPへの移行戦略が本番運用の重要テーマとなる。
SP vs RI 比較表
| 項目 | Savings Plans | Reserved Instances |
|---|---|---|
| 柔軟性 | 高(ファミリー/OS変更可) | 低(コンバーティブルRIのみ変更可) |
| 適用範囲 | EC2/Fargate/Lambda | EC2/RDS/ElastiCache等サービス別 |
| 管理工数 | 低(自動適用) | 高(マーケットプレイス/更新管理が必要) |
| RDS最適化 | 不可 | 可(RDS RI) |
| Fargate対応 | 可(Compute SP) | 不可 |
RI→SP移行戦略 — 段階的切替
Phase 1: SPとRIの現状把握
- 既存RI一覧と有効期限を確認
- SP購入済みの場合はUtilization確認
Phase 2: RI有効期限ベースの切替計画
- 3-6ヶ月以内に期限切れのRIをリストアップ
- 期限切れRIをCompute SPで代替 (更新しない)
- 長期RI(1年以上残存)は満了まで維持
Phase 3: SP購入・移行実施
- RI満了タイミングでCompute SP追加購入
- RDS/ElastiCacheはRDS RI継続(SP非対応)
Phase 4: モニタリング
- SPカバレッジ率を四半期レビュー
- RDSはRI利用率を監視継続
コンバーティブルRIとの併用
コンバーティブルRIはインスタンスファミリー変更が可能なため、SPとの役割が一部重複する。EC2でコンバーティブルRIとSPを両方保有する場合、SPが優先適用されるため重複投資に注意。既存コンバーティブルRIはSP購入前に利用率を確認し、重複しないよう計画する。
Organizations統合 — SPプーリングと自動共有
Organizations管理アカウントでSavings Plansを購入すると、配下のLinked Account全体にSPが自動的に共有・プーリングされる。この仕組みにより、特定のLinked Accountの利用が低くても他のアカウントが吸収できるため、SPの利用率を組織全体で最大化できる。
SPプーリングの仕組み
Management Account購入: Compute SP $5,000/月コミット
↓ 自動プーリング
├── Account A (API): $2,000/月利用 → SP適用
├── Account B (Data): $1,500/月利用 → SP適用
├── Account C (ML): $1,000/月利用 → SP適用
└── 残り $500 → 未利用 (利用率90%)
アカウント別のSPカバレッジ確認
aws ce get-savings-plans-coverage \
--time-period '{"Start":"2026-05-01","End":"2026-05-31"}' \
--group-by '[{"Type":"DIMENSION","Key":"LINKED_ACCOUNT"}]'
Billing Conductor — SPコスト配分のカスタマイズ
AWS Billing Conductorを使うと、SPの割引をLinked Account間でカスタム配分できる。デフォルトではSPの割引恩恵が最も利用したアカウントに帰属するが、Billing Conductorで均等配分や比例配分が可能。マルチアカウントでコストチャージバックを行う組織で活用されるオプション。Billing ConductorはOrganizations管理アカウントで設定し、各アカウントの割引率・コスト配分ルールを一元管理できる。
Savings Plans 運用モニタリング — 継続的な最適化サイクル
SP購入後は購入して終わりではなく、定期的なモニタリングと調整が本番FinOpsの本質。四半期レビューサイクルで利用率・カバレッジを継続評価し、インフラ変化に追随した再購入判断が必要となる。
モニタリング指標と運用アクション
| 指標 | 目標値 | 要因と対処 |
|---|---|---|
| SP利用率(Utilization) | 85%以上 | 80%未満継続→マーケットプレイス売却または満了待ち検討 |
| SPカバレッジ(Coverage) | 65-75% | 60%未満→追加購入検討 / 80%超→過剰コミット兆候 |
| 未利用コミット金額 | $0に近づける | 不要なSPはAWSマーケットプレイスで売却可能(制限あり) |
| 月次削減額 | 前月比維持または増加 | SPレポートで削減額のトレンドを追跡 |
SPの満了・更新管理
import boto3
from datetime import datetime, timedelta
def check_expiring_savings_plans(days_threshold: int = 90) -> list:
client = boto3.client('savingsplans', region_name='us-east-1')
response = client.describe_savings_plans(
states=['active']
)
expiring = []
threshold_date = datetime.now() + timedelta(days=days_threshold)
for sp in response['savingsPlans']:
end_date = datetime.fromisoformat(sp['end'].replace('Z', '+00:00'))
end_date_naive = end_date.replace(tzinfo=None)
if end_date_naive <= threshold_date:
expiring.append({
'arn': sp['savingsPlanArn'],
'type': sp['savingsPlanType'],
'commitment': sp['commitment'],
'end_date': sp['end']
})
return expiring
コスト最適化の自動レポート基盤
import boto3
from datetime import date, timedelta
def generate_monthly_sp_report(account_id: str) -> dict:
ce = boto3.client('ce', region_name='us-east-1')
today = date.today()
start = today.replace(day=1).isoformat()
end = today.isoformat()
utilization = ce.get_savings_plans_utilization(
TimePeriod={'Start': start, 'End': end},
Granularity='MONTHLY'
)
coverage = ce.get_savings_plans_coverage(
TimePeriod={'Start': start, 'End': end},
Granularity='MONTHLY'
)
total = utilization.get('Total', {}).get('Utilization', {})
return {
'period': f"{start} to {end}",
'utilization_pct': total.get('UtilizationPercentage', 'N/A'),
'net_savings': total.get('NetSavings', 'N/A'),
'unused_commitment': total.get('UnusedCommitment', 'N/A')
}
Savings PlansとBudgetsを組み合わせたFinOpsサイクルは、Cost Explorer分析→SP購入→Budgets予算設定→モニタリング→四半期レビュー→追加購入という継続ループで成熟度を高めていく。FinOps成熟度の指標として、SPカバレッジ率65%以上・Budget Actionsの自動制御基盤整備・タグベースのコスト配分100%達成の3点を中期目標として設定するとよい。
Compute Optimizer + Cost Anomaly Detection 本番運用

%% Mermaid02: コスト最適化5層スタック相関マップ (§8まとめ用)
graph TB
subgraph Viz["可視化層"]
CE[Cost Explorer]
end
subgraph Ctrl["制御層"]
BG[Budgets + Actions]
end
subgraph Buy["購入最適化層"]
SP[Savings Plans]
end
subgraph Opt["リソース最適化層"]
CO[Compute Optimizer]
end
subgraph Det["異常検知層"]
CAD[Cost Anomaly Detection]
end
CUR[Cost & Usage Report] --> CE
CE -->|分析結果| BG
CE -->|SP推奨| SP
CE -->|Right Sizing| CO
CAD -->|異常通知| BG
CO -->|推奨適用| SP
BG -->|Actions| Lambda[Lambda/SCP]
CAD -->|SNS| Alert[アラート通知]
Cost Anomaly Detection — MLベースのコスト異常早期発見
Cost Anomaly Detectionは機械学習で過去のコストパターンを学習し、異常な支出増加を自動検知する。サービス単位・アカウント単位・コストカテゴリ単位でモニターを設定可能。検知閾値(ドル/パーセント)とSNS連携を組み合わせることで、深夜のコスト暴走を翌朝までに検知し対応開始できる。Root Cause分析で異常の原因サービス・リージョンまで特定される。
Compute Optimizer 対象リソースと推奨タイプ
Compute Optimizerは機械学習で過去14日間(デフォルト)または3ヶ月(Enhanced Metrics時)のメトリクスを分析し、リソース使用効率改善の推奨を提示する。対象リソースはEC2インスタンス・Auto Scalingグループ・EBSボリューム・Lambda関数・ECS on Fargateタスク・RDS(プレビュー)の6種類。
推奨タイプは主に3種類:
– Right Sizing: 現インスタンスタイプより低コストの同世代タイプへ変更。CPUとメモリの両使用率が低い場合に提示。
– Graviton移行: x86からGravitonプロセッサへ変更。同性能帯で最大20%コスト削減。C/M/Rファミリで適用可能。
– EBSボリュームタイプ変更: gp2→gp3移行が代表例。同IOPS/スループットをgp3の方が安価に実現できる場合に推奨。
推奨結果は「High / Medium / Low」の信頼度スコアと「Cost差額 / 月次コスト削減額」で表示される。削減金額が大きい推奨から着手すれば短期間で費用対効果を最大化できる。
Enhanced Infrastructure Metrics — メモリ推奨精度の向上
デフォルトのCompute Optimizerはメモリ使用率を取得しない。EC2エージェント(CloudWatch Agent)が未導入の環境では、CPUのみで推奨が算出されるためメモリ集約型ワークロードで過小スペック推奨が出る危険がある。
Enhanced Infrastructure Metricsを有効化すると、分析期間が14日→3ヶ月に延長され、CloudWatch Agentのメモリメトリクスも活用して推奨精度が向上する。有効化コストは1リソースあたり$0.0025/時間(東京リージョン)。本番環境では推奨の信頼性向上に対して十分小さいコスト。
# Enhanced Infrastructure Metrics を有効化
aws compute-optimizer update-enrollment-status \
--status Active \
--include-member-accounts
# Enhanced Metricsを有効化 (EC2)
aws compute-optimizer put-recommendation-preferences \
--resource-type Ec2Instance \
--scope name=AccountId,value=123456789012 \
--enhanced-infrastructure-metrics Active
Organizations統合 — 管理アカウントからの一括Opt-in
AWS Organizationsを利用している場合、管理アカウントから全メンバーアカウントをCompute Optimizerに一括Opt-inできる。各アカウントに個別で設定するより確実にカバレッジを確保できる。
# 管理アカウントから全メンバーアカウントを一括Opt-in
aws compute-optimizer update-enrollment-status \
--status Active \
--include-member-accounts
# 全アカウントの推奨サマリを管理アカウントから確認
aws compute-optimizer get-recommendation-summaries \
--account-ids ALL_ACCOUNTS
Opt-in後は推奨データが管理アカウントのCompute Optimizerコンソールに集約される。Linked Accountごとの削減ポテンシャルを一覧で確認し、対応優先度を決定できる。
API/CLI操作 — 推奨取得・エクスポート・S3出力
Compute OptimizerはAPIで推奨データを取得できる。定期実行スクリプトでSlackレポートやBI連携に活用可能。
# EC2インスタンス推奨取得
aws compute-optimizer get-ec2-instance-recommendations \
--account-ids 123456789012 \
--filters name=Finding,values=OVER_PROVISIONED \
--query 'instanceRecommendations[*].{Instance:instanceArn,CurrentType:currentInstanceType,RecommendedType:recommendationOptions[0].instanceType,MonthlySaving:recommendationOptions[0].estimatedMonthlySavings.value}' \
--output table
# 推奨データをS3にエクスポート (後続のBI分析用)
aws compute-optimizer export-ec2-instance-recommendations \
--s3-destination-config bucket=my-cost-optimization-bucket,keyPrefix=compute-optimizer/ \
--include-member-accounts \
--filters name=Finding,values=OVER_PROVISIONED
import boto3
import json
def get_overprovisioned_instances():
client = boto3.client('compute-optimizer', region_name='ap-northeast-1')
response = client.get_ec2_instance_recommendations(
filters=[{'name': 'Finding', 'values': ['OVER_PROVISIONED']}]
)
savings_list = []
for rec in response['instanceRecommendations']:
if rec['recommendationOptions']:
best_option = rec['recommendationOptions'][0]
savings_list.append({
'instance_arn': rec['instanceArn'],
'current_type': rec['currentInstanceType'],
'recommended_type': best_option['instanceType'],
'monthly_saving_usd': best_option.get('estimatedMonthlySavings', {}).get('value', 0),
'performance_risk': best_option.get('performanceRisk', 'N/A')
})
# 削減額の大きい順にソート
savings_list.sort(key=lambda x: x['monthly_saving_usd'], reverse=True)
return savings_list
if __name__ == '__main__':
recommendations = get_overprovisioned_instances()
total_saving = sum(r['monthly_saving_usd'] for r in recommendations)
print(f"過剰プロビジョニングインスタンス数: {len(recommendations)}")
print(f"月次削減ポテンシャル合計: ${total_saving:.2f}")
for r in recommendations[:10]:
print(f" {r['instance_arn'].split('/')[-1]}: {r['current_type']} → {r['recommended_type']} (${r['monthly_saving_usd']:.2f}/月)")
推奨レスポンス例(一部):
{
"instanceArn": "arn:aws:ec2:ap-northeast-1:123456789012:instance/i-0abc123def456",
"currentInstanceType": "m5.xlarge",
"finding": "OVER_PROVISIONED",
"recommendationOptions": [
{
"instanceType": "m6g.large",
"estimatedMonthlySavings": {
"currency": "USD",
"value": 45.23
},
"performanceRisk": 0.1,
"rank": 1
}
]
}
Cost Anomaly Detection — MLベース異常検知の仕組み
Cost Anomaly Detectionは教師なし機械学習で過去のコストパターン(季節性・週次変動・成長トレンド)を自動学習し、異常なコスト増加を検知する。固定閾値では検知できない「曜日依存のトラフィック増加に起因するコスト増」を正常パターンとして除外し、真の異常(誤設定・セキュリティインシデント・リソースリーク)のみをアラートする。
モニタータイプは4種類:
| タイプ | 監視対象 | 主な用途 |
|---|---|---|
| AWS Service | 特定AWSサービス全体 | EC2/S3等の急増検知 |
| Linked Account | 特定メンバーアカウント | マルチアカウント環境の各チーム監視 |
| Cost Category | コストカテゴリ単位 | 環境(prod/dev)別・部門別の予算管理 |
| Cost Allocation Tag | タグ値単位 | プロジェクト/アプリ単位の細粒度監視 |
モニター作成とアラート設定
# AWS Serviceモニターを作成 (EC2コストの異常を監視)
aws ce create-anomaly-monitor \
--anomaly-monitor '{
"MonitorName": "EC2-Cost-Monitor",
"MonitorType": "DIMENSIONAL",
"MonitorDimension": "SERVICE"
}'
# アラートサブスクリプション作成 (即時通知 / ドル閾値$100 / SNS連携)
aws ce create-anomaly-subscription \
--anomaly-subscription '{
"SubscriptionName": "EC2-Anomaly-Alert",
"MonitorArnList": ["arn:aws:ce::123456789012:anomalymonitor/ANOMALY_MONITOR_ARN"],
"Subscribers": [
{
"Address": "arn:aws:sns:ap-northeast-1:123456789012:cost-anomaly-alerts",
"Type": "SNS"
}
],
"Threshold": 100,
"Frequency": "IMMEDIATE"
}'
アラート設定の主要パラメータ:
– Threshold: 検知閾値。ドル絶対値またはパーセント変化率で指定。本番環境では$50〜$200が実用的。
– Frequency: IMMEDIATE(即時)・DAILY(日次ダイジェスト)・WEEKLY(週次ダイジェスト)から選択。
– Subscribers: SNS TopicまたはEメールアドレスを複数登録可能。
Root Cause分析 — 異常の原因特定
Cost Anomaly Detectionのアラート通知にはRoot Cause分析が含まれる。異常コストを引き起こしたサービス・アカウント・リージョン・使用タイプが自動特定される。
Root Cause分析の出力例:
{
"AnomalyId": "ANOMALY_123",
"AnomalyStartDate": "2025-10-15",
"DimensionValue": "Amazon EC2",
"RootCauses": [
{
"Service": "Amazon EC2",
"Region": "ap-northeast-1",
"LinkedAccount": "111122223333",
"UsageType": "APN1-BoxUsage:m5.4xlarge",
"Impact": {
"MaxImpact": 523.45,
"TotalActualSpend": 891.23,
"TotalExpectedSpend": 145.67
}
}
]
}
この情報があれば「どのアカウントの誰が何を誤って起動したか」を数分で特定できる。
SNS→Lambda自動対応パターン
Cost Anomaly DetectionとSNS・Lambdaを組み合わせることで、コスト異常の検知から自動対応まで無人で実行できる。
import boto3
import json
import os
def lambda_handler(event, context):
"""Cost Anomaly Detection → SNS → Lambda 自動対応"""
sns_message = json.loads(event['Records'][0]['Sns']['Message'])
anomaly_id = sns_message.get('anomalyId', '')
anomaly_score = float(sns_message.get('anomalyScore', {}).get('currentScore', 0))
total_impact = float(sns_message.get('impact', {}).get('totalImpact', 0))
ce_client = boto3.client('ce')
anomaly_detail = ce_client.get_anomalies(
AnomalyIds=[anomaly_id]
)
root_causes = anomaly_detail['Anomalies'][0].get('RootCauses', [])
affected_service = root_causes[0].get('Service', 'Unknown') if root_causes else 'Unknown'
affected_account = root_causes[0].get('LinkedAccount', 'Unknown') if root_causes else 'Unknown'
# 重大度判定: $500以上は緊急対応
if total_impact >= 500:
_send_pagerduty_alert(anomaly_id, total_impact, affected_service)
_create_jira_incident(anomaly_id, root_causes)
# Slackに詳細通知
_notify_slack(
f":rotating_light: コスト異常検知\n"
f"- 異常ID: {anomaly_id}\n"
f"- 影響額: ${total_impact:.2f}\n"
f"- 対象サービス: {affected_service}\n"
f"- アカウント: {affected_account}\n"
f"- 調査URL: https://console.aws.amazon.com/cost-management/home#/anomaly-detection"
)
return {'statusCode': 200, 'body': f'Processed anomaly {anomaly_id}'}
def _notify_slack(message):
import urllib.request
webhook_url = os.environ['SLACK_WEBHOOK_URL']
payload = json.dumps({'text': message}).encode('utf-8')
req = urllib.request.Request(webhook_url, data=payload,
headers={'Content-Type': 'application/json'})
resp = urllib.request.urlopen(req)
return resp.status
def _send_pagerduty_alert(anomaly_id, impact, service):
# PagerDuty連携 (重大コスト異常時)
pass
def _create_jira_incident(anomaly_id, root_causes):
# Jiraチケット自動作成 (調査トラッキング)
pass
# 過去の異常検知履歴を取得
aws ce get-anomalies \
--date-interval StartDate=2025-10-01,EndDate=2025-10-31 \
--max-results 20 \
--query 'Anomalies[*].{ID:AnomalyId,Start:AnomalyStartDate,Impact:Impact.TotalImpact,Service:RootCauses[0].Service}' \
--output table
Compute Optimizer × Cost Anomaly Detection — 運用統合の要点
– Compute Optimizer: 月次レビューサイクルで推奨一覧をS3エクスポート→削減額TOP10から優先着手。Graviton移行はステージング環境で事前検証必須。
– Enhanced Infrastructure Metrics: 本番環境全リソースで有効化推奨。メモリ推奨精度が大幅向上し過小スペック推奨事故を防げる。
– Cost Anomaly Detection: 全Linked AccountにService/Accountモニターを設定。閾値は初期$100、運用実績を見て調整。
– Root Cause分析: 異常検知→5分以内にアカウント・サービス・リージョンを特定できる体制を整備。SNS→Lambda→Slackのパイプラインで深夜の自動エスカレーション。
– 定期レビュー: 月次でCompute Optimizer推奨の採用率・Cost Anomaly Detectionの誤検知率を計測しチューニング。
詰まりポイント 7選 図解
詰まり① Cost Explorer予測精度低下 — タグ未付与・データ不足・季節性未考慮
症状: コスト予測グラフが実際支出から30%以上乖離し、月次予算レビューの信頼性が低下する。「予測内に収まるはずだった」という後追い説明が経営陣への報告で頻発する。
原因1 — コスト配分タグ未活性化
タグを付与してもAWS Billing Consoleの「コスト配分タグ」で明示的に活性化しなければ、Cost Explorerはそのタグをコスト集計に使用しない。未活性化のまま運用すると、プロジェクト別・環境別コストの分解ができず、予測モデルのインプットデータ粒度が「サービス全体」止まりになる。
# Inactive状態のタグキーを確認
aws ce list-cost-allocation-tags \
--status Inactive \
--query "CostAllocationTags[*].TagKey"
原因2 — 90日未満のデータ不足
Cost Explorerの予測モデルは過去3ヶ月(90日)以上の実績データを前提とする。新規アカウントまたはアーキテクチャ大規模変更直後は精度が著しく低下するため、90日間は予測値より実績重視の予算管理を行う。
原因3 — 季節性・スパイクパターンの未考慮
年末EC2増強・キャンペーン期のLambda大量実行・期末一括処理などは機械学習モデルが十分に学習できないパターンが存在する。季節性イベント前後は手動で月次予算に+20〜30%のバッファを設定する。
解決策チェックリスト
– Billing Console → コスト配分タグ → 主要タグ(Project / Environment / Owner / CostCenter / Application)を全活性化
– 90日データ蓄積前は予測値に±25%マージンを付けて予算策定
– 季節性イベント前後に手動で月次予算を調整
– Cost Explorerレポートを週次レビューに組み込み予測vs実績乖離を常時監視
詰まり② Budget Actionsの本番環境誤停止 — 承認ワークフロー未設定でSLA違反
症状: コスト予算の閾値超過をトリガーに本番EC2が自動停止され、サービスダウンが発生。Budget Actionsを設定したエンジニアがロールバック手順を把握していなかったため復旧に1時間かかる。
原因1 — 承認ワークフローなしの直接実行アクション
Budget Actionsには「手動承認あり」と「自動実行(承認なし)」の2種類がある。「自動実行」を本番環境Budgetに適用すると、深夜・週末にアクションが予期せず発動する。SREチームの関知なしに本番リソースが停止するシナリオが実現してしまう。
原因2 — アクション対象のリソース範囲が広すぎる
EC2停止アクションをフィルタなしで設定すると、タグ付けされた全EC2インスタンスが対象になる。開発・ステージング・本番が混在する環境では特に危険度が高い。
原因3 — ロールバック手順の未整備
Budget Actionsで適用されたIAMポリシー・SCPは自動解除されない。「元に戻す手順」がRunbookに存在しないと、復旧対応がアドホックになり長時間を要する。
解決策チェックリスト
– 本番環境BudgetのActionsは「承認ワークフローあり」を必須設定
– EC2停止アクションはEnvironment: devタグ付きリソース限定に絞る
– 本番環境はIAMポリシー適用(新規リソース作成制限のみ)に留める
– Runbookに「Budget Actions発動時の復旧手順」を記載 — IAMポリシーの手動デタッチ / EC2の手動起動 / Actionsのリセット手順を明記
– 発動時のSNS通知をオンコール担当に直接設定し夜間検知を確保
詰まり③ Savings Plans過剰コミット — 利用率低下とインスタンスファミリ変更で未利用SP発生
症状: 購入したSavings Plansの利用率が80%を下回り、未利用分が無駄なウェイストコストになっている。「SP未利用額: 月15万円」が継続するが購入済みコミットメントは変更不可で損失が確定している状態。
原因1 — 楽観的な利用率見積もりで過剰購入
「今後もこのペースで使い続けるだろう」という根拠のない楽観見積もりでSPを一括購入。その後、プロジェクト縮小・インスタンスタイプ変更・コスト削減施策により実際の利用額が大幅に減少し、SPの利用率が想定を大きく下回る。
原因2 — インスタンスファミリ変更による適用範囲外れ
EC2 Instance SP(特定インスタンスファミリに紐付く)を購入後にインスタンスファミリを変更すると、SPが適用されなくなる。例: c5→c6gへのGraviton移行時にc5向けEC2 Instance SPが宙に浮く。
原因3 — 購入額算出の粒度が粗い
On-Demand利用額の100%をSPでカバーしようとすると過剰コミットになる。SPは途中解約不可のコミットメントのため、利用変動バッファを残す必要がある。
解決策チェックリスト
– 購入目安: 過去3ヶ月のOn-Demand安定利用額の 60〜70% をCompute SPでカバー
– 残り30〜40%はOn-Demand維持で柔軟性を確保
– 毎四半期末にSPカバレッジレポートを確認し段階的追加購入を検討
– インスタンスファミリ変更前はEC2 Instance SP適用範囲を必ず確認
– Compute SP(EC2/Fargate/Lambdaに横断適用)を優先し、EC2 Instance SPは最小限に抑える
詰まり④ RI→SP移行時のカバレッジギャップ — 移行期間の二重払いと有効期限管理
症状: RI(Reserved Instance)からSavings Plansへの移行中、両方のコミットメントが重複し「二重払い」が発生。移行期間のコストが予算を超過し経営報告が困難になる。
原因1 — RI有効期限前のSP早期購入
RIの残存期間中にSPを追加購入すると、RI+SPの両コミットメントが同時稼働する。RI分はOn-Demand利用がなくてもコミットメント費用が発生し、その上にSPコミットメントが加算される二重払い構造になる。
原因2 — RI有効期限の一元管理なし
複数のRIを異なるタイミングで購入すると有効期限がバラバラになる。期限切れRIと新規SPが混在し、コスト計算が複雑化する。期限切れ直後はOn-Demand価格に跳ね上がるが気づかずに放置するケースも多い。
原因3 — RI vs SP の選択判断の誤り
特定インスタンスファミリを長期固定で使い続けるケース(DBサーバー等)では、Compute SP(最大66%割引)よりStandard RI(最大72%割引)の方が有利な場合がある。一律「全てSPに移行」という判断が最適解でないケースが存在する。
解決策チェックリスト
– RI有効期限の一覧を定期管理 — Cost Explorer → RI利用状況 → 購入済みRIで期限確認
– RI期限切れ 3ヶ月前 からSP購入計画を開始し、期限切れ後にSPが即適用されるよう準備
– RI期限切れまでSPを最小購入額に抑え、二重払い期間を最短化
– 長期固定インスタンスはRI vs SP の割引率を比較した上で判断する
詰まり⑤ Compute Optimizer推奨放置 — 月額数万円の無駄とGraviton移行未実施
症状: Compute Optimizerダッシュボードに「Recommended (Over-provisioned)」が50インスタンス以上ある状態が数ヶ月続く。推奨を確認しても誰も実施しない放置状態が常態化し、月額15万円規模の削減機会が消滅し続ける。
原因1 — 推奨の確認・承認フローが未整備
Compute Optimizerの推奨は自動適用されない。「誰がいつどのインスタンスを変更するか」の担当割り当てフローが存在しないため「見るだけ」で終わる。FinOps文化がないチームで特に顕著。
原因2 — Enhanced Infrastructure Metricsが未有効化
デフォルトでは14日間のCPU使用率のみを分析する。メモリ使用率が考慮されないため推奨精度が低く「本当に安全かわからない」という心理的ハードルが放置を生む。CloudWatch Agentのメモリメトリクスを有効化するだけで推奨精度が大幅向上するが、この有効化作業が後回しにされがち。
原因3 — Graviton移行への技術的不安
x86からGraviton(arm64)への移行には再コンパイル・依存ライブラリ確認・AMI変更が必要になる場合がある。「何か壊れるのでは」という不安から推奨が先延ばしされ、最大40%の料金削減機会が見送られ続ける。
解決策チェックリスト
– 月次FinOpsレビューでCompute Optimizer推奨の確認・担当割り当てを必須化
– Enhanced Infrastructure Metricsを全本番インスタンスで有効化($0.0025/インスタンス/時間)
– Graviton移行はまず ステートレスなEC2(Webサーバー/バッチ処理)から着手し、効果実証後に拡大
– 推奨適用後はCloudWatchでCPU使用率・アプリケーション応答時間を30日間モニタリング
詰まり⑥ Cost Anomaly Detection誤検知多発 — 閾値設定ミスとアラート疲れ
症状: Cost Anomaly DetectionのSNSアラートが毎日数件届き、チームがアラートを無視するようになる。本当のコスト異常が埋もれ、月末に「先月比+30%」が突然判明するアラート疲れ状態に陥る。
原因1 — 閾値が低すぎる
「$10を超えたら通知」という設定では、開発環境のEC2追加やリージョン展開テストなど日常的な変動でもアラートが上がる。ML異常検知の検出閾値と通知閾値の両方を適切に設定する必要がある。
原因2 — モニター粒度が粗い
アカウント全体で1つのモニターを設定すると、細かいサービス別異常が「総額では正常範囲」として見落とされる一方、正常な大型デプロイが「異常」として検知される矛盾が生じる。
原因3 — 通知先がチームメーリングリストのみ
全員に通知→全員が「誰かが対応するだろう」と判断→誰も対応しないという集合的無責任が発生する。オーナーシップが曖昧な状態ではアラートが機能しない。
解決策チェックリスト
– 通知閾値を 絶対額$100以上かつ前週比+20%以上 の複合条件に引き上げノイズを削減
– モニターをサービス別(EC2 / RDS / Lambda / S3 / Transfer)に分割し粒度を細かく設定
– 各サービスSNSサブスクリプションに担当エンジニアを個別設定しオーナーシップを明確化
– Cost Anomaly DetectionのRoot Cause分析を週次レビューで確認するルーティンを確立
詰まり⑦ タグ管理不備 — コスト配分タグ未活性化・命名規則不統一・未タグリソース放置
症状: Cost Explorerで「タグなし(No Tag)」のコストが全体の40%以上を占め、プロジェクト別・チーム別のコスト配分が不可能な状態。誰がどのリソースにいくら使っているか把握できず、FinOps推進が根本から詰まる。
原因1 — コスト配分タグ未活性化
詰まり①と同様、タグを付与してもBilling Consoleで活性化しなければ意味がない。新しいタグキーを追加するたびに活性化が必要だが、その手順がチームに浸透していないケースが多い。
原因2 — 命名規則の不統一
Project: WebApp / project: webapp / PROJECT: web-appのようにチームごとに命名が異なると、Cost Explorerのフィルタリングで全件取得ができない。大文字・小文字・ハイフン・スペースの揺らぎがコストデータの品質を破壊する。
原因3 — 未タグリソースの継続的な生成
IAMポリシーやSCP(Service Control Policy)でタグ付けを強制しない限り、開発者はタグなしでリソースを作成し続ける。特にCloudFormation外で手動作成されたリソースや、Lambdaから動的に作成されるリソースは未タグになりやすい。
解決策チェックリスト
– タグポリシー (AWS Organizations)で必須タグ(Project / Environment / Owner)を強制
– SCPでタグなし作成を拒否: ec2:CreateInstance等にaws:RequestTag/Project条件を追加
– 未タグリソース定期検出: Resource Groups Tagging APIで未タグリソースを月次スキャン
– Billing Consoleのコスト配分タグ活性化手順をRunbookに明記
– 月次タグ適合率レポートをLambdaで自動生成しタグ未付与率をKPIに設定
詰まりポイント7選を通じて、Cost Explorer / Budgets / Savings Plans / Compute Optimizer / Cost Anomaly Detectionの各サービスで本番運用に潜む落とし穴を解説しました。以下に7選の共通パターンと優先整備ガイドをまとめます。
詰まり7選 まとめ — 本番FinOps整備の優先順位ガイド
7つの詰まりポイントを俯瞰すると、共通する根本原因は「タグ管理基盤の欠如」「運用フロー未整備」「コミットメント戦略の誤り」「監視設計ミス」の4パターンに集約されます。
分類別 根本原因と最優先対策
| 分類 | 該当詰まり | 根本原因 | 最優先対策 |
|——|———–|———|———–|
| タグ管理基盤 | ①⑦ | コスト配分タグ未活性化・命名規則不統一 | Organizations タグポリシー + Billing活性化Runbook整備 |
| 運用フロー未整備 | ②⑤ | 承認ワークフロー未設定・推奨担当者未割当 | 月次FinOpsレビュー定例化 + 担当者明示 |
| コミットメント戦略誤り | ③④ | 過剰購入・RI/SP二重管理なし | 60-70% Compute SP段階購入 + RI期限3ヶ月前管理 |
| 監視設計ミス | ⑥ | 閾値低すぎ・モニター粒度粗い | 複合条件閾値 + サービス別モニター分割 |
整備優先順位 (投資対効果順)
1. 最優先: コスト配分タグ活性化 (詰まり①⑦) — 可視化の土台。追加コストなしで即実施可能。
2. 第2優先: Budget承認ワークフロー設定 (詰まり②) — 本番SLA違反防止。設定コスト最小。
3. 第3優先: Compute Optimizer Enhanced Metrics有効化 (詰まり⑤) — 月次削減額がダッシュボードに可視化。
4. 第4優先: Cost Anomaly Detectionの複合条件閾値設定 (詰まり⑥) — アラート疲れ解消。
5. 計画的整備: Savings Plans段階購入戦略の策定 (詰まり③④) — 四半期の定期FinOpsレビューで実施。
6. 継続整備: タグポリシー+SCP強制の導入 (詰まり⑦) — 中長期的なタグ適合率向上。
月次FinOpsレビュー 詰まり防止チェックリスト
– [ ] コスト配分タグ活性化状態の確認 — 新タグキー追加時に必ず実施 (詰まり①⑦)
– [ ] Budget Actions承認ワークフロー設定確認 — 本番環境は自動実行OFF確認 (詰まり②)
– [ ] Savings Plans利用率レポート確認 — 利用率80%未満なら追加購入停止 (詰まり③)
– [ ] RI有効期限一覧の確認 — 3ヶ月以内の期限切れをリストアップ (詰まり④)
– [ ] Compute Optimizer推奨の担当者割り当て — Over-provisioned Top10を明示 (詰まり⑤)
– [ ] Cost Anomaly Detectionアラート受信数確認 — 週5件超なら閾値見直し (詰まり⑥)
– [ ] 未タグリソース比率KPI確認 — 全体の10%以下を目標に (詰まり⑦)
アンチパターン → 正解パターン変換演習
問題1: 月末手動コストレポート → Cost Explorer API + Lambda自動レポート
アンチパターン: 毎月末に担当者がCost Explorerを手動確認しExcelにまとめて経営陣にメール送信。担当者の休暇中はレポートが遅延し、タイムリーなコスト把握ができない。
正解パターン: Lambda + Cost Explorer APIで月次コストレポートを自動生成。EventBridgeで毎月1日に自動実行し、SESでメール配信。
import boto3
from datetime import datetime
from dateutil.relativedelta import relativedelta
def lambda_handler(event, context):
ce = boto3.client('ce', region_name='us-east-1')
ses = boto3.client('ses', region_name='ap-northeast-1')
today = datetime.today()
start = (today.replace(day=1) - relativedelta(months=1)).strftime('%Y-%m-%d')
end = today.replace(day=1).strftime('%Y-%m-%d')
response = ce.get_cost_and_usage(
TimePeriod={'Start': start, 'End': end},
Granularity='MONTHLY',
Metrics=['BlendedCost'],
GroupBy=[
{'Type': 'DIMENSION', 'Key': 'SERVICE'},
{'Type': 'TAG', 'Key': 'Project'}
]
)
groups = response['ResultsByTime'][0]['Groups']
sorted_groups = sorted(
groups,
key=lambda x: float(x['Metrics']['BlendedCost']['Amount']),
reverse=True
)
lines = [f"=== 月次コストレポート {start[:7]} ==="]
for g in sorted_groups[:20]:
service = g['Keys'][0]
project = g['Keys'][1] if len(g['Keys']) > 1 else 'タグなし'
amount = float(g['Metrics']['BlendedCost']['Amount'])
lines.append(f" {service} / {project}: ${amount:,.2f}")
ses.send_email(
Source='aws-cost@example.com',
Destination={'ToAddresses': ['finops-team@example.com']},
Message={
'Subject': {'Data': f"月次AWSコストレポート {start[:7]}"},
'Body': {'Text': {'Data': '\n'.join(lines)}}
}
)
return {'statusCode': 200, 'items': len(lines)}
ポイント: GroupByでサービス×プロジェクトタグの二軸集計を実施し、コスト上位20件を自動ソートして配信する。EventBridge SchedulerルールでLambdaを毎月1日9:00に自動実行する。
問題2: Budget閾値一律100% → 多段階閾値 + Budget Actions段階制御
アンチパターン: 月次予算の100%超過時にのみメール通知。コスト超過が実際に起きてから気づくため月途中での制御が不可能。
正解パターン: 多段階閾値でエスカレーション。80%=早期警告メール、100%=Budget Actions(IAMポリシー適用)、120%=予測アラート(緊急エスカレーション)。
{
"BudgetName": "monthly-ec2-budget",
"BudgetLimit": {"Amount": "100000", "Unit": "USD"},
"TimeUnit": "MONTHLY",
"BudgetType": "COST",
"NotificationsWithSubscribers": [
{
"Notification": {
"NotificationType": "ACTUAL",
"ComparisonOperator": "GREATER_THAN",
"Threshold": 80,
"ThresholdType": "PERCENTAGE"
},
"Subscribers": [
{"SubscriptionType": "EMAIL", "Address": "finops-team@example.com"},
{"SubscriptionType": "SNS", "Address": "arn:aws:sns:ap-northeast-1:123456789012:cost-alert-warning"}
]
},
{
"Notification": {
"NotificationType": "ACTUAL",
"ComparisonOperator": "GREATER_THAN",
"Threshold": 100,
"ThresholdType": "PERCENTAGE"
},
"Subscribers": [
{"SubscriptionType": "SNS", "Address": "arn:aws:sns:ap-northeast-1:123456789012:cost-alert-critical"}
]
},
{
"Notification": {
"NotificationType": "FORECASTED",
"ComparisonOperator": "GREATER_THAN",
"Threshold": 120,
"ThresholdType": "PERCENTAGE"
},
"Subscribers": [
{"SubscriptionType": "SNS", "Address": "arn:aws:sns:ap-northeast-1:123456789012:cost-alert-emergency"}
]
}
]
}
ポイント: ACTUAL(実績)とFORECASTED(予測)の両方に閾値を設定。80%実績=早期警告、100%実績=Budget Actions発動のトリガー、120%予測=先手エスカレーション。Actions設定は別途CLIまたはCDKで追加する。
問題3: RI一括3年購入 → Savings Plans段階購入 + 四半期カバレッジ見直し
アンチパターン: 年間コスト削減を急いでEC2 Instance RI(3年All Upfront)を一括購入。翌月インスタンスファミリ変更でRIが無効化、数百万円のコミットメントが宙に浮く。
正解パターン: Compute SPを段階購入し、四半期ごとにカバレッジと利用率をCLIで確認して追加購入可否を判断する。
#!/usr/bin/env bash
# savings_plans_quarterly_review.sh — SP利用率・カバレッジ四半期確認
set -euo pipefail
START_DATE=$(python3 -c "
from datetime import date
from dateutil.relativedelta import relativedelta
print((date.today().replace(day=1) - relativedelta(months=3)).strftime('%Y-%m-%d'))
")
END_DATE=$(python3 -c "
from datetime import date
print(date.today().replace(day=1).strftime('%Y-%m-%d'))
")
echo "=== Savings Plans 利用率 ($START_DATE 〜 $END_DATE) ==="
aws ce get-savings-plans-utilization \
--time-period "Start=${START_DATE},End=${END_DATE}" \
--query 'Total.{利用率:Utilization.UtilizationPercentage,純節約額:Savings.NetSavings,未利用額:Savings.UnusedCommitment}' \
--output table
echo ""
echo "=== Savings Plans カバレッジ (月次) ==="
aws ce get-savings-plans-coverage \
--time-period "Start=${START_DATE},End=${END_DATE}" \
--granularity MONTHLY \
--query 'SavingsPlansCoverages[*].{月:TimePeriod.Start,カバレッジ率:Coverage.CoveragePercentage,OnDemand費用:Coverage.OnDemandCost}' \
--output table
echo ""
echo "=== SP購入推奨 (1年 NoUpfront) ==="
aws ce get-savings-plans-purchase-recommendation \
--savings-plans-type COMPUTE_SP \
--term-in-years ONE_YEAR \
--payment-option NO_UPFRONT \
--lookback-period-in-days THIRTY_DAYS \
--query 'Recommendations[0].{推奨月額:RecommendedSPStandard,予測ROI:EstimatedROI}' \
--output table 2>/dev/null || echo "推奨データなし"
ポイント: 利用率80%未満はSP追加購入を一時停止するシグナル。利用率90%超なら追加購入余地あり。このスクリプトを四半期末に実行し段階的なSP拡張判断の根拠データとして使う。
問題4: 全インスタンスそのまま → Compute Optimizer推奨 + Graviton移行
アンチパターン: Compute Optimizerの「Over-provisioned」推奨を3ヶ月放置。50インスタンスで月額15万円の削減機会を継続して見逃す。
正解パターン: Compute Optimizer推奨をAPI取得し、ダウンサイジング候補・Graviton移行候補を自動リスト化して月次FinOpsレビューに提出する。
#!/usr/bin/env bash
# compute_optimizer_report.sh — ダウンサイジング・Graviton移行候補レポート
set -euo pipefail
echo "=== Over-provisioned EC2 インスタンス + 推奨タイプ ==="
aws compute-optimizer get-ec2-instance-recommendations \
--query 'instanceRecommendations[?finding==`OVER_PROVISIONED`].{
InstanceId:instanceArn,
現在タイプ:currentInstanceType,
推奨タイプ:recommendationOptions[0].instanceType,
推定月次節約USD:recommendationOptions[0].estimatedMonthlySavings.value
}' \
--output table 2>/dev/null || echo "注意: Compute Optimizerが未有効化の可能性があります"
echo ""
echo "=== Graviton移行候補 (推奨タイプに g 含む) ==="
aws compute-optimizer get-ec2-instance-recommendations \
--query "instanceRecommendations[?
contains(recommendationOptions[0].instanceType, 'g')
].{
InstanceId:instanceArn,
現在タイプ:currentInstanceType,
推奨Gravitonタイプ:recommendationOptions[0].instanceType,
推定月次節約:recommendationOptions[0].estimatedMonthlySavings.value
}" \
--output table 2>/dev/null || echo "Graviton移行候補なし"
echo ""
echo "=== Enhanced Infrastructure Metrics 有効化状態 ==="
aws compute-optimizer get-enrollment-statuses \
--query 'accountEnrollmentStatuses[].{アカウントID:accountId,状態:status}' \
--output table
ポイント: Over-provisioned推奨とGraviton移行候補を分離してリスト化。推定月次節約の合計が月次削減可能額の目安。Enhanced Metricsが未有効化の場合は先に有効化してから推奨を再評価する。
問題5: コスト異常手動監視 → Cost Anomaly Detection + SNS + Lambda自動通知
アンチパターン: 担当者が週次でCost Explorerを手動確認するだけでコスト異常を監視。深夜のEC2暴走が1週間検出されず、月次コストが前月比+150%になってから発覚。
正解パターン: Cost Anomaly Detectionでサービス別モニターを設定し、閾値超過時にSNS → Lambda → Slack自動通知。
{
"AnomalyMonitor": {
"MonitorName": "service-anomaly-monitor",
"MonitorType": "DIMENSIONAL",
"MonitorDimension": "SERVICE"
},
"AnomalySubscription": {
"SubscriptionName": "production-anomaly-alert",
"Threshold": 0,
"ThresholdExpression": {
"And": [
{
"Dimensions": {
"Key": "ANOMALY_TOTAL_IMPACT_ABSOLUTE",
"Values": ["100"],
"MatchOptions": ["GREATER_THAN_OR_EQUAL"]
}
},
{
"Dimensions": {
"Key": "ANOMALY_TOTAL_IMPACT_PERCENTAGE",
"Values": ["20"],
"MatchOptions": ["GREATER_THAN_OR_EQUAL"]
}
}
]
},
"Subscribers": [
{
"Address": "arn:aws:sns:ap-northeast-1:123456789012:cost-anomaly-production",
"Type": "SNS"
}
],
"Frequency": "DAILY"
}
}
Lambda関数でSNS受信 → Slackへ転送:
import json
import urllib.request
def lambda_handler(event, context):
message = json.loads(event['Records'][0]['Sns']['Message'])
anomaly = message.get('anomalyDetails', {})
impact = anomaly.get('impact', {})
root_causes = anomaly.get('rootCauses', [{}])
slack_text = (
f":money_with_wings: *コスト異常検知*\n"
f"サービス: {root_causes[0].get('service', '不明')}\n"
f"影響額: ${float(impact.get('totalActualSpend', 0)):,.2f}\n"
f"前週比: {float(impact.get('totalImpactPercentage', 0)):.1f}%増加\n"
f"確認: https://console.aws.amazon.com/cost-management/home"
)
req = urllib.request.Request(
'https://hooks.slack.com/services/YOUR_WEBHOOK_TOKEN',
data=json.dumps({"text": slack_text}).encode(),
headers={'Content-Type': 'application/json'}
)
urllib.request.urlopen(req)
return {'statusCode': 200}
ポイント: ThresholdExpressionで「絶対額$100以上 かつ 前週比20%以上」の複合条件を設定し誤検知を削減。サービス別モニターで異常の根本原因サービスを自動特定。Lambdaに渡されるSNSメッセージ内のrootCauses配列で異常サービスをSlack通知に含める。
まとめ — Cost Optimization Vol1 起点 × 56記事化達成
本記事ではAWSコスト最適化を 5層フレームワーク として体系化し、Cost Explorer(可視化)・Budgets+Budget Actions(制御)・Savings Plans(購入最適化)・Compute Optimizer(リソース最適化)・Cost Anomaly Detection(異常検知)の本番運用ノウハウを解説しました。
単一サービスの使い方を知っているだけでは本番コスト管理は機能しません。5層を統合的に運用してはじめて「コスト可視化 → 予算制御 → コミットメント最適化 → リソース最適化 → 異常の早期発見」というFinOpsサイクルが回ります。
各層の最重要ポイント振り返り
| 層 | 最重要ポイント | 本番で効く理由 |
|---|---|---|
| 可視化層 (Cost Explorer) | コスト配分タグの活性化 | タグなしではプロジェクト別分析が不可能 |
| 制御層 (Budgets) | 多段階閾値 + 承認ワークフロー | 本番停止SLA違反を防ぎながらコスト制御 |
| 購入最適化層 (Savings Plans) | 60-70%カバレッジ + 段階購入 | 過剰コミットリスクを排除しながら割引享受 |
| リソース最適化層 (Compute Optimizer) | Enhanced Metrics有効化 + Graviton段階移行 | データ精度を上げて推奨の信頼性を担保 |
| 異常検知層 (Cost Anomaly Detection) | 複合条件閾値 + サービス別モニター | 誤検知を減らしアラート疲れを防ぐ |
§6で学んだ詰まりポイント7選の要点
本記事で解説した詰まりポイントは、実際の本番運用で発生頻度が高いものを厳選しています。特に重要なのは以下の3点です。
タグ管理の基盤整備が最優先: 詰まり①と⑦は同根の問題です。コスト配分タグを活性化し命名規則を統一することが、Cost Explorer精度向上の前提条件になります。タグなしでは「どのプロジェクトがいくら使っているか」が分からず、コスト削減の責任者を特定できません。
Budget Actionsは本番と開発を必ず分離: 詰まり②は承認ワークフローの有無だけで本番SLA違反を防げます。自動実行アクションは開発環境限定、本番環境は承認ワークフローありが絶対ルールです。
Compute Optimizer推奨に「誰が実施するか」を決める: 詰まり⑤の本質は技術ではなく運用フローの欠如です。月次FinOpsレビューで推奨を確認し担当者を割り当てるだけで、月額数万円の削減が実現します。
§7で学んだアンチパターン変換の要点
5つの演習問題を通じて、手動運用から自動化への変換パターンを習得しました。共通するテーマは「繰り返し作業をEventBridge + Lambdaで自動化し、人間は例外処理と意思決定に集中する」という設計思想です。Cost Explorer APIの活用とCost Anomaly Detection + SNS + Lambdaの組み合わせが、FinOps自動化の核心になります。
FinOps実践への接続
本記事で解説した5層フレームワークは、FinOps Foundation のコアサイクル「Inform(情報収集) → Optimize(最適化) → Operate(運用)」に対応しています。
| FinOpsフェーズ | 担当サービス | 実施頻度 | 主要アクション |
|---|---|---|---|
| Inform (情報収集) | Cost Explorer / Cost Anomaly Detection | 週次 | コスト異常確認・タグ適合率チェック |
| Optimize (最適化) | Budgets / Compute Optimizer | 月次 | Right Sizing実施・Budget閾値見直し |
| Operate (運用) | Budget Actions / Savings Plans見直し | 四半期 | SPカバレッジ再評価・追加購入判断 |
月次FinOpsレビューにこの5層の状態確認を組み込むことで、継続的なコスト改善サイクルを自組織に定着させることができます。Cost Optimization本番運用シリーズのVol2では、Reserved Instances・Spot Fleet・Graviton移行・Right Sizing・Pricing Calculatorによる実行層を詳説しています。
AWS本番運用シリーズ Cost Optimization Vol1 — 5層フレームワークの起点
本記事でAWS本番運用シリーズに Cost Optimization軸(第23軸目) が加わりました。Cost Explorer・Budgets・Savings Plans・Compute Optimizer・Cost Anomaly Detectionの5サービスを統合したコスト最適化フレームワークの本番運用知識体系を構築しました。
5層 × 本記事で習得した本番運用スキル
| 層 | サービス | 本記事で習得した本番運用スキル |
|—|—|—|
| 可視化層 | Cost Explorer | 分析ダッシュボード / コスト予測 / Right Sizing推奨 / カスタムレポートAPI |
| 制御層 | Budgets | 多段階アラート設計 / Budget Actions / 承認ワークフロー / Organizations統合 |
| 購入最適化層 | Savings Plans | Compute SP / EC2 Instance SP比較 / カバレッジ分析 / 段階購入戦略 |
| リソース最適化層 | Compute Optimizer | EC2/Lambda/ECSリソース推奨 / Enhanced Metrics / Graviton移行パス |
| 異常検知層 | Cost Anomaly Detection | MLモニター設定 / 複合条件閾値 / Root Cause分析 / SNS/Lambda連携 |
FinOpsサイクルとの対応
| FinOpsフェーズ | 担当サービス | 実施頻度 | 主要KPI |
|—|—|—|—|
| Inform (情報収集) | Cost Explorer / Cost Anomaly Detection | 週次 | コスト前週比変化率 |
| Optimize (最適化) | Budgets / Compute Optimizer | 月次 | Right Sizing削減額 |
| Operate (運用) | Budget Actions / Savings Plans見直し | 四半期 | SPカバレッジ率 |
Cost Optimizationシリーズ 今後の展開
– Vol2 (公開済): Reserved Instances × Spot Fleet × Graviton移行 × Right Sizing × Pricing Calculator
– Vol3 (予定): AWS Organizations統合コスト管理 + マルチアカウントFinOps基盤
– Vol4 (予定): Cost Intelligence Dashboard + QuickSight FinOps分析基盤構築
本記事を起点に、FinOps Engineerとして組織のAWSコスト最適化を体系的に推進する力が身につきます。5層フレームワークの各層を理解した上で月次FinOpsレビューに組み込むことで、コスト削減の継続的改善サイクルが自組織に定着します。
FinOps Engineer 実践スキル習得チェックリスト
本シリーズVol1で習得した実践スキルを確認し、Vol2以降の学習計画に活用してください。
– [ ] Cost Explorerでコスト配分タグを活性化し、プロジェクト別・環境別コストを可視化できる
– [ ] Budgetsで多段階閾値(80%/100%/120%予測)と承認ワークフローを設計できる
– [ ] Budget ActionsのIAMポリシー適用を本番環境に安全に展開するRunbookを作成できる
– [ ] Compute SPとEC2 Instance SPの違いを説明し、組織の利用パターンに合った購入戦略を選択できる
– [ ] Savings Plans利用率・カバレッジレポートを解釈し、追加購入判断の根拠データを提示できる
– [ ] Compute OptimizerのEnhanced Infrastructure Metricsを有効化し、推奨精度を向上させられる
– [ ] Cost Anomaly Detectionでサービス別モニターと複合条件閾値を設定し、誤検知を最小化できる
– [ ] 月次FinOpsレビューの議題を設計し、5層フレームワークの状態確認を定例化できる
学習ロードマップ
| フェーズ | 対象シリーズ | 習得内容 |
|———|————|——–|
| Vol1 (本記事) | Cost Optimization Vol1 | 5層フレームワーク基盤 / コスト可視化・制御・購入最適化 |
| Vol2 (公開済) | Cost Optimization Vol2 | RI購入戦略 / Spot Fleet / Graviton移行 / Right Sizing実行 |
| Vol3 (予定) | Cost Optimization Vol3 | Organizations統合 / マルチアカウントFinOps基盤 |
| Vol4 (予定) | Cost Optimization Vol4 | Cost Intelligence Dashboard / QuickSight FinOps分析 |
56記事化達成 — AWS本番運用シリーズ全23軸 完全ラインナップ
本記事の公開でAWS本番運用シリーズは 56記事 に到達しました。第23軸目としてCost Optimizationが加わり、AWSの主要本番運用領域を網羅するシリーズが完成しました。
全23軸ラインナップ
1. EC2 / Auto Scaling — インスタンス設計・スケーリング戦略・AMI管理・起動テンプレート
2. VPC / Networking — サブネット設計・ルーティング・NAT最適化・VPC Endpoints
3. IAM / Security — 最小権限設計・ロール管理・SCP活用・認証情報ローテーション
4. RDS / Aurora — 高可用性構成・フェイルオーバー・パフォーマンス最適化・Aurora Serverless
5. S3 基盤 — バケット設計・ライフサイクル・レプリケーション・S3 Intelligent-Tiering
6. Storage (Vol1-3) — EBS/EFS/FSx本番運用・バックアップ設計・ストレージ最適化
7. Lambda / Serverless — コールドスタート対策・並列実行設計・エラーハンドリング・SnapStart
8. ECS / Fargate — コンテナ基盤設計・サービスメッシュ・デプロイ戦略・Fargate Spot
9. CloudWatch / Observability — メトリクス設計・ログ集約・アラート体系・Container Insights
10. CloudFormation / IaC — スタック設計・変更セット・ドリフト検出・StackSets
11. DynamoDB — データモデル設計・キャパシティ計画・GSI活用・DynamoDB Accelerator
12. ElastiCache — Redis/Memcached本番設計・クラスターモード・フェイルオーバー
13. API Gateway — REST/HTTP API設計・レート制限・Lambda統合・WebSocket API
14. Step Functions — ワークフロー設計・エラーハンドリング・Distributed Map・Express Workflow
15. EventBridge — イベント駆動アーキテクチャ・ルール設計・Cross-Account統合・Pipes
16. SNS / SQS — 非同期メッセージング設計・DLQ・FIFO活用・SNS Fanout
17. Route 53 / DNS — ヘルスチェック設計・フェイルオーバー・プライベートDNS・Route 53 Resolver
18. CloudFront / CDN — キャッシュ戦略・Lambda@Edge・WAF統合・CloudFront Functions
19. EKS / Kubernetes — クラスター設計・ノードグループ・Karpenter・コスト最適化
20. Network (Vol1-3) — Transit Gateway・Direct Connect・VPN本番運用・PrivateLink
21. Backup / DR — バックアップポリシー設計・RPO/RTO実現・クロスリージョンDR
22. Data Analytics (Vol1-2) — Athena/Glue/Redshift/Kinesis/MSK/QuickSight/EMR本番基盤
23. Cost Optimization (本記事 = Vol1起点) ← NEW — 5層フレームワーク本番運用
全23軸を体系的に習得することで、AWSで本番システムを設計・構築・運用するための包括的なエンジニアリング力が身につきます。各軸の記事は独立して参照可能ですが、軸間のクロスリンクを辿ることでAWSアーキテクチャの全体像を体系的に理解できる設計になっています。
カテゴリ別 記事構成
| カテゴリ | 対象軸 | 代表サービス |
|———|——-|———–|
| コンピューティング | 第①⑦⑧⑲軸 | EC2 / Lambda / ECS / EKS |
| ネットワーク・セキュリティ | 第②③⑰⑱⑳軸 | VPC / IAM / Route 53 / CloudFront / Network |
| データベース・ストレージ | 第④⑤⑥⑪⑫軸 | RDS / S3 / Storage / DynamoDB / ElastiCache |
| アプリケーション統合 | 第⑬⑭⑮⑯軸 | API GW / Step Functions / EventBridge / SNS・SQS |
| 監視・IaC・DR | 第⑨⑩㉑軸 | CloudWatch / CloudFormation / Backup・DR |
| データ分析・コスト最適化 | 第㉒㉓軸 | Data Analytics / Cost Optimization (本記事) |
AWS本番運用シリーズ ご活用ガイド
– 初学者: まずEC2(①)・VPC(②)・IAM(③)の基礎3軸を習得し、Lambda(⑦)・CloudWatch(⑨)に進む
– 中級者: 担当するサービスの軸を優先参照し、クロスリンクで関連軸に展開する
– 上級者: 全23軸を俯瞰し、組織のAWSアーキテクチャのギャップ分析に活用する
– FinOpsエンジニア: Cost Optimization(㉓)を起点にEKS(⑲)・Lambda(⑦)・Data Analytics(㉒)のコスト最適化まで体系的に学習する
%% Mermaid02: コスト最適化5層スタック相関マップ
graph TB
subgraph Viz["可視化層 — Cost Explorer"]
CE[Cost Explorer\nダッシュボード・予測・Right Sizing]
end
subgraph Ctrl["制御層 — Budgets"]
BG[Budgets\n多段階アラート・Actions]
end
subgraph Buy["購入最適化層 — Savings Plans"]
SP[Savings Plans\nCompute SP・カバレッジ分析]
end
subgraph Opt["リソース最適化層 — Compute Optimizer"]
CO[Compute Optimizer\nリソース推奨・Graviton]
end
subgraph Det["異常検知層 — Cost Anomaly Detection"]
CAD[Cost Anomaly Detection\nML異常検知・Root Cause]
end
CUR[Cost and Usage Report\nS3] -->|コストデータ| CE
CE -->|予算計画| BG
CE -->|SP購入推奨| SP
CE -->|Right Sizing推奨| CO
CAD -->|異常アラート| BG
CO -->|適正化後の利用量| SP
BG -->|Actions発動| Lambda[Lambda / SCP\n自動制御]
CAD -->|SNS通知| Alert[Slack / Email\nオンコール通知]
本記事でAWS Cost Optimization Vol1を完走しました。FinOps実践の第一歩として、まず Cost Explorer のコスト配分タグ活性化 と Budgets の多段階アラート設定 から着手することをお勧めします。この2点を整備するだけで、コスト管理の可視化と制御の基盤が一気に整います。
次のステップとして、Compute OptimizerのEnhanced Infrastructure Metricsを有効化し、Over-provisioned推奨の月次レビューを定例化しましょう。月次削減可能額がダッシュボードに可視化されることで、FinOpsの価値を組織内に示す具体的な数字が得られます。
Savings PlansはCompute SPから小額で段階的に購入を開始し、カバレッジ60〜70%の目標に向けて四半期ごとに拡張するアプローチが安全です。一括大量購入の誘惑に抗い、データドリブンな段階的コミットメントを徹底することが本番FinOps運用の鉄則です。
Cost Anomaly Detectionは設定後すぐに価値を発揮します。サービス別モニターと複合条件閾値を設定することで、深夜のコスト暴走を翌朝のSlack通知で察知できる体制が整います。Cost Optimizationの5層フレームワークを組み合わせることで、AWSコストを継続的に最適化するFinOpsエンジニアリング基盤が完成します。
AWS本番運用シリーズの他の記事もあわせてご活用ください。
FinOps導入 実践アクションチェックリスト
本記事で学んだ5層フレームワークを実際の本番環境に適用するための、優先度順アクションリストです。
Week 1: 可視化基盤の整備
- コスト配分タグの設計・活性化 (プロジェクト/環境/チームの3軸最低限)
- Cost Explorerでサービス別・タグ別コスト実態の初回把握
- Budgets初期設定 (月次予算 + 80%/100%の2段階アラート)
- Cost Anomaly Detectionのサービス別モニター作成 + SNS通知設定
Month 1: 制御層と異常検知の確立
- Budget Actionsの段階設定 (開発環境への適用から開始し本番は承認ワークフローを維持)
- Compute OptimizerのEnhanced Infrastructure Metrics有効化 (14日分のCloudWatchデータ収集)
- Over-provisioned Top 10リストの月次レビュー定例化 (30分/月で年間数十万円削減の実績あり)
- SNS + Lambdaによるコスト異常Slack通知の自動化 (on-callエンジニアへの即時エスカレーション)
Quarter 1: 購入最適化の開始
- Savings Plansカバレッジ分析の実施 (現状カバレッジをCost Explorerで数値把握)
- Compute SP小額テスト購入 (月次オンデマンドコストの10〜15%相当から開始)
- Right Sizing推奨上位3件の適用 (Graviton移行は検証環境で先行テスト)
- FinOps月次レビュー会議の定例化 (30分でコスト前月比・削減効果・次月施策を確認)
通年: FinOpsサイクルの定着
- 四半期ごとのSavings Plansカバレッジ拡張判断 (カバレッジ60〜70%目標に段階的に引き上げ)
- 年次のRI vs Savings Plans戦略見直し (組織のAWS利用パターン変化に追従)
- コスト削減実績のダッシュボード可視化・経営報告 (FinOpsのROIを定量的に示す)
このチェックリストを組織のFinOpsロードマップの出発点として活用ください。「計測できないものは改善できない」という原則に従い、まず可視化から着手することがCost Optimization本番運用の鉄則です。5層フレームワークの各層を順番に整備することで、AWSコストを継続的に最適化するFinOpsエンジニアリング基盤が確実に構築できます。
次回: Cost Optimization Vol2 — Reserved Instances × Spot Fleet × Graviton × Right Sizing
Cost Optimization本番運用シリーズのVol2(Reserved Instances × Spot Fleet × Graviton × Right Sizing)は公開済みです。Vol3以降ではAWS Organizations統合コスト管理・マルチアカウントFinOps基盤・Cost Intelligence Dashboardを活用した高度な分析基盤の構築まで、FinOpsエンジニアリングの深みを体系的に解説していきます。
本記事のブックマークと各軸クロスリンクを活用し、AWS本番運用の知識体系を継続的に強化してください。AWSコスト最適化の実践は一度で完結するものではなく、FinOpsサイクルを継続的に回すことで組織全体のコスト文化が醸成されます。