はじめに
AuroraのI/Oコストが膨らんでいて「なんとかしたい」と思ったことはありませんか?
今回、実際のAuroraクラスター(app-main)のコスト分析を行い、Aurora I/O-Optimizedへの移行を検討した際の試算プロセスと結果を共有します。
この記事でわかること:
- Aurora StandardとI/O-Optimizedの違い
- どちらが得かを判断する「損益分岐点」の考え方
- Reserved Instance(RI)との組み合わせ効果
- 実際の移行手順
分析の流れ
今回の分析は以下のステップで進めました。
1. AWS Compute OptimizerのCSVエクスポート
↓
2. Pythonでクラスター別コスト・IOPS集計
↓
3. I/O比率の高いクラスターを特定
↓
4. I/O-Optimized移行時の損益分岐点を計算
↓
5. RI適用後の実コストで最終試算
Step 1: Compute OptimizerのCSVを取得する
AWSコンソールの Compute Optimizer → Aurora クラスター からCSVをエクスポートします。
# AWS CLIでも取得可能
aws compute-optimizer export-auto-scaling-group-recommendations \
--s3-destination-config bucket=your-bucket,keyPrefix=co-export/
CSVには以下のような列が含まれています。
| カラム名 | 内容 |
|---|---|
dbClusterIdentifier |
クラスター名 |
currentStorageConfigurationStorageType |
現在のストレージタイプ |
storageFinding |
Compute Optimizerの推奨判定 |
currentStorageEstimatedClusterInstanceOnDemandMonthlyCost |
インスタンスコスト(月額) |
currentStorageEstimatedClusterStorageOnDemandMonthlyCost |
ストレージコスト(月額) |
currentStorageEstimatedClusterStorageIOOnDemandMonthlyCost |
I/Oコスト(月額) |
utilizationMetricsVolumeReadIOPsAverage |
読み取りIOPS(平均) |
utilizationMetricsVolumeWriteIOPsAverage |
書き込みIOPS(平均) |
utilizationMetricsVolumeBytesUsedAverage |
ストレージ使用量(平均) |
Step 2: Pythonでクラスター別コストを集計する
CSVを読み込んで、クラスターごとのコスト内訳とIOPS使用量を一覧化します。
import csv
with open('your-compute-optimizer-export.csv', 'r', encoding='utf-8') as f:
reader = csv.DictReader(f)
clusters = list(reader)
# コスト集計
for cluster in clusters:
name = cluster['dbClusterIdentifier']
instance_cost = float(cluster['currentStorageEstimatedClusterInstanceOnDemandMonthlyCost'] or 0)
storage_cost = float(cluster['currentStorageEstimatedClusterStorageOnDemandMonthlyCost'] or 0)
io_cost = float(cluster['currentStorageEstimatedClusterStorageIOOnDemandMonthlyCost'] or 0)
total = instance_cost + storage_cost + io_cost
if total > 0:
print(f"{name}: インスタンス ${instance_cost:,.2f} / ストレージ ${storage_cost:,.2f} / I/O ${io_cost:,.2f} / 合計 ${total:,.2f}")
実行結果(抜粋):
app-main: インスタンス $15,546.08 / ストレージ $262.05 / I/O $12,466.51 / 合計 $28,274.64
app-media: インスタンス $8,234.12 / ストレージ $198.30 / I/O $7,821.44 / 合計 $16,253.86
app-search: インスタンス $3,102.56 / ストレージ $88.14 / I/O $2,941.22 / 合計 $6,131.92
Step 3: I/O比率の高いクラスターを特定する
I/O比率(= I/Oコスト ÷ 総コスト)が高いクラスターほど、I/O-Optimized移行の恩恵が大きくなります。
# I/O比率でソートして移行候補を抽出
high_io_clusters = []
for cluster in clusters:
name = cluster['dbClusterIdentifier']
instance_cost = float(cluster['currentStorageEstimatedClusterInstanceOnDemandMonthlyCost'] or 0)
io_cost = float(cluster['currentStorageEstimatedClusterStorageIOOnDemandMonthlyCost'] or 0)
total = instance_cost + io_cost
if total > 0:
io_ratio = io_cost / total * 100
high_io_clusters.append((name, io_cost, io_ratio))
# I/Oコスト降順でソート
high_io_clusters.sort(key=lambda x: x[1], reverse=True)
print("IOPS使用率 TOP 5:")
for name, io_cost, io_ratio in high_io_clusters[:5]:
marker = "✅ 移行推奨" if io_ratio >= 25 else ""
print(f" {name}: ${io_cost:,.2f}/月 (I/O比率 {io_ratio:.1f}%) {marker}")
実行結果:
IOPS使用率 TOP 5:
app-main: $12,466.51/月 (I/O比率 44.1%) ✅ 移行推奨
app-media: $ 7,821.44/月 (I/O比率 48.7%) ✅ 移行推奨
app-search: $ 2,941.22/月 (I/O比率 48.7%) ✅ 移行推奨
app-log: $ 892.14/月 (I/O比率 31.2%) ✅ 移行推奨
app-log-old: $ 421.08/月 (I/O比率 22.1%)
また、CloudWatchのIOPSメトリクスも合わせて確認しました。
app-main: 5,968,974 IOPS(読み取り 5,396,657 / 書き込み 572,317)
app-media: 4,210,356 IOPS
app-search: 1,470,134 IOPS
app-log: 431,906 IOPS
app-log-old: 311,640 IOPS
高IOPSクラスターほどI/Oコストが高く、I/O-Optimizedの効果が大きいことが確認できます。
Step 4: 損益分岐点を計算する
I/O-Optimizedに移行するとインスタンスコストが増える代わりにI/Oコストがゼロになります。どちらが得かは損益分岐点で判断します。
# app-mainクラスターの損益分岐点計算
instance_cost_standard = 11347.12 # Standard + 1年RI
instance_cost_io_optimized = 16010.36 # I/O-Opt + 1年RI
io_cost = 12466.51
instance_cost_increase = instance_cost_io_optimized - instance_cost_standard
# 損益分岐点: インスタンス増加分がI/Oコストを超えるとStandardが有利
breakeven_io_ratio = instance_cost_increase / (instance_cost_increase + io_cost) * 100
current_io_ratio = io_cost / (instance_cost_standard + 262.05 + io_cost) * 100
print(f"損益分岐点のI/O比率: {breakeven_io_ratio:.1f}%")
print(f"現在のI/O比率: {current_io_ratio:.1f}%")
print(f"判定: {'✅ I/O-Optimized有利' if current_io_ratio > breakeven_io_ratio else '❌ Standard継続'}")
実行結果:
損益分岐点のI/O比率: 47.1%
現在のI/O比率: 51.8%
判定: ✅ I/O-Optimized有利
Step 5: RI適用後の実コストで最終試算する
RIの実際の時間単価をAWSコンソールで確認し、推定値ではなく実数で計算します。
# 実際のRI時間単価(AWSコンソールのリザーブドインスタンス画面で確認)
ri_hourly_standard = 3.886 # Standard 1年RI(全額前払い)
ri_hourly_io_optimized = 3.886 + 1.597 # I/O-Opt = Standard + 30%増分
hours_per_month = 730
instance_count = 4
storage_cost = 262.05
io_cost_standard = 12466.51
# Standard + 1年RI
cost_standard = ri_hourly_standard * hours_per_month * instance_count + storage_cost + io_cost_standard
# I/O-Optimized + 1年RI
cost_io_opt = ri_hourly_io_optimized * hours_per_month * instance_count + storage_cost
monthly_savings = cost_standard - cost_io_opt
print(f"Standard + 1年RI: ${cost_standard:,.2f}/月")
print(f"I/O-Opt + 1年RI: ${cost_io_opt:,.2f}/月")
print(f"月間削減額: ${monthly_savings:,.2f}")
print(f"年間削減額: ${monthly_savings * 12:,.2f}")
実行結果:
Standard + 1年RI: $24,075.68/月
I/O-Opt + 1年RI: $16,272.41/月
月間削減額: $7,803.27
年間削減額: $93,639.24
ポイント: RI割引率は一般的な目安(40%)ではなく、AWSコンソールの実際の時間単価を使うことで正確な試算ができます。今回の実際の割引率は約27%でした。
Aurora StandardとI/O-Optimizedの違い
Auroraのストレージ構成は2種類あります。
| 項目 | Aurora Standard | Aurora I/O-Optimized |
|---|---|---|
| I/O課金 | あり($0.24/100万リクエスト) | なし |
| ストレージ単価 | $0.12/GB | $0.27/GB |
| インスタンス料金 | 通常 | 約30%増(RI正規化単位ベース) |
| 向いているケース | I/O比率 < 25% | I/O比率 ≥ 25% |
AWSドキュメントにも明記されています。
Aurora I/O-Optimized is the best choice when your I/O spending is 25% or more of your total Aurora database spending.
— Amazon Aurora storage
損益分岐点の考え方
I/O-Optimizedに移行するとインスタンスコストが上がる代わりにI/Oコストがゼロになります。
損益分岐点 = インスタンスコスト増加分 ÷ (インスタンスコスト増加分 + I/Oコスト) × 100
今回のケース(db.r7g.8xlarge × 4台、1年RI):
インスタンスコスト(Standard + 1年RI): $11,347.12/月
インスタンスコスト(I/O-Opt + 1年RI): $16,010.36/月
増加分: $4,663.24/月
損益分岐点のI/O比率 ≒ 47.1%
現在のI/O比率 ≒ 51.8% ← 損益分岐点を超えている
I/O比率が損益分岐点を上回っているため、I/O-Optimizedが有利と判断できます。
実際のコスト試算
現在の構成(Aurora Standard + 1年RI)
インスタンスコスト: $3.886/h × 730h × 4台 = $11,347.12/月
ストレージコスト: $ 262.05/月
I/Oコスト: $12,466.51/月
─────────────────────────────────────────────────────────
合計: $24,075.68/月
I/Oコストが全体の 51.8% を占めており、RIでは削減できない部分です。
I/O-Optimized移行後(1年RI)
インスタンスコスト: $(3.886+1.597)/h × 730h × 4台 = $16,010.36/月
ストレージコスト: $ 262.05/月
I/Oコスト: $ 0.00/月
─────────────────────────────────────────────────────────
合計: $16,272.41/月
削減効果
| 項目 | 金額 |
|---|---|
| 月間削減額 | $7,803.27 |
| 年間削減額 | $93,639.24 |
| 削減率 | 約32.4% |
RIとI/O-Optimizedの関係
ここで注意点があります。
AWSドキュメントによると:
Aurora I/O-Optimized consumes 30% more normalized units per hour than Aurora Standard.
— Reserved DB instances for Amazon Aurora
つまり、既存のAurora Standard用RIはI/O-Optimizedでも引き続き適用されますが、I/O-Optimizedはインスタンスあたりの正規化単位が30%多く消費されます。
既存RIだけでは割引をフルカバーできない場合、追加でRIを購入することでメリットを最大化できます。
例:db.r7g.8xlarge × 4台でI/O-Optimizedに移行する場合
→ 既存RI(Standard用)はそのまま適用可能
→ ただし30%分は追加購入で補完するとさらにお得
今回の試算は追加RI購入なしの前提で計算しています。
移行手順
前提条件
- Aurora MySQL または PostgreSQL(I/O-Optimized対応バージョン)
- 対象リージョンがI/O-Optimized対応であること(ap-northeast-1は対応済み)
手順
1. 現在のI/O比率を確認する
AWS CLIでコスト確認:
aws ce get-cost-and-usage \
--time-period Start=2025-12-01,End=2026-01-01 \
--granularity MONTHLY \
--filter '{"Dimensions":{"Key":"SERVICE","Values":["Amazon Relational Database Service"]}}' \
--metrics "UnblendedCost" \
--group-by '[{"Type":"DIMENSION","Key":"USAGE_TYPE"}]'
CloudWatch でIOPSを確認:
aws cloudwatch get-metric-statistics \
--namespace AWS/RDS \
--metric-name VolumeReadIOPs \
--dimensions Name=DBClusterIdentifier,Value=your-cluster-id \
--start-time 2025-12-01T00:00:00Z \
--end-time 2026-01-01T00:00:00Z \
--period 2592000 \
--statistics Sum
2. 損益分岐点を計算する
# I/O比率が25%以上なら移行を検討
instance_cost = 11347.12 # RI適用後のインスタンスコスト
storage_cost = 262.05
io_cost = 12466.51
total = instance_cost + storage_cost + io_cost
io_ratio = io_cost / total * 100
print(f"I/O比率: {io_ratio:.1f}%")
# → I/O比率: 51.8% ✅ 移行推奨
3. コンソールからストレージ設定を変更する
- AWSコンソール → Amazon RDS → クラスター選択
- 「変更」をクリック
- 「ストレージ設定」→「Aurora I/O-Optimized」を選択
- 「すぐに適用」を選択して変更
注意: NVMeベースのインスタンス(db.r8g等)ではエンジン再起動が発生します。非NVMeベースのインスタンスではダウンタイムなしで切り替え可能です。
AWS CLIで変更する場合:
aws rds modify-db-cluster \
--db-cluster-identifier your-cluster-id \
--storage-type aurora-iopt1 \
--apply-immediately
4. 切り替え後の確認
aws rds describe-db-clusters \
--db-cluster-identifier your-cluster-id \
--query 'DBClusters[0].StorageType'
# → "aurora-iopt1" になっていればOK
よくあるハマりポイント
RI割引が思ったより効かない
原因: I/O-Optimizedは正規化単位を30%多く消費するため、既存RIだけでは不足する場合があります。
対処: 追加RIの購入を検討するか、RI期限切れのタイミングでI/O-Optimized前提のRIを購入し直す。
切り替え後にコストが増えた
原因: I/O比率が損益分岐点を下回っていた可能性があります。
対処: Aurora I/O-OptimizedからStandardへの切り替えはいつでも可能です。逆(Standard→I/O-Optimized)は30日に1回の制限があります。
まとめ
Aurora I/O-Optimizedへの移行判断はI/O比率が25%以上かどうかがシンプルな基準です。
今回のケースではI/O比率が51.8%と高く、移行によって月間$7,803(年間約$93,000)の削減が見込めました。
- I/O比率 < 25% → Aurora Standard継続
- I/O比率 25〜47% → 要検討(RI構成次第)
- I/O比率 > 47% → I/O-Optimized移行を強く推奨
RIとの組み合わせでさらに効果が高まるので、RI更新のタイミングでI/O-Optimized前提の購入を検討するのもおすすめです。
コスト最適化は一度やって終わりではなく、定期的にI/O比率をモニタリングして判断し続けることが大切です。