本記事では、RDSで最もコスト効率の良いSSDボリュームを選ぶための注意点とベストプラクティスを解説します。
RDSのSSDストレージには3つの選択肢があります。Amazon RDSは汎用SSDストレージとしてgp2とgp3の2種類を提供し、加えてProvisioned IOPS SSDのio1も選択できます。(旧来のマグネティックストレージも残っていますが、ほとんどの用途では速度が不足します。なお、EBSで提供されているio2はRDSではまだ未対応です。)
- gp2 — 旧世代。IOPSはボリュームサイズに比例し、バースト可能
- gp3 — 現行世代。IOPSが安定しており、ベースラインIOPSに加えて追加のIOPSとスループットを購入可能
- io1 — (PIOPSとも呼ばれます)。安定した性能を提供。Provisioned IOPSの購入が必須で、最も高価。
いずれのストレージタイプも1桁ミリ秒のレイテンシを実現します。
RDSではgp2とgp3のGB単価は同じです(gp3が安いEC2とは異なります)。ただしgp3は、4,000GBまでのボリュームに対して、バーストに頼らずより高いベースラインIOPSを提供します。
料金マトリクス
下のスプレッドシートに、ボリュームサイズごとのgp2・gp3・io1の料金とIOPSをまとめました。

SSDボリュームのコスト比較
いくつか具体例を見てみましょう。
1,000GBのボリュームの場合、gp3なら12,000 IOPSを安定して利用できます。gp2でも12,000 IOPSは出ますが、これは短時間のバースト時のみで、持続的なIOPSは3,000にとどまります。料金はどちらも同じ$115です。一方、同じ12,000 IOPSをio1 PIOPSで構成すると$425もかかります。
5,000GBのボリュームが必要な場合、gp2なら$525で15,000 IOPSが利用できます。同じ価格でgp3だと12,000 IOPSにとどまります(追加料金で増設は可能)。io1 PIOPSなら$2,125と大幅に高額になります。
RDSのディスクストライピング
RDSの各エンジン(MS SQL Serverを除く)は、一定サイズを超えると4本のボリュームに自動的にストライピングします。これにより、gp2もgp3も上記の表より高いIOPSとスループットが得られます。
ストライピングの条件:
- MariaDB、MySQL、PostgreSQLは400GBを超えるとストライピング
- Oracleは200GBを超えるとストライピング
- 既存ボリュームのサイズ拡張がストライピングのトリガーになる場合(例:400GB超え)、変更中の数時間にわたってIOPSとレイテンシが大きく悪化することがあります。
DBエンジンとサイズの詳細はAWSのドキュメント[3]を参照してください。
どのストレージタイプを選ぶべきか
ほとんどのケースで、デフォルトの選択はgp3で問題ありません。以前は、IOPS要件が小さくても、安定した低レイテンシが必要であればAWSはio1を推奨していました。しかし現在は、io1もgp3も1桁ミリ秒のレイテンシを実現しています。違いは、io1がそれを99.9%の時間保証するのに対し、gp3は「99.0%」までしか保証しない点だけです。gp3はio1より最大73%安い(io1をgp3と同じベースラインで構成した場合)ことを考えれば、選択は明らかです。
io1を選ぶべきケース:
- 64,000を超えるIOPSが必要な場合
- 99.0%を超える安定性が必要な場合
稼働中DBのボリュームタイプを変更する
- 原則として、io1・gp2・gp3間の変更でダウンタイムは発生しません[2]
- ただし、変更は6時間に1回までです
注意点
- 400GBを超えるとストライピングが始まり、その処理中に大量のIOPSが消費されるため、レイテンシに大きな影響が出ることがあります。近いうちに拡張する見込みがあるなら、最初から400GBで作成するのがおすすめです。Oracleは200GBでストライピングしますが、MS SQL Serverはストライピングしません。
- RDSのストレージ自動スケーリングは予期せぬ挙動の原因になりやすい機能です。すべての制約[1]を把握しておきましょう。たとえば、意図しないタイミングでストライピングが発動することがあります。
- 現在のgp2ボリュームでは、AWSが料金以上のIOPSを提供しているケースがあります(特に長年運用してきたworkloadsで顕著です)。そのままgp3に切り替えると、こうした「おまけ」のIOPSを失い、性能が落ちる可能性があります。Cloudwatchで実際のIOPSが想定を超えていないか確認しておきましょう。
- インスタンスタイプごとのIOPS上限:すべてのRDSインスタンスには帯域幅とIOPSの上限があります。PIOPSの料金を払っていても、インスタンスサイズが小さいとスロットリングされます。インスタンスタイプ別の上限はAWS EC2のドキュメント[4]で確認できます。
例:
c6g.4xlargeは20,000 IOPSが上限。c7g.4xlargeは20,000 IOPSが上限ですが、40,000までバースト可能。
まとめ
RDSインスタンスのストレージタイプ選びは慎重に。多くの場合、io1ではなくgp3を選ぶことで、性能を落とさずに大幅なコスト削減が可能です。
参考文献:
[1] Managing capacity automatically with Amazon RDS storage autoscaling [2] Modifying an Amazon RDS DB instance
[3] Amazon RDS DB instance storage — Amazon R DS
[4] Amazon EBS–optimized instances — Amazon Elastic Compute Cloud
Frequently asked
questions
io1 + PIOPSは使うべき?
- 64,000~256,000 IOPS(または4,000 Mbpsを超えるスループット)が必要な場合に限ります
- I/Oの安定性として、gp2/gp3の99%ではなく99.9%が必要な場合
- 料金はgp2/gp3の270%増しになります
- AWSコンソールでは(一部の構成テンプレートで)io1がデフォルト表示されますが、gp3などに変更可能です。
gp2で新規にRDS DBを作るべきケースはある?
- あります。必要なボリュームサイズが4,000GBを超える場合です。このサイズではgp2のIOPSがgp3のベースラインを上回ります(上記の表を参照)。gp2のベースラインを超えるIOPSが必要なら、gp3で追加IOPSを購入したほうが安く済みます。
io1からgp3(またはgp2)に切り替えるべき?
- 切り替えるべきです。必要なIOPSが64,000未満なら、最大73%のコスト削減が見込めます(表を参照)。
gp2からgp3に切り替えるべき?
ケースバイケースです。
- 問題なく動いているなら、無理に変える必要はありません。コスト削減効果はなく、性能が悪化するおそれもあります(下記の注意点を参照)。
- ボリュームサイズが4,000GBを超える場合、gp3では(追加料金を払わない限り)IOPSが減ります。
- workloadsがgp2で得られる以上のIOPSを必要としているなら、gp3に切り替えて不足分のIOPSを追加購入しましょう。
- 注意:DB変更全般に言えることですが、まずDBをクローンして切り替えをテストするのがベストプラクティスです。gp3で期待どおりのIOPSとスループットが出ているか必ず確認してください。