AWS・Google Cloud・Azureのストレージ比較:S3・Cloud Storage・Blobを特性から選ぶ
オブジェクト・共有ファイル・ブロックの違いから、S3・Cloud Storage・Azure Blob Storageの整合性、冗長化、アーカイブ、復旧、暗号鍵を比較。保存単価に加えて、取り出しと転送を含む費用を考えます。
まずオブジェクト・ファイル・ブロックを使い分ける
商品画像、既存の共有ファイルを使うバッチ、VM上のDBでは、同じ容量でも必要な操作が異なります。商品画像をキーで保存・取得するならオブジェクト、複数のクライアントが共有パスを読むならファイル、OSからディスクとして扱うならブロックが比較の出発点です。
| アクセス方式 | AWSの例 | Google Cloudの例 | Azureの例 |
|---|---|---|---|
| オブジェクトAPI | Amazon S3 | Cloud Storage | Azure Blob Storage |
| 共有ファイル | Amazon EFS(NFS)、FSxの各方式 | Filestore(NFS) | Azure Files(対応するSMB・NFS構成) |
| 永続ブロック | Amazon EBS | Hyperdisk / Persistent Disk | Azure Managed Disks |
オブジェクトをマウントできても、ロック・部分更新・rename・同時書き込みが既存のファイルシステムと同じとは限りません。NFS共有を無改修で使う要件なら、共有ファイルの候補で実際の操作を試します。ブロックを複数VMへ接続する場合も、対応構成とファイルシステム側の調停が必要です。
S3・Cloud Storage・Blob Storageの比較で固定する条件
| 候補 | 先に選ぶ設定 | 判断への影響 |
|---|---|---|
| Amazon S3 | バケットの方式、リージョン、保存クラス、必要な複製 | 単一ゾーン向け等のクラスもあるため、S3という名前だけで耐障害性を決めない |
| Cloud Storage | バケットの配置、保存クラス、保持と復旧の設定 | 配置とクラスを分けて確認し、マルチリージョンという名称だけでRPOを保証しない |
| Azure Blob Storage | ストレージアカウントの種類、冗長化、アクセス階層 | LRS・ZRS・GRS・GZRS等の設定で、障害の範囲と副リージョンへのアクセスが変わる |
以降は、商品画像の配信と過去の原本保存を考えます。オブジェクトのサイズ、保存期間、読み取り回数、リージョンをまたぐ通信、削除後に戻したい期間を固定します。各社で同じ容量だけを指定しても、アクセス方法と障害条件が違えば公平な比較になりません。
更新の整合性と、キャッシュ・複製先の見え方を分ける
S3はオブジェクトのPUT・DELETEに対する強いread-after-write整合性を提供し、Cloud Storageもオブジェクトの書き込み後の読み取りや一覧で強い整合性を提供します。ただし、公開画像をブラウザーやCDNがキャッシュしていれば、元のオブジェクトの更新後も古い版を返す経路が残ります。保存側の整合性と配信側のキャッシュ期間を別に設計します。
AzureのGRS・GZRSは副リージョンへの複製が非同期です。副リージョンを読み取るにはRA-GRS・RA-GZRS等の設定も確認し、主リージョンへの書き込み完了を、そのまま副リージョンでの最新読み取りとみなしません。これは通常の主エンドポイントの読み取りと、非同期コピーの話を分けるための比較です。
- 画像は内容の版を含むキーで保存し、DBにそのキーを記録する方式を検討する。同じキーの上書きとキャッシュ無効化だけに依存する場合は、古い表示が許される期間を決める。
- アップロード完了、検査完了、公開可能の状態を分ける。DBの公開状態とオブジェクト保存は別々に失敗し得るため、途中状態を回収する。
- 元の保存先、CDN経由、複製先それぞれで読み取りを試し、要求した版が返るかを確認する。
低頻度アクセスの比較:Archiveでも待ち時間は同じではない
| 方式の例 | 取り出すときの特性 | 費用・運用で見る点 |
|---|---|---|
| S3 Glacier Instant Retrieval | 即時アクセス向けのアーカイブクラス | 低頻度アクセスの条件、最低保存期間、取り出し等の料金 |
| S3 Glacier Flexible Retrieval / Deep Archive | 復元要求と待ち時間を伴うクラス | 復元方式、待てる時間、一時コピーと取り出し費 |
| Cloud Storage Archive | オフライン復元の待ちを設けずアクセス | 最低保存期間とデータ取り出し等の料金 |
| Azure Blob Archive | オンライン階層へのrehydrationが必要 | 取り出しまでの時間、優先度、最低保存期間と料金 |
過去の原本を画面操作からすぐダウンロードする要件と、翌日までに調査担当へ渡せればよい要件では、選べる階層が変わります。「古いデータだからArchive」と決めず、問い合わせから取得可能になるまでの時間を復旧目標へ含めます。保存クラスの変更後に、利用者の導線が実際に成立するかも試します。
冗長化・版の保護・暗号鍵を復旧の条件として扱う
ディスク故障、ゾーン障害、リージョン障害、誤削除は異なる故障です。AzureのLRSは単一データセンター内、ZRSは主リージョンの複数ゾーンへコピーします。GRS・GZRSの副リージョンへの複製は非同期なので、リージョン切り替えではデータ損失の可能性とアプリの再開手順を確認します。DBのHAとDRを分けるのと同じ考え方です。
最新状態を複製しているだけでは、正規の認証情報で実行された誤削除や上書きから戻せるとは限りません。版管理、削除からの保護、保持規則、必要な独立コピーを組み合わせます。復元時はオブジェクト単体だけでなく、その版を参照するDBの整合も確認します。
顧客管理の暗号鍵を使う場合、復旧にはデータだけでなく復号権限と鍵も必要です。たとえばCloud StorageのCMEKでは、新しい鍵バージョンへローテーションしても、既存オブジェクトは古い版へ依存したままです。依存を調べ、必要なrewriteと読み取り確認を終える前に旧鍵を破棄しないようにします。各社の鍵管理へこの製品固有の手順をそのまま流用せず、対象サービスの挙動を確認します。
故障の範囲とRTO・RPOを決める → 必要な版・コピーを取り出す → 復号とDBの参照を照合する → 配信・認可を確認して業務へ戻す
保存単価以外を数える:取り出し・転送・操作・旧版
仮に100万個の原本があり、1個10 MB、MBは10の6乗バイトとします。現行版は10,000 GB、月に10%を1回ずつ取り出すなら1,000 GBと10万回の読み取りです。旧版を平均2つ残す仮定なら、単純化した合計保存量は現行版の3倍の30,000 GBです。実際には版ごとのサイズと保持期間で変わります。
total = storage(current_versions + retained_versions + replicas)
+ requests(reads + writes + list + transitions)
+ retrieval + restore + transfer
+ early_deletion_or_minimum_duration_charges
+ key_management + operationsここでreplicasは別途保存料が発生する構成上のコピーです。サービスの単価に含まれる内部の冗長コピーを、利用者が本数分だけ掛け直すものではありません。読み取りの1,000 GBも、そのままインターネット送信量になるとは限らず、アプリ内利用やCDNのキャッシュを経路ごとに分けます。最低保存期間より早く消すデータ、監査用の旧版、障害時の一括復元を含め、代表的な一か月と復旧時を見積もります。
採用前に試す3つのケース
- 商品画像:アップロード途中の停止、公開前の検査、更新直後の表示、期限付きアクセスの失効後を確認する。
- 原本の保管:低頻度階層へ移した実データを取り出し、待ち時間・請求項目・利用者への案内を確認する。
- 復旧:誤削除した版、リージョンが使えない場合、鍵へのアクセスが失われた場合を分け、復旧できる条件と担当を記録する。
操作・冗長化・取り出しを確認する一次資料
- Google Cloud — AWS / Azure / Google Cloud service comparison
- Google Cloud — Storage strategy
- AWS — Amazon S3 overview and consistency
- Google Cloud — Cloud Storage consistency
- Microsoft Learn — Azure Storage redundancy
- AWS — S3 storage classes
- Google Cloud — Cloud Storage classes
- Microsoft Learn — Blob access tiers
- Google Cloud — Cloud Storage customer-managed encryption keys