目次
AWS Billing and Cost Management 完全ガイド v2.0
AWS の使用コスト可視化・最適化・予測プラットフォーム
概要
AWS Billing and Cost Management は 「AWS の使用コストを可視化・最適化・予測するための統合サービス群」 であり、Cost Explorer(コスト分析)・Budgets(予算アラーム)・Cost Anomaly Detection(異常検知)・Savings Plans・Reserved Instances・Cost Optimization Hub・AWS Billing Conductor を統合して、AWS 支出を組織全体で効率的に管理する。
企業のクラウドコスト管理を実現するために、以下の主要課題を解決する:
- 複雑な AWS 料金体系の可視化: オンデマンド・リザーブドインスタンス・Savings Plans・スポット・フリーティアが混在する複雑な価格構造を階層的に分析
- 予算超過の事前防止: リアルタイムアラームと自動アクションで過剰支出を防止
- コスト最適化の定量化: 未使用リソース・低使用率インスタンス・RI 未活用を自動検出して削減額を数字で提示
- マルチアカウント管理: Organizations 統合請求で全アカウントの一元管理と割引共有
このサービスを選ぶ理由は、AWS ネイティブの正確性 にある。Cloudability・CloudHealth・Spot.io などの汎用クラウドコスト管理ツールでは表現できない AWS 固有の計算論理(RI 共有・Savings Plans のスコープ・Compute Savings Plans の柔軟性)を正確に反映できるのは Billing and Cost Management のみ。
課題と特徴
AWS Billing and Cost Management が解決する課題
❌ 課題:AWS コスト管理が断片的で非効率
→ サービス別 / タグ別 / アカウント別のコスト分析が手動作業
→ 月末になって初めて予算超過に気付く
→ RI / Savings Plans の活用率が把握できず、無駄な購入を続ける
→ 未使用 EIP・EBS スナップショット・古い Snapshot がリソース肥満化
→ 部門別・チーム別のコスト配賦ができず、誰が何に使ったかが不明
✅ 解決:Billing and Cost Management で能動的・リアルタイム・自動化
→ Cost Explorer で即座にサービス / タグ / アカウント別コストを可視化
→ Budgets で予算閾値に達した時点で SNS アラーム・自動対応
→ Cost Anomaly Detection で ML が異常スパイクを自動検知
→ Cost Optimization Hub で RI / Savings Plans / 削除対象リソースを自動提案
→ Cost Categories で複雑な配賦ルールを定義・自動化
コアの特徴
| 特徴 | 説明 |
|---|---|
| Cost Explorer | 過去 13 か月・最大 12 か月先のコスト予測、サービス / リージョン / タグ / アカウント別分析 |
| Budgets | コスト・使用量・RI/SP カバレッジの予算設定、80%/100% 閾値アラーム、自動アクション |
| Cost Anomaly Detection | ML ベースの異常スパイク検知(無料)、サービス / リンクアカウント / コストカテゴリ別 |
| Cost and Usage Report (CUR) | 最詳細なコストデータ(行レベル)、S3 CSV/Parquet 出力、Athena/Redshift/QuickSight 分析 |
| Data Exports(CUR 2.0) | CUR の次世代版、更新頻度向上(1 日 → 3 時間)、BigQuery 連携対応予定 |
| Savings Plans | コンピューティング / EC2 / SageMaker、1 年 / 3 年コミット、最大 66% 割引、RI より柔軟 |
| Reserved Instances | EC2 / RDS / ElastiCache / OpenSearch、Standard / Convertible、最大 72% 割引 |
| Cost Optimization Hub | AI 駆動の削減提案(RI / SP・削除・リサイズ・リージョン変更)、月額削減予測を表示 |
| AWS Billing Conductor | 顧客別 / BU 別の二次請求、ショーバック・チャージバック、EDP 連携 |
| Cost Categories | 複雑な配賦ルール(split charge / dynamic)を定義、Cost Explorer / CUR に反映 |
| Free Tier 監視 | フリーティア使用量の追跡、超過予測、予期しない課金の防止 |
| Carbon Footprint Tool | AWS 使用による CO2 排出量計算・追跡、ESG 報告対応 |
| Organizations 統合請求 | 全アカウントの一元請求、RI / SP / 割引の組織全体共有 |
アーキテクチャ(Mermaid 図 1)
graph TB
subgraph "Billing Data Sources"
A["AWS Service Usage<br/>EC2 / RDS / S3<br/>Lambda / SageMaker"]
B["Pricing Data<br/>On-Demand / RI<br/>Savings Plans"]
C["Usage Events<br/>CloudTrail / Usage API"]
end
subgraph "Cost Processing Pipeline"
D["Cost Calculation Engine<br/>Blended / Unblended<br/>Amortized / Net"]
E["Tagging & Allocation<br/>Cost Categories<br/>Split Charge Rules"]
end
subgraph "Cost Management Console & APIs"
F["Cost Explorer<br/>Custom Reports<br/>Forecasting"]
G["Budgets<br/>Anomaly Detection<br/>Optimization Hub"]
H["CUR / Data Exports<br/>S3 CSV/Parquet<br/>BigQuery Ready"]
end
subgraph "Analysis & Integration"
I["QuickSight<br/>BI Dashboard"]
J["Athena<br/>SQL Analysis"]
K["3rd-party Tools<br/>Vantage / Kubecost<br/>Datadog Cost Mgmt"]
end
subgraph "Automation & Action"
L["Savings Plans API<br/>RI Marketplace<br/>Auto Purchase"]
M["Lambda / SNS<br/>Auto Remediation<br/>EC2 Stop / Resize"]
N["Cost Anomaly<br/>Auto Response<br/>Ticket Creation"]
end
A --> D
B --> D
C --> D
D --> E
E --> F
E --> G
E --> H
F --> I
G --> J
H --> K
G --> M
N --> M
L --> G
主要コンポーネント詳細
1. Cost Explorer
機能:過去 13 か月のコスト・使用量の詳細分析、12 か月先の予測、サービス / リージョン / タグ / アカウント別フィルタリング
Cost Explorer の主要指標:
BlendedCost:
AWS が請求する正式なコスト
リザーブドインスタンス割引が平均化されて含まれる
Organizations 統合請求の場合、RI 割引は自動配分
UnblendedCost:
RI 割引を考慮しない実際の使用料金
アカウント別・リソース別の正確なコスト把握
AmortizedCost:
RI / Savings Plans の購入コストを使用月に按分
長期コミットメントのコスト を月単位で平準化
RI 前払い分を均等配分
NetUnblendedCost / NetAmortizedCost:
クレジット・割引を差引後の実コスト
内部チャージバック・部門配賦の厳密計算
API 例:
# 過去 6 か月のサービス別コスト(月次粒度)
aws ce get-cost-and-usage \
--time-period Start=2025-10-01,End=2026-04-01 \
--granularity MONTHLY \
--metrics BlendedCost UnblendedCost AmortizedCost \
--group-by Type=DIMENSION,Key=SERVICE \
--query 'ResultsByTime[].{Month: TimePeriod.Start, Groups: Groups}' \
--profile production
# タグ別・アカウント別の詳細分析
aws ce get-cost-and-usage \
--time-period Start=2026-03-01,End=2026-04-01 \
--granularity DAILY \
--metrics BlendedCost UsageQuantity \
--group-by Type=DIMENSION,Key=LINKED_ACCOUNT \
Type=TAG,Key=Environment \
Type=TAG,Key=Project \
--filter '{
"And": [
{"Dimensions": {"Key": "SERVICE", "Values": ["Amazon Elastic Compute Cloud - Compute"]}},
{"Tags": {"Key": "CostCenter", "Values": ["engineering"]}}
]
}' \
--profile production
2. AWS Budgets
機能:コスト・使用量・RI カバレッジの予算設定、複数段階の閾値アラーム、SNS / Slack / ChatBot 通知、自動アクション
Budgets の種類:
Cost Budget:
月額 $5,000 など、総コストの上限を設定
通知タイミング:80% ($ 4,000)・100% ($5,000)・120%
Usage Budget:
EC2 インスタンスの時間数が「月 500 時間」を超えないよう設定
コスト以外の使用量で制御(スケーリングの抑制に有効)
RI Utilization Budget:
リザーブドインスタンスの使用率が 85% 以上であることを保証
RI 未活用の検知・報告
Savings Plans Coverage Budget:
Savings Plans が全コンピュート使用の 80% 以上をカバーすることを強制
RI / OP/SP バランスの監視
Budgets Actions(自動対応):
- IAM ポリシー付与: 予算超過時に制限ポリシーをロールに自動アタッチ
- EC2 インスタンス停止: CloudWatch + Lambda で該当インスタンスを自動停止
- RDS 停止: 本番環境外の Dev/Test DB の自動シャットダウン
設定例:
# 月次 $5,000 予算、80% でアラーム
aws budgets create-budget \
--account-id 123456789012 \
--budget '{
"BudgetName": "production-monthly-budget",
"BudgetLimit": {"Amount": "5000", "Unit": "USD"},
"TimeUnit": "MONTHLY",
"BudgetType": "COST"
}' \
--notifications-with-subscribers '[
{
"Notification": {
"NotificationType": "ACTUAL",
"ComparisonOperator": "GREATER_THAN",
"Threshold": 80,
"ThresholdType": "PERCENTAGE"
},
"Subscribers": [{
"SubscriptionType": "SNS",
"Address": "arn:aws:sns:ap-northeast-1:123456789012:cost-alerts"
}]
},
{
"Notification": {
"NotificationType": "FORECASTED",
"ComparisonOperator": "GREATER_THAN",
"Threshold": 100,
"ThresholdType": "PERCENTAGE"
},
"Subscribers": [{
"SubscriptionType": "SLACK",
"Address": "https://hooks.slack.com/services/xxx"
}]
}
]'
# 予算超過時に Dev ロールにアクセス制限ポリシーを自動付与
aws budgets create-budget-action \
--account-id 123456789012 \
--budget-name production-monthly-budget \
--notification-type ACTUAL \
--action-type APPLY_IAM_POLICY \
--action-threshold '{"ActionThresholdValue": 100, "ActionThresholdType": "PERCENTAGE"}' \
--definition '{
"IamActionDefinition": {
"PolicyArn": "arn:aws:iam::aws:policy/DenyEC2Launch",
"Roles": ["arn:aws:iam::123456789012:role/DeveloperRole"]
}
}' \
--execution-role-arn arn:aws:iam::123456789012:role/BudgetsActionRole \
--approval-model AUTOMATIC
3. Cost Anomaly Detection
機能:ML ベースで通常と異なる急激なコスト増加を自動検知、サービス / リンクアカウント / コストカテゴリ別、無料
Anomaly Detection のモニタリングモード:
DIMENSIONAL:
サービス別・リージョン別・リンクアカウント別
どの次元での異常を検出するか指定
例:EC2 だけのスパイクを検知
CUSTOM:
コストカテゴリ別(Project / CostCenter)
複数タグの組み合わせで異常検知
例:「Engineering チームの EC2」のスパイク
使用例:
# サービス別異常検知モニター
aws ce create-anomaly-monitor \
--anomaly-monitor '{
"MonitorName": "service-level-monitor",
"MonitorType": "DIMENSIONAL",
"MonitorDimension": "SERVICE"
}' \
--query 'AnomalyMonitorArn'
# $100 以上の異常を毎日通知
aws ce create-anomaly-subscription \
--anomaly-subscription '{
"SubscriptionName": "daily-cost-anomalies",
"MonitorArnList": ["arn:aws:ce:ap-northeast-1:123456789012:anomaly-monitor/service-level"],
"Subscribers": [{
"Address": "arn:aws:sns:ap-northeast-1:123456789012:anomaly-alerts",
"Type": "SNS"
}],
"Threshold": 100,
"Frequency": "DAILY"
}'
# 検出された異常を Lambda で自動対応
aws ce list-anomalies \
--time-period Start=2026-03-01,End=2026-04-01 \
--granularity MONTHLY | jq '.Anomalies[] | select(.Impact.MaxImpact > 500)'
4. Cost and Usage Report (CUR) & Data Exports
CUR(レガシー):
- 行レベルの最詳細データ(数百万行)
- S3 にCSV/Parquet で定期出力(日次 / 月次)
- Athena / Redshift で分析
- 更新頻度:12-24 時間
Data Exports(CUR 2.0):
- CUR の次世代版、Apache Parquet のみ(CSV 廃止予定)
- 更新頻度向上:3 時間以内
- BigQuery / Snowflake への直接統合
- コスト最適化推奨の統合
- 2024 年から段階的ロールアウト
Data Exports 種類:
1. Legacy CUR:
- レガシー互換性のため従来 CUR をそのまま出力
- csv / parquet
2. Amortized CUR:
- RI / Savings Plans 購入コストを使用月に按分
- 内部チャージバック・正確なコスト分配に最適
3. NetAmortized CUR:
- Amortized に加えてクレジット・割引を差引
- 実際の支払いコスト
設定例:
# Data Exports(新)の設定
aws ce put-data-exports \
--export '{
"Name": "monthly-amortized-export",
"DataQuery": {
"TimePeriod": {"Unit": "MONTHLY"},
"Granularity": "MONTHLY",
"Filter": {
"Dimensions": {
"Key": "SERVICE",
"Values": ["Amazon Elastic Compute Cloud - Compute", "Amazon Relational Database Service"]
}
},
"Metrics": ["AmortizedCost", "UnblendedCost", "NetAmortizedCost"]
},
"RefreshCadence": "SYNCHRONOUS",
"S3OutputConfig": {
"S3Bucket": "my-cost-data-bucket",
"S3Prefix": "exports/",
"S3Region": "ap-northeast-1",
"FileFormat": "PARQUET"
}
}'
# Athena で分析
CREATE EXTERNAL TABLE IF NOT EXISTS cost_data (
identity_line_item_id STRING,
identity_time_interval STRING,
product_product_name STRING,
pricing_public_on_demand_cost DECIMAL(18,6),
cost_amortized_cost DECIMAL(18,6),
resource_tags_user_project STRING
)
PARTITIONED BY (year STRING, month STRING)
STORED AS PARQUET
LOCATION 's3://my-cost-data-bucket/exports/';
-- 月別・プロジェクト別コスト集計
SELECT
year,
month,
resource_tags_user_project as project,
SUM(cost_amortized_cost) as total_amortized_cost,
COUNT(*) as line_items
FROM cost_data
WHERE year = '2026' AND month >= '03'
GROUP BY year, month, project
ORDER BY year, month, project;
5. Savings Plans & Reserved Instances
Savings Plans(推奨):
- 1 年 / 3 年のコミットメント
- Compute Savings Plans: インスタンスタイプ・リージョン・OS を柔軟に変更可(最大 66% 割引)
- EC2 Savings Plans: EC2 のみ、ファミリー変更可(最大 72% 割引)
- SageMaker Savings Plans: SageMaker インスタンス(最大 70% 割引)
- RI より柔軟で、容量を超える部分は ON/DEMAND で課金(損失がない)
Reserved Instances:
- 1 年 / 3 年のコミットメント
- Standard RI: 固定構成、最大 72% 割引、変更・売却可能
- Convertible RI: 属性変更可(インスタンスファミリー・リージョン等)、最大 66% 割引
- RI Marketplace で余剰 RI を売却・購入
推奨提案 API:
# Savings Plans 購入推奨
aws ce get-savings-plans-purchase-recommendation \
--savings-plans-type COMPUTE_SP \
--term-in-years ONE_YEAR \
--payment-option ALL_UPFRONT \
--lookback-period-in-days SIXTY_DAYS \
--query 'SavingsPlansPurchaseRecommendationMetadata.{
TotalRecommendationCount: json_extract(SavingsPlansPurchaseRecommendation, "$.SavingsPlansPurchaseRecommendationDetails"),
GenerationTimestamp: GenerationTimestamp
}'
# RI 購入推奨
aws ce get-reservation-purchase-recommendation \
--service "Amazon Elastic Compute Cloud - Compute" \
--lookback-period-in-days THIRTY_DAYS \
--term-in-years ONE_YEAR \
--payment-option ALL_UPFRONT \
--query 'Recommendations[].{
InstanceType: RecommendationDetails[0].InstanceDetails.EC2InstanceDetails.InstanceType,
MonthlyRecurringCost: RecommendationDetails[0].EstimatedMonthlyRecurringCostAfterPurchase,
MonthlySavings: RecommendationDetails[0].EstimatedMonthlySavings
}' | jq '.[] | select(.MonthlySavings != "0.0")'
6. Cost Optimization Hub
機能:AI 駆動の自動削減提案、RI・SP・削除・リサイズ・リージョン移動、月額削減見積を提示
Cost Optimization Hub の推奨カテゴリ:
Compute Right-Sizing:
低使用率 EC2(< 10% CPU)→ 小さいインスタンスへリサイズ
削減額:月 $50-500 / インスタンス
Reserved Instance Purchase:
ON/DEMAND 使用が 80% 以上 → RI 購入推奨
削減額:月 $100-1000 / RI
Savings Plans Purchase:
複数インスタンスファミリーの使用 → Compute SP
削減額:月 $200-2000
Stop/Delete Unused Resources:
未使用 EC2・EBS・Snapshot・EIP → 削除推奨
削減額:月 $10-100 / リソース
Region Optimization:
高コスト地域の使用 → 低コスト地域への移動
削減額:15-40% のコスト削減
API 使用例:
# 最適化機会を一覧表示(ページネーション対応)
aws ce-recommendations list-recommendations-by-resource \
--resource-arn "arn:aws:ec2:ap-northeast-1:123456789012:instance/i-0123456789abcdef" \
--recommendation-type "RightSizeInstance" \
--query 'RecommendationDetails[].{
RecommendationType: Type,
EstimatedMonthlySavings: EstimatedMonthlySavings,
CurrentInstanceType: CurrentInstanceDetails.InstanceType,
RecommendedInstanceType: RecommendationOptions[0].InstanceDetails.InstanceType
}'
# 全アカウントのコスト最適化スコア
aws ce-hub get-optimization-summary \
--query 'OptimizationSummary.{
TotalRecommendationCount: RecommendationCount,
EstimatedMonthlySavings: EstimatedMonthlySavings,
RecommendationsByType: GroupedRecommendationCount
}'
7. AWS Billing Conductor(パートナー・MSP 向け)
機能:顧客別・BU 別の二次請求、カスタム料率の適用、ショーバック・チャージバック
Billing Conductor の用途:
SaaS ベンダー が AWS インフラコストを顧客に転嫁:
顧客 A の使用コストを自動計算
カスタムマークアップ(15% など)を適用
月次インボイスを自動生成
大企業の内部チャージバック:
ビジネスユニット A の使用分を自動集計
IT 部門が内部請求
部門別のコスト意識向上
AWS Partner・MSP:
複数顧客の使用分を一元管理
顧客ごとに異なる契約条件を適用
コミッションの自動計算
主要ユースケース(10+)
1. スタートアップのコスト削減
課題: 初期段階で AWS 使用を最適化していないため毎月 $50K を無駄に支出 解決:
- Cost Explorer で EC2 / Lambda 別の使用パターンを分析
- Cost Optimization Hub で「未使用 EIP 削除」「低使用率 EC2 をリサイズ」を実施
- Savings Plans を購入して月 15% 削減(月 $7.5K 節約)
2. エンタープライズの部門別配賦
課題: 複数部門が同じ AWS アカウントを共有、各部門のコスト把握ができない 解決:
- Cost Categories で「CostCenter」タグをルール化(split charge で共有 EBS の配分も自動化)
- Cost Explorer でチーム別コストを月次レポート化
- Organizations 統合請求で全体のボリュームディスカウントを享受(30% 割引達成)
3. 異常なコスト増加の早期検知
課題: 毎月 $10K のはずが突然 $15K に。月末まで気付かず、追加で $50K 支出 解決:
- Cost Anomaly Detection を有効化(無料)
- スパイク検知時に SNS で DataOps チームに即通知
- Lambda で自動調査・通知(影響範囲の特定)、事態収束に 2 時間以内
4. RI・Savings Plans の最適化
課題: RI を購入したものの使用率が 40% に低下(インスタンスタイプ変更したため) 解決:
- Cost Optimization Hub で「RI 未活用」を検出
- Convertible RI への交換か RI Marketplace で売却を推奨
- 次の購入は Compute Savings Plans(柔軟性向上)、購買コスト削減 15%
5. 本番 / ステージング / 開発のコスト分離
課題: 3 つの環境が同じアカウント、容易に環境別コストを把握できない 解決:
- 「Environment」タグを全リソースに付与(IAM ポリシーで強制)
- Cost Explorer で Environment=prod / staging / dev でグループ化
- Budgets を環境別に設定、dev 環境の超過を自動 EC2 停止
6. マルチアカウント・マルチリージョンの可視化
課題: 5 つのアカウント × 3 リージョンで使用されているコストを全体把握できない 解決:
- Organizations 統合請求で全アカウント・全リージョンのコストを一元化
- Data Exports を S3 → QuickSight で BI ダッシュボード化
- リージョン別・アカウント別・サービス別のドリルダウン分析が可能
7. フリーティア超過の防止
課題: 開発環境で EC2 を起動したまま忘れて $300 超過課金 解決:
- Free Tier 監視で「EC2 無料利用分が 75% を超過」でアラーム
- Budgets Actions で開発用ロールに EC2 起動制限ポリシーを自動付与
- 翌月から超過 0、コスト削減 $300
8. クラウド TCO(Total Cost of Ownership)の正確な見積
課題: CFO に「3 年で AWS に投資する ROI」を説得できない 解決:
- Cost Explorer で過去 12 か月の実績コストを整理
- Savings Plans / RI の活用で実現可能な削減額を計算
- 3 年コミット scenario を Cost Optimization Hub で比較
- CFO 報告用の削減見積書を自動生成(月 $20K → $15K)
9. パートナー・MSP の顧客請求自動化
課題: 複数顧客の AWS 使用分を月末に手動でまとめて請求(工数 30 時間/月) 解決:
- AWS Billing Conductor で顧客別請求グループを設定
- 顧客ごとのマークアップ率を定義(15-25%)
- 月末に自動請求書を生成・配信(工数 2 時間に短縮)
10. セキュリティ監視と Cost Anomaly の連携
課題: 攻撃により EC2 が暴走、$10K / 日の異常課金を後から発見 解決:
- Cost Anomaly Detection + CloudTrail ログを Lambda で連携
- スパイク検知 → CloudTrail で「誰が何をしたか」を自動追跡
- 疑わしい操作を検出 → Security Hub に自動レポート → 侵害範囲を3時間以内に特定
設定・操作の具体例
CLI による Cost Explorer 分析
# ケース 1: 過去 3 か月のサービス別コスト(月次粒度)
aws ce get-cost-and-usage \
--time-period Start=2025-12-01,End=2026-03-01 \
--granularity MONTHLY \
--metrics BlendedCost \
--group-by Type=DIMENSION,Key=SERVICE \
| jq '.ResultsByTime[] | {Month: .TimePeriod.Start, Services: .Groups[]}'
# ケース 2: 特定タグでフィルタ(Project=WebApp, Environment=prod)
aws ce get-cost-and-usage \
--time-period Start=2026-03-01,End=2026-04-01 \
--granularity DAILY \
--metrics BlendedCost UsageQuantity \
--filter '{
"And": [
{"Tags": {"Key": "Project", "Values": ["WebApp"]}},
{"Tags": {"Key": "Environment", "Values": ["prod"]}}
]
}' \
| jq '.ResultsByTime[] | {Date: .TimePeriod.Start, Cost: .Total.BlendedCost}'
# ケース 3: EC2 + RDS のみの比較
aws ce get-cost-and-usage \
--time-period Start=2026-02-01,End=2026-04-01 \
--granularity MONTHLY \
--metrics BlendedCost \
--filter '{
"Dimensions": {
"Key": "SERVICE",
"Values": [
"Amazon Elastic Compute Cloud - Compute",
"Amazon Relational Database Service"
]
}
}' \
--group-by Type=DIMENSION,Key=SERVICE
Terraform で Budgets を一元管理
# Terraform で部門別予算を定義
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
}
}
provider "aws" {
region = "ap-northeast-1"
}
variable "budgets" {
type = map(object({
limit = number
alert_threshold = number
alert_email = string
}))
default = {
engineering = { limit = 10000, alert_threshold = 80, alert_email = "eng-finance@example.com" }
marketing = { limit = 5000, alert_threshold = 80, alert_email = "mkt-finance@example.com" }
sales = { limit = 3000, alert_threshold = 80, alert_email = "sales-finance@example.com" }
}
}
resource "aws_budgets_budget" "department" {
for_each = var.budgets
account_id = data.aws_caller_identity.current.account_id
name = "${each.key}-monthly-budget"
budget_type = "COST"
limit_unit = "USD"
limit_amount = each.value.limit
time_period_start = "2026-04-01"
time_unit = "MONTHLY"
cost_filter {
name = "TagKeyValue"
values = ["CostCenter${each.key}"]
}
notification {
comparison_operator = "GREATER_THAN"
notification_type = "ACTUAL"
threshold = each.value.alert_threshold
threshold_type = "PERCENTAGE"
notification_trigger_type = "FORECASTED_TOTAL"
}
}
resource "aws_budgets_budget_notification" "email" {
for_each = var.budgets
account_id = aws_budgets_budget.department[each.key].account_id
budget_name = aws_budgets_budget.department[each.key].name
comparison_operator = "GREATER_THAN"
notification_type = "ACTUAL"
threshold = each.value.alert_threshold
threshold_type = "PERCENTAGE"
notification_trigger_type = "FORECASTED_TOTAL"
}
resource "aws_budgets_budget_notification_subscription" "email" {
for_each = var.budgets
account_id = aws_budgets_budget_notification.email[each.key].account_id
budget_name = aws_budgets_budget_notification.email[each.key].budget_name
comparison_operator = each.value.alert_threshold
notification_type = "ACTUAL"
subscription_type = "EMAIL"
subscriber_address = each.value.alert_email
}
data "aws_caller_identity" "current" {}
output "budget_names" {
value = {
for k, v in aws_budgets_budget.department :
k => v.name
}
}
CloudFormation で Cost Optimization Hub 推奨を自動取得
AWSTemplateFormatVersion: '2010-09-09'
Description: 'Cost Optimization Hub Integration Lambda'
Resources:
CostOptimizationLambdaRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Principal:
Service: lambda.amazonaws.com
Action: sts:AssumeRole
ManagedPolicyArns:
- arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
Policies:
- PolicyName: CostOptimizationAccess
PolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Action:
- ce:GetOptimizationSummary
- ce:ListRecommendations
Resource: '*'
CostOptimizationLambda:
Type: AWS::Lambda::Function
Properties:
FunctionName: cost-optimization-reporter
Runtime: python3.11
Role: !GetAtt CostOptimizationLambdaRole.Arn
Handler: index.lambda_handler
Code:
ZipFile: |
import boto3
import json
from datetime import datetime
ce = boto3.client('ce')
def lambda_handler(event, context):
# Get optimization summary
summary = ce.get_optimization_summary()
total_savings = summary['OptimizationSummary']['EstimatedMonthlySavings']
recommendation_count = summary['OptimizationSummary']['RecommendationCount']
# List recommendations by type
recs_by_type = {}
for rec_type in ['RightSizeInstance', 'PurchaseReservationInstance', 'PurchaseSavingsPlans']:
recs = ce.list_recommendations_by_resource(RecommendationType=rec_type)
recs_by_type[rec_type] = len(recs.get('RecommendationDetails', []))
report = {
'timestamp': datetime.now().isoformat(),
'total_monthly_savings_potential': total_savings,
'total_recommendations': recommendation_count,
'recommendations_by_type': recs_by_type
}
print(json.dumps(report, indent=2))
return report
CostOptimizationSchedule:
Type: AWS::Events::Rule
Properties:
Description: 'Daily cost optimization report'
ScheduleExpression: 'cron(0 9 * * ? *)' # 9 AM UTC daily
State: ENABLED
Targets:
- Arn: !GetAtt CostOptimizationLambda.Arn
Id: CostOptimizationTarget
CostOptimizationLambdaPermission:
Type: AWS::Lambda::Permission
Properties:
FunctionName: !Ref CostOptimizationLambda
Action: lambda:InvokeFunction
Principal: events.amazonaws.com
SourceArn: !GetAtt CostOptimizationSchedule.Arn
Outputs:
LambdaFunctionArn:
Value: !GetAtt CostOptimizationLambda.Arn
Description: Cost Optimization Lambda ARN
類似サービス比較表
| 特徴 | AWS Billing | Cloudability (IBM Apptio) | CloudHealth (Broadcom) | Kubecost | Vantage | Spot.io |
|---|---|---|---|---|---|---|
| AWS ネイティブ統合 | ✅ 完全統合 | ⭕ API 統合 | ⭕ API 統合 | ❌ Kubernetes のみ | ⭕ API 統合 | ⭕ API 統合 |
| マルチクラウド | ❌ AWS のみ | ✅ AWS/Azure/GCP | ✅ AWS/Azure/GCP | ✅ K8s 複数クラウド | ✅ AWS/Azure/GCP | ✅ AWS/Azure/GCP |
| リアルタイムアラーム | ✅ 分単位 | ⭕ 時間単位 | ⭕ 時間単位 | ✅ 秒単位 | ⭕ 時間単位 | ✅ リアルタイム |
| AI 駆動最適化 | ✅ Hub で提案 | ✅ 推奨エンジン | ✅ Intelligent Ops | ✅ オートスケール | ✅ 提案 | ✅ 自動最適化 |
| 予算管理 | ✅ Budgets | ✅ ポリシーエンジン | ✅ ガバナンス | ⭕ カスタム | ✅ 予算 | ❌ |
| コスト | 無料-$0.01/API | $3K-30K/年 | $4K-50K/年 | 無料-$5K/年 | $1K-20K/年 | $5K-100K/年 |
| オンプレ対応 | ❌ | ✅ | ✅ | ✅ | ⭕ | ❌ |
| 容易性 | ✅ ネイティブ | ⭕ 中程度 | ⭕ 中程度 | ✅ Helm Chart | ✅ UI 直感的 | ⭕ API 駆動 |
ベストプラクティス
✅ 推奨される設定・運用
-
タグ戦略の事前設計(リソース作成時)
- 必須タグ:Environment / Project / CostCenter / Owner
- IAM ポリシーで必須タグなしのリソース作成を拒否
- 月初に「タグなしリソース」の削除をレビュー
-
Cost Categories で複雑な配賦ルールを自動化
- Split Charge で共有 EBS・NAT Gateway のコストを部門に自動配分
- Dynamic Allocation で時間帯別のコスト配賦(営業時間のみ課金等)
-
Savings Plans は「Compute SP」を優先
- 最も柔軟(インスタンスファミリー・リージョン・OS 変更可)
- RI より 2-3% 割引率が低いが「容量超過 = ON/DEMAND で自動課金」で損失ない
- RI Marketplace で余剰を売却可能
-
Cost Anomaly Detection は無料で常時有効化
- 月 $100 以上のスパイクを検知設定
- SNS で DataOps・Finance チームに即通知
- Lambda で自動対応(CloudTrail ログ取得・Security Hub 連携)
-
組織全体の整合性を Organizations で実現
- 統合請求で RI・SP・割引を全アカウント共有
- タグポリシーで全アカウントのタグ命名を統一
- 金融コンプライアンス:管理アカウントで全請求書を一元保管
-
月次レビュー・報告を自動化
- Data Exports を QuickSight / Tableau BI ダッシュボードに接続
- 部門別コスト・月次差分・RI 利用率を月初に CFO に自動配信
- Cost Optimization Hub の推奨を月次で CEE に報告
❌ よくある失敗パターン
-
タグなしリソース・タグ命名が統一されていない
- 結果:コスト配賦が不可能、部門別請求ができない
- 対策:IAM ポリシーで必須タグを強制、毎月タグ監査実施
-
RI を大量購入したが、使用率が低下
- 結果:6 か月後に「あ、このインスタンスタイプ使わなくなった」で損失
- 対策:Compute Savings Plans またはConvertible RI を推奨、定期見直し
-
Cost Anomaly Detection を有効化したが通知を無視
- 結果:異常スパイク → 月末まで気付かず → 追加支出
- 対策:アラーム → Lambda 自動対応(CloudTrail・Security Hub 連携)を設定
-
CUR データを S3 に出力するだけで分析しない
- 結果:月 100GB の CUR データが溜まるだけで価値なし
- 対策:Athena / QuickSight と連携して月次ダッシュボード化
-
Cost Optimization Hub の提案を「後で確認」で放置
- 結果:月 $5K の削減機会が見過ごされる
- 対策:提案を Lambda で自動取得 → 実装・効果測定を自動化
トラブルシューティング表
| 症状 | 原因 | 解決策 |
|---|---|---|
| Cost Explorer でデータが表示されない | タグがまだ有効化されていない(有効化後 24 時間かかる) | Billing → Cost allocation tags でタグを有効化、24 時間待機 |
| Budgets が毎月アラームを出しているが、実際のコストが下がらない | 予算の根拠が過去データに基づかず、高すぎる / 低すぎる | 過去 3 か月の Cost Explorer で平均値・トレンドを確認してから予算を再設定 |
| Data Exports が 12 時間以上更新されない | ネットワークエラー・S3 権限不足 | S3 バケットポリシーで ce:PutDataExports 権限確認、CloudTrail で API エラー確認 |
| Cost Anomaly Detection の通知が多すぎて、見過ごしが多い | 閾値が低すぎる(毎日アラーム) | 閾値を月額コストの 3-5% に設定(例:月 $10K なら $300 以上のスパイク) |
| Organizations 統合請求が有効化されたのに、割引が適用されていない | RI / SP が古いアカウントで購入・統合対象アカウントに適用されていない | RI Marketplace で余剰 RI を統合アカウントに売却、または新規 RI を統合アカウントで購入 |
| Savings Plans / RI の購入推奨が「不正確」に見える | 過去 30 日のデータだけで推奨(季節性・トレンド変化を考慮していない) | 60-90 日のスパンで cost & usage を再確認、実際のピークシーズンで購入判断 |
| CUR 内容が間違っている(行が重複・金額がおかしい) | CUR の設定が古い、版が混在している | CUR 2.0(Data Exports)への移行を検討、旧 CUR 設定を削除 |
| Cost Categories の split charge が反映されていない | 共有リソース(EBS・NAT Gateway)が正しくタグ付けされていない | 該当リソースのタグを確認、Cost Categories の split rule を再評価 |
2025-2026 最新動向
Data Exports(CUR 2.0)への段階的移行
- CUR(レガシー)の更新頻度:12-24 時間 → Data Exports:3 時間以内へ高速化
- 2025 年 Q3 までに全アカウントで Data Exports が利用可能に
- 2026 年中に CUR(CSV)廃止予定、Parquet のみに統一
Cost Optimization Hub の AI 強化
- 2025 年下半期:生成 AI による「カスタマイズド削減提案」(組織の使用パターンを学習)
- 2026 年:「What-If」シミュレーション(Savings Plans 購入時の効果をシミュレート)
Billing Conductor の拡張
- 複数顧客の自動請求書生成・配信機能強化
- API による顧客別ダッシュボードの自動生成(2025 年下半期)
Carbon Footprint Tool の詳細化
- リージョン別・サービス別の CO2 排出量をさらに詳細に提示
- ESG レポート自動生成(2025 年 Q4)
Organizations 統合請求の強化
- 複数 Organizations 間のコスト配賦(billing transfer の拡張)
- 組織全体の RI / SP 最適化の自動提案
学習リソース・参考文献
公式ドキュメント(8+)
- AWS Cost Management User Guide
- AWS Budgets Documentation
- Cost Explorer API Reference
- Cost and Usage Report (CUR)
- Data Exports(CUR 2.0)
- AWS Billing Conductor User Guide
- Cost Optimization Hub
- Organizations Consolidated Billing
OSS / ベンダーツール(5+)
- OpenCost(CNCF) - Kubernetes コストの可視化、AWS に対応
- Kubecost - Kubernetes 環境のコスト管理、AWS Marketplace 対応
- Cloud Custodian - ポリシーベースのコスト削減自動化
- Vantage - マルチクラウドコスト管理・AWS API 統合
- Spot.io Cost Analytics - 容量計画・最適化
実装例・チェックリスト
実装の段階(フェーズごと)
Phase 1: 基礎(月 1)
- [ ] Cost Explorer で過去 3 か月のコスト分析(サービス・リージョン別)
- [ ] 最低限のタグ(Environment / Project / Owner)を全リソースに付与(IAM 強制)
- [ ] Budgets で月額予算を設定、SNS アラーム有効化
- [ ] Cost Anomaly Detection 有効化(無料)
Phase 2: 最適化(月 2-3)
- [ ] Cost Optimization Hub で「Right-Sizing」「RI 購入」を実施(月 10-30% 削減)
- [ ] CUR (または Data Exports) を S3 に出力、Athena/QuickSight で BI ダッシュボード化
- [ ] Cost Categories で部門別コスト配賦を自動化
- [ ] Savings Plans・RI の購入推奨に基づき、容量計画を実施
Phase 3: 組織化(月 4-6)
- [ ] Organizations 統合請求を有効化、全アカウントのコストを一元管理
- [ ] タグポリシーで全アカウントのタグ命名を統一
- [ ] Billing Conductor でパートナー/顧客請求を自動化(該当時のみ)
- [ ] Cost Anomaly Detection + Lambda で自動対応パイプラインを構築
採用判断チェックリスト
- [ ] 月額 AWS コスト > $1,000(Cost Explorer・Budgets で価値を実感)
- [ ] 複数部門・複数アカウントで使用(タグ・Cost Categories の価値)
- [ ] RI / Savings Plans 購入を検討(推奨 API で効果最大化)
- [ ] コスト削減目標を CFO / CEO から指示されている(圧力あり)
- [ ] 現在、手動でコスト管理をしている(自動化で工数削減)
まとめ
AWS Billing and Cost Management は 「AWS コストの可視化・予算管理・最適化を実現する統合プラットフォーム」。Cost Explorer でサービス・タグ・アカウント別コストを分析し、Budgets で予算超過を事前アラーム・自動対応する。Cost Anomaly Detection で ML による異常スパイクを無料で検知し、Cost Optimization Hub の提案で RI・Savings Plans・削除対象リソースを自動特定。Organizations 統合請求で全アカウントの割引を共有し、タグポリシーで組織全体の命名規則を統一する。
最小限の導入: Cost Explorer + Budgets + Anomaly Detection(無料)= 月額コスト最適化の 80% を実現 フル活用: 上記 + CUR + Data Exports + Billing Conductor + Cost Categories = 部門別配賦・自動最適化で月 30% 削減以上
部門別配賦・自動最適化により、3-6 か月で ROI(導入工数回収)を実現できる。特に月額 $10K 以上の組織では必須。
最終更新:2026-04-26 バージョン:v2.0