あらためてS3のデータ整合性モデルを整理してみる(2018年11月現在)
いつも"アジャイル"とか"スクラム"、"カイゼン"みたいな文脈で書いているのですが、 普段の業務の中での関わりが大きいAWSについても書いていこうかと思います。
とある出来事
私の勤める会社のSlackには「困りごとch」というものを設けています。 先日、そこにこんな投稿がありました。
ruby aws-sdkで困りごと s3にオブジェクト登録→ラムダ発火でapi叩く→そのs3オブジェクトにアクセス(deniedされる)→1秒sleep→同じs3オブジェクトにアクセス(成功) なぜすでにあるオブジェクトにアクセスしているのにdeniedされてしまうのか、 一秒待つとdeniedされないのか、わからなくて困っています。
「ああ、あれじゃん!」 と思う方、その通りです。
AWS S3 のデータ整合性モデルに絡んだ話です。
公式のデータ整合性モデル
AWS自体が日進月歩の世界なので、この記事もすぐに廃れてしまうわけですが、 現状を整理しておきます。
ポイント1:もうリージョンごとの差異はない
2015年時点ではこのデータ整合性モデルは
- US Standardリージョン
- それ以外
で一部の挙動が異なっていました。
しかし、2018年11月現在ではこれが解消され、全てのリージョンで統一されています。
※2015年8月にアップデートされました。
ポイント2:オペレーション内容によって異なる
データ整合性モデルはどんなオペレーションを行うかによっても異なります。 具体的には
- 新規登録(New PUTs) = 書き込み後の読み込み整合性
- 更新(Overwrite PUTs) = 結果整合性
- 削除(DELETE) = 結果整合性
という3パターンがあります。
ポイント3:「書き込み後の読み込み整合性」と「結果整合性」の違い
ここで、独自の言葉が2つ出てきました。 この二つの意味はというと
- 書き込み後の読み取り結果整合性 = 登録後すぐにオブジェクトを参照できる(書き込んだ後の読み取りがすぐにできる)
- 結果整合性 = 動作後に読み込みをしても動作前の状態が参照される場合がある(その時点での結果次第)
つまり、ここまでを整理すると
「新規登録したオブジェクトはすぐ参照できるが、それ以外は即時には反映されないこともあるよ」
ということです。
とはいえ、実際は違う!
ここまではあくまで公式で発表されている内容です。Solution Architectの試験などの範囲でもあります。 ただ、これだけを信じていると実際の現場ではハマります!!
そうこれが困りごとchに流れてきた事象です。
端的にお話しすると
「書き込み後の読み込み整合性」とはいっても、書き込みが終わらなきゃ読み込みはできない
ということです。 オブジェクトの新規作成についてはオブジェクトのサイズや種類によらず、書き込み後の読み込み整合性を宣言しています。
しかし、実際はS3に格納後、アクセスできるようになるためにはS3内部で何かしらの処理が行われているので、 稀にアクセスできないことがあります。
これは、いろんなところでも言われています。
こちらの記事より
新しいオブジェクトを Amazon S3 に書き込み、すぐに読み取りを試みます。変更が完全に反映されるまで、Amazon S3は「キーが存在しません」というレポートを表示する場合があります。 新しいオブジェクトを Amazon S3 に書き込み、すぐにバケット内のキーのリストを表示します。変更が完全に反映されるまで、オブジェクトがリストに表示されないことがあります。
そして公式にも
Amazon S3 では、すべてのリージョンで S3 バケットの新しいオブジェクトの PUTS については "書き込み後の読み込み" 整合性を提供しますが、注意点があります。注意点は、オブジェクトを作成する前に (オブジェクトが存在するかどうかを調べるために) キー名への HEAD または GET リクエストを実行する場合、Amazon S3 は、読み込み後の書き込みに対して結果整合性を提供する、という事です。
ドキュメントだけじゃなく、触ってみよう
ということで、ドキュメントで理解できること以外に実際に触ってみると「あれ?」と思うことや「おや?」と思うことがあります。 なので、一番は自分で触ってみること。そして悩んだら、サポートに問い合わせたり、聞いてみること。
そうすることで、知見が広がり、世の中のみんながハッピーになります。
というわけで、誰かの参考になればと思います。