1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Aurora I/O-Optimizedへの移行でDBコストを削減した話

1
Last updated at Posted at 2026-03-26

はじめに

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. コンソールからストレージ設定を変更する

  1. AWSコンソール → Amazon RDS → クラスター選択
  2. 「変更」をクリック
  3. 「ストレージ設定」→「Aurora I/O-Optimized」を選択
  4. 「すぐに適用」を選択して変更

注意: 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比率をモニタリングして判断し続けることが大切です。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?