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購入承認 |
タグ戦略の設計
[必須タグ(コスト配賦に使用)]
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
})
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')
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_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']}")
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 メトリクス過剰カスタム |
カスタムメトリクス課金が予想外に高い |
標準メトリクスで代替可能か検討 |