Object Storage(S3, GCS, BlobStorage）の比較まとめ -2020年版-

オブジェクトストレージはS3、1つとってもストレージクラスの複雑さもさることながら、クラウド間比較をするとさらに複雑になります…

一定以上の規模になると数％の差でもバカにならない差額になってくるので、主要なクラウドのオブジェクトストレージについての比較と短評をまとめたいと思います。積年暖めたものではないので、ミス等ありましたら是非ともご指摘ください。

## はじめに
**通貨は米ドル、リージョンは日本/東日本**を既定路線とし、料金ラダーがある場合は最も小さい利用量の価格帯にて比較します。また、比較を容易にするために、似ているけれども異なる言い回しをしている部分は用語統一を優先とし、多少不正確な表現を使うことがあるかもしれません。マルチリージョンについては複雑な割に一般的にはあまり利用されない事も多いので、細かなものは省きます。[^multi-region]

## 大まかな特徴

### Amazon S3

言わずと知れた[Amazon S3](https://aws.amazon.com/jp/s3/?nc=sn&loc=1)です。主な特徴は以下の通り。

- ストレージクラス（速度と冗長性の組み合わせ）の主要な選択肢は5種類
- ストレージクラスに内包されているが、ゾーンはシングル/マルチの2種類
- マルチリージョン化する場合は非同期レプリケーション（CRR/SRR）を使用し実現可能
- 料金は0.002USD/GB〜0.025USD/GBまでの10倍以上のレンジ
- S3標準には最低利用期間がなく、料金計算には月の平均を使われるため実質日割り[^aws-kakin]
- Athena等の有力なマネージドサービスから直接アクセス可能
- S3 Intelligent - Tieringで自動でストレージクラスを変更することも出来る

### Google Cloud Storage

GCPのオブジェクトストレージ、[GCS](https://cloud.google.com/storage?hl=ja)の主な特徴。

- ストレージクラス（速度のみ）は4種類
- マルチリージョンは選択可能で、ストレージクラスと組み合わせることになる
- シングルゾーンでの低価格化はできなさそうだが、シングルリージョンの低頻度(Nearline)でもS3のシングルゾーン低頻度(Z-IA)と同等
- 料金は0.0025USD/GB〜0.023USD/GBまでのAWSよりちょっと狭い10倍程度のレンジ
- **Standardの最低期間がなく、課金は秒単位**なので、一時利用にめっぽう強い
- BigQueryの外部テーブルとして直接アクセス可能

### Azure Blob Storage

翻訳のゆらぎなのか、見る場所によって微妙に名前が違うように思いますが、Azureのオブジェクトストレージである[Azure Blob Storage](https://azure.microsoft.com/ja-jp/services/storage/blobs/)について。

- ストレージクラス（速度のみ）は主要なものは3種類+特殊1種類
- ゾーン&リージョンを配置する冗長性が主要3種類あり、ストレージクラスと組み合わせ
- 特殊ストレージクラスのPREMIUMが特徴的（価格は10倍以上に跳ね上がる代わりに、性能が高くリクエスト料金が半減する）
- 料金は0.002USD/GB〜0.218USD/GBで**100倍以上の広い幅**
- Hotには最低利用期間がなく、料金計算には1日平均を使われるため実質日割り[^azure-kakin]
- 1年/3年の容量コミットの**長期契約で大幅にコストを下げられる**
- Athena/BigQuery対抗のマネージドサービスData Lake Analyticsで分析可能ではあるが、ちょっと毛色が違う…

## ユースケース別
一般的と思われるユースケースを抽出してみましたが、まず最初にストレージクラスを選定する上で特に地雷となるポイントについて、先に整理したいと思います。

#### 最低期間
ファイルを作成してから変更・削除するまでの期間。**安くなるストレージクラスは30日以上が設定されているケースがほとんど**なので、それ以上保持できないケースは原則としてこの制限がないものを選ぶ。

#### 取り出し料金
低頻度に分類されるストレージクラスに多いですが、読み出しに料金がかかります。**1ヶ月に1度取り出すとそれだけで割高になる**ので、めったに取り出さないことを確認する必要がある。


### 標準的な利用
読み書きを一般的な頻度で行うケースで、他のユースケースのように絞り込めない場合はこちらになります。

|プラットフォーム|サービス名|月額料金        |最低期間|備考    |
|:---------:|:------:|:---------:|:-----:|:-----:|
|AWS        |S3標準   |0.025USD/GB|実質1日 |
|GCP        |Standard|**0.023USD/GB**|**実質1秒**||
|Blob       |Hot/ZRS |0.025USD/GB|実質1日 |長期コミット割引あり|

### 一時的な保存
変換する際の一時的な保管等で、短期間で削除したいし、耐久性もさほど要らないというケースです。

|プラットフォーム|サービス名|月額料金        |最低期間|備考    |
|:---------:|:------:|:---------:|:-----:|:-----:|
|AWS        |S3標準   |0.025USD/GB|実質1日 |Z-IAだと最低期間と取り出し料金がつくため不利|
|GCP        |Standard|0.023USD/GB|**実質1秒**||
|Blob       |Hot/LRS |**0.02USD/GB**|実質1日  |長期コミット割引あり|

### 低頻度アクセス
アーカイブしてしまうと困るけれど原則としてアクセスすることは無いケースです。変更削除も少なめ想定。

|プラットフォーム|サービス名|月額料金        |取り出し料金|最低期間|備考    |
|:---------:|:------:|:---------:|:-----:|:-----:|:-----:|
|AWS        |S3 IA |0.019USD/GB|0.01USD/GB|30日|多重度が要らなければZ-IAで良い|
|GCP        |Nearline|**0.016USD/GB**|0.01USD/GB|30日|より取り出しする可能性が低く、長期保管可能であればColdlineの方が安い|
|Blob      |Cool/ZRS |0.01875USD/GB|0.01USD/GB|30日 |長期コミット割引あり。多重度要らなければLRSで下げられる|


### 長期アーカイブ
いざというときにデータとしての取り出しさえできればよくて、基本的には保管しっぱなしのケースです。リストアには時間がかかったり、追加のお金で早くなったりしますがその辺りは割愛します。

|プラットフォーム|サービス名         |月額料金        |取り出し料金|最低期間|標準取り出し|備考    |
|:---------:|:--------------:|:---------:|:-----:|:-----:|:-----:|:-----:|
|AWS        |S3 Deep Archive |**0.002USD/GB**|**0.011USD/GB**|180日   |12時間以内||
|GCP        |Archive         |0.0025USD/GB|0.05USD/GB|365日|**1秒以内**||
|Blob      |Archive/LRS     |**0.002USD/GB**|0.022USD/GB|180日   |15時間以内|長期コミット割引あり|

## まとめ
特定のパブリッククラウドが恐ろしく不利ということは無いですが、以下に該当するケースでは注意が必要なので、乗り換えも検討に入れた方がよさそうです。

- 長期に渡って利用が確定していて単価を下げたい -> Azureの3年契約だと最大で40%程度削減可能
- アーカイブだけれど、必要になったらすぐに取り出したい -> GCPのArchiveが突出しています（取り出し料金も高いけれど）

## その他
各社とも、**長期アーカイブはリージョンを選ぶと東京の半額程度**となっているため、本当のバックアップ用途であればリージョン選びから検討した方がよいかもしれない。ただ、リージョン間転送の料金もかかったりするので、保管期間と転送経路（料金）の兼ね合いを計算する必要があります。

## 参考
- [AWSストレージクラス一覧](https://aws.amazon.com/jp/s3/storage-classes/?nc=sn&loc=3)
- [GCSストレージクラス一覧](https://cloud.google.com/storage/pricing)[^english-only]
- [Blobストレージクラス一覧](https://docs.microsoft.com/ja-jp/azure/storage/blobs/storage-blob-storage-tiers?tabs=azure-portal)


[^multi-region]: GCPのDual RegionやAzureのRA-GRSのようなマルチリージョンに対しさらなる意味づけをしたもの
[^aws-kakin]: 月全体を通じて使用される平均ストレージです。これには、お客様のアカウントで、お客様が作成したバケット内に格納されるすべてのオブジェクトデータやメタデータが含まれる（[FAQ](https://aws.amazon.com/jp/s3/faqs/#Billing)に記載）
[^azure-kakin]: ストレージ容量は、1か月にわたり、保存されていたデータ量の1日あたりの平均(GB単位)を基準に請求（[FAQ](https://azure.microsoft.com/ja-jp/pricing/details/storage/)に記載）
[^english-only]: 英語ドキュメントしか更新されておらず、日本語は価格が古かったり、サービスが載っていなかったりします