新登場した AWS Provisioned IOPS SSD (io2) EBS ボリュームを io1 や gp2 と比較する

#はじめに
2020/8/25 の AWS アップデートで、新しく **Provisioned IOPS SSD (io2)** EBS ボリュームがリリースされました。
本記事では、この新しい io2 EBSボリュームについて掘り下げます。

# そもそも Provisioned IOPS SSD ボリュームとは
Provisioned IOPS SSD ボリュームは、ストレージのパフォーマンスと一貫性が重視される、I/O集中型のワークロード、特にデータベースワークロードのニーズに適します。

ここで、gp2、io1、io2 の違いに触れながら、仕様の違いを整理します。

## gp2 と io1 / io2 の違い
汎用 SSD ボリューム (gp2) では、**ボリューム容量あたり 3 IOPS** のベースラインパフォーマンスと、初期 I/O クレジットバランス (540 万 I/O クレジット) が設定され、ベースラインパフォーマンスを超える場合にクレジットを消費して、**3,000 IOPS までバースト**できます。(ボリューム容量が 1,000 GB までの場合。大体のユースケースは 1,000 GB 未満でしょう。)
io1 および io2 ボリュームでは、ボリュームの作成時に**一貫した IOPS レート**を指定できます。

# io1 と io2 の 違い
## 耐久性
io1 ボリュームは、**年間障害率 (AFR) が 0.2 ％ 以下**で 99.8 〜 99.9 ％のボリューム耐久性を提供するように設計されています。
これは、**1 年間で実行中のボリューム 1,000 あたり最大 2 つのボリューム障害**に相当します。

io2 ボリュームは、**AFR が 0.001 パーセント以下**で、99.999 パーセントのボリューム耐久性と提供するように設計されています。
これは、**1 年間で実行中のボリューム 100,000 あたり 1 つのボリュームの障害**に相当します。

**つまり、io2 の方が 100 倍耐久性が高いと言えます。** 

## ボリュームサイズと IOPS
io1 および io2 ボリュームのサイズは、4 GB から 16 TB の範囲です。
Nitro システム上に構築された EC2 インスタンスでは、ボリュームあたり 100 IOPS から 最大 64,000 IOPS、他のインスタンスでは最大 32,000 IOPS をプロビジョニングできます。

プロビジョニングされた IOPS と要求されたボリュームサイズ (GB) の最大比率は、io1 ボリュームで 50:1、io2 ボリュームでは 500:1 となります。
つまり、言い換えると **1 GB あたりの最大 IOPS は、io1 の場合 50 IOPS で、io2 の場合は 500 IOPS となります。**

実際に画面を見てみましょう。

io1 で 4 GB のボリュームを作ろうとした場合、比率に基づけば、最大は 200 IOPS ですから、2000 IOPS を設定しようとすると、警告が出て設定できません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211986/efae3d65-e77d-f2b3-8c30-7e7f02d3126b.png)
**io2 では、4 GB のボリュームでも 2000 IOPS まで設定できます。**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211986/f93d9112-29f3-ad85-5eea-15eca78cb24e.png)

この仕様に基づき計算すると、Nitro システム上の EC2 インスタンスでは、最大の 64,000 IOPS をプロビジョニングしようとした場合、io1 では 1,280 GB 必要ですが、io2 では 128 GB で良いことになります。 

また、100 IOPS から 32,000 IOPSまでの間でプロビジョニングされた io1 および io2 ボリュームの最大 I/O サイズは、256 KB となり、最大スループットは 500 MB/s となります。
32,000 IOPS を超え、64,000 IOPS までの間でプロビジョニングされたボリュームは、16 KBの最大 I/O サイズをサポートし、IOPS 値に比例して、1,000 MB/s までスループットが伸びます。

## 価格
なんと io1 と io2 は同額です。

```
$0.125/GB-month
$0.065/provisioned IOPS
```

つまり、io1 と費用が変わらず、耐久性とボリュームサイズあたりの性能で io2 が上になるため、今から io1 を作るくらいなら、io2 にした方が良いと言えます。

# io1 から io2 に変更する
EBS ボリュームの管理画面から「ボリュームの変更」操作をするだけです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211986/cbd582c2-1bab-6841-8d1b-de51508a5318.png)

# io2、io1、gp2の比較表
違いをまとめると、次のようになります。

| ボリュームタイプ | io2 | io1 | gp2 |
|:--|:--|:--|:--|
| 耐久性  | **99.999 %**  | 99.8 % - 99.9 %  | 99.8 % - 99.9 % |
| ボリュームサイズ  | 4 GB - 16 TB | 4 GB - 16 TB | 1 GB - 16 TB  |
| 最大 IOPS | 64,000 IOPS | 64,000 IOPS | 16,000 IOPS |
| 最大スループット  | 1,000 MB/s  | 1,000 MB/s | 250 MB/s |
| GB あたりの価格 | $0.125 | $0.125 | $0.10 |
| IOPS あたりの価格 | $0.065  | $0.065 | $0  |

# まとめ
新たにリリースされた io2 は、io1 よりも耐久性が高く、ボリュームサイズあたりの性能を高めることもできます。
DB サーバやファイルサーバでは、高信頼性を求められることが多く、io2 を採用することで、さらに信頼性を高めることができます。

さらに、io2 の価格は io1 と同じですので、耐久性を上げるために、io1 を利用されている場合は io2 に切り替えた方が良いでしょう。

# 参考文献
* [New EBS Volume Type (io2) – 100x Higher Durability and 10x More IOPS/GiB](https://aws.amazon.com/blogs/aws/new-ebs-volume-type-io2-more-iops-gib-higher-durability/)
* [Provisioned IOPS SSD (io1 and io2) volumes](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-volume-types.html#EBSVolumeTypes_piops)