【2020年12月1日からの変更点】S3のデータ整合性モデル

# 本記事の目的
この記事では、AWSのS3のデータ整合性モデルについて記載します。
S3のデータ整合性モデルについて記載する前に、「S3とは何か」、「そもそもストレージとは何か」、「EBSやEFSとの違いは何か」を踏まえて段階的に理解しやすいように努めたいと考えております。

## そもそもS3とは
S3の正式名称は、Amazon Simple Storage Service（Amazon S3）になります。
名前に「Storage(ストレージ)」と記載されている通り、データを格納するAWSのサービスになります。
AWSのS3では、「バケット」と呼ばれるデータを格納する領域を作成して、そこのデータを格納します。

## ストレージの種類について
当然のように、ストレージと記載しましたが、先に進む前にここで一度ストレージとは何かという点に立ち返ってみたいと思います。
一般的には、「保管」、「倉庫」、「記憶装置」を意味します。
種類としては、以下の3種類が存在します。

1. ファイルストレージ
1. ブロックストレージ
1. オブジェクトストレージ

以下のURLにとても参考になる内容が記載されておりましたので、ご紹介いたします。

https://www.sbcloud.co.jp/entry/difference-between-object-storage-file-storage-block-storage

### 上記1. ファイルストレージについて
上記1のファイルストレージの特徴は、データを階層構造で保存・管理することに出来ることです。使用するプロトコルは、SMB、CIFS、NFS等になります。
ファイルサーバ上のファイルを操作する際に、直感的に操作することが出来ているのは、データを階層構造で保存・管理することが出来るためです。

### 上記2. ブロックストレージについて
上記2のブロックストレージの特徴は、データをボリューム・ブロック単位で保存・管理することが出来ることです。
以下のURLにとても参考になる内容が記載されておりましたので引用させていただきます。
> 記憶領域を「ボリューム」という単位に分割し、さらにボリュームを固定長の「ブロック」に分割する方法で管理するのが「ブロックストレージ」です。

https://www.ntt.com/business/services/application/online-storage/bst-sh/lp/article-file-storage.html

記憶領域は、サーバやパソコンのハードディスクを意味しておりますので、私はこれが「ブロックストレージ」であると理解しました。
上記1のファイルストレージの場合は、直感的にデータを保存することが出来たため、ブロックストレージにどうやって保存するの？という疑問が湧いてきましたが、実際には、ブロックストレージはファイルストレージの下位レイヤーとして存在すると考えています。
例えば、Linuxの場合、ブロックストレージ上にファイルシステムを構築することで、データを直観的に操作出来るようになります。

### 上記3. オブジェクトストレージについて
上記3のオブジェクトストレージの特徴は、データをフラット構造で保存・管理することが出来ることです。
「フラット」は「平ら」という意味になります。
階層構造ではないと構造であると理解しています。
使用プロトコルは、HTTP(s)になります。
データをフラット構造で保存することが出来るため、データに一意の識別子を持たせることが出来ると考えています。
その結果、HTTP(s)プロトコルを利用出来、例えば、Googleドライブ等のサービスとして利用できるようになると考えています。

## EBS、EFSとは何が違うの？
上記「ストレージの種類について」から、それぞれ以下のように整理しました。

| EFS |  EBS  | S3  |
| ---- | ---- | ---- |
| ファイルストレージ  |  ブロックストレージ  | オブジェクトストレージ  |

## S3のデータ整合性モデルについて
前置きが長くなりましたが、ようやく本題になります。

まず「データ整合性」の部分ですが、特に考えておく必要があるユースケースとしては、
「S3バケットにデータを保存する」、「S3バケットからデータを削除する」の2つと考えています。
この2つのユースケースにおいて、「いつデータが反映されるか」に着目することを「データ整合性」と表現しています。

結論から伝えますと、S3のデータ整合性モデルは、「強力な整合性」になります。
「強力な整合性」とは、「データの反映が即時で行われること」を意味します。
例えば、S3バケットにデータを保存、削除するとそれが即時に反映されることになります。
「強力な整合性」は、新規にS3バケットを作成する時だけでなく、既存のオブジェクトを上書きする時、そして削除する時にも適用されます。
公式ページにも記載されておりますので、引用いたします。

> Amazon S3 には、すべての AWS リージョン にある Amazon S3 バケットの、オブジェクトの PUT と DELETE に関する、書き込み後読み取りの強力な整合性があります。新しいオブジェクトへの書き込みと、既存のオブジェクトを上書きする PUT、そして DELETE にも適用されます。

https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/Welcome.html

「強力な整合性」が「データの反映が即時で行われること」を意味する場合、「それって当たり前じゃないの？」と思われる方もいらっしゃるかもしれません。しかし、以前は異なりました。
以下のURLによると、2020年12月1日以前は、「結果整合性」モデルでした。
正確には、新規にS3バケットにデータを保存する場合は、「強力な整合性」モデルでしたが、既存のS3バケットにデータを保存する場合、データを削除する場合は、「結果整合性」モデルでした。
「結果整合性」モデルとは、「結果的に整合性が保たれる」意味になります。
つまり、データを保存、削除した場合、時間はかかるけど、結果的にデータは反映されるよという意味になります。

この「結果整合性」モデルが、2020年12月1日より、「強力な整合性」に変更されました。
以下原文を引用しています。
>Effective immediately, all S3 GET, PUT, and LIST operations, as well as operations that change object tags, ACLs, or metadata, are now strongly consistent. What you write is what you will read, and the results of a LIST will be an accurate reflection of what’s in the bucket. This applies to all existing and new S3 objects, works in all regions, and is available to you at no extra charge! 

以下、日本語訳になります。
カッコいいなと感じましたので、上記、英語の原文を引用しましたが、私は英語が読めません。
日本語訳は、「DeepL 翻訳ツール」を利用しています。
>本日より、S3のGET、PUT、LISTのすべての操作、およびオブジェクトタグ、ACL、メタデータを変更する操作が強力に一貫性を持つようになりました。書いたものがそのまま読み込まれ、LISTの結果はバケットにあるものを正確に反映したものになります。これは、既存および新規のすべてのS3オブジェクトに適用され、すべてのリージョンで動作し、追加料金なしで利用できます。

https://aws.amazon.com/jp/blogs/aws/amazon-s3-update-strong-read-after-write-consistency/