re:Invent 2023 で発表されたAmazon S3 Express One Zoneを使ってみる

# はじめに

この記事は[一休.com Advent Calendar 2023](https://qiita.com/advent-calendar/2023/ikyu) 7日目の記事です。
AWS re:Invent 2023で発表されたAmazon S3 Express One Zoneの検証をしてみたいと思います。

# Amazon S3 Express One Zoneとは？

2023/11/28にAWSから新しいストレージクラスであるAmazon S3 Express One Zoneが発表され、その日のうちに東京リージョンにもGAされました。

https://aws.amazon.com/jp/blogs/aws/new-amazon-s3-express-one-zone-high-performance-storage-class/


## 特徴
- S3 Standard ストレージ クラスよりも最大 10 倍優れたパフォーマンスを提供するように設計されている
- 1秒あたり数十万のリクエストをサポートしている
- S3 Standard ストレージ クラスよりも 50% 低いリクエストコスト

データを比較的短期間保持して、その間に非常に頻繁にアクセスする用途に向いているそうです。

## 制約
- バケット名に必ずアベイラビリティゾーンIDを指定する必要がある
- データの保存先は1ゾーンに限られるため、保存しているアベイラビリティゾーンに障害が起きるとデータが失われる可能性がある
- データ保存料金がStandardと比較して高い

パフォーマンスが上がる一方、可用性が下がるためユースケースに合った使い方が必要です。
使える用途としては、消えても復元できるようなデータに限られそうですね。


## コスト

|  | S3（Standard） | S3（Express） |
|:----------:|:--------:|:--------:| 
| ストレージ料金（GB単価） | 0.025USD | 0.18USD | 
| PUT, COPY, POST, LIST | $0.0047/1,000 requests |  $0.0024/1,000 requests | 
| GET, SELECT | $0.00037/1,000 requests | $0.00019/1,000 requests | 

※ 2023/12/6時点の東京リージョンの価格

https://aws.amazon.com/jp/s3/pricing/?nc=sn&loc=4#:~:text=Requests%20%26%20data%20retrievals

ストレージコストが10TB保存したとすると、23万のコストアップ...
クエリ単価ではExpressの方が安いので、S3に対して頻繁にアクセスされるようなケースではコストメリットがあると考えて良さそうですね。


# S3 StandardとS3 Expressのパフォーマンスを比べてみる

お金を払ってまで早いのか...？
そこが気になるところ。

比較にあたって、以下のケースを検証してみました。

1. **大きいデータのwrite/read比較**
2. **小さい大量データのwrite/read比較**

２本勝負です！！やってみましょう

## 1. 大きいデータのread/write比較

検証用として、700MBの大きなファイルを用意して、データを読み書きしてみます。

まずはバケットへの書き込み（write）をS3 Standard/S3 Expressで比較してみます。
速度の測定はtimeコマンドで行いました。

#### S3 Standard（Write）
```bash
$ time aws s3 cp test.gz s3://s3-standard-test/
upload: ./test.gz to s3://s3-standard-test/test.gz

real	0m5.218s
```
結果 **5.2s**
#### S3 Express（Write）
```bash
$ time aws s3 cp test.gz s3://s3-express-test--apne1-az4--x-s3/
upload: ./test.gz to s3://s3-express-test--apne1-az4--x-s3/test.gz

real	0m2.321s
```
結果 2.3s
**S3 Expressが２倍程度早い！**


次はバケットからの読み込み（read）をS3 Standard/S3 Expressで比較してみます。
#### S3 Standard（Read）
```bash
$ time aws s3 cp s3://s3-standard-test/test.gz .
download: s3://s3-standard-test/test.gz to ./test.gz

real	0m3.756s
```
結果 **3.7s**
#### S3 Express（Read）
```bash
$ time aws s3 cp s3://s3-express-test--apne1-az4--x-s3/test.gz .
download: s3://s3-express-test--apne1-az4--x-s3/test.gz to ./test.gz

real	0m3.918s
```
結果 **3.9s**

**S3 Standardの方が若干早そう**
ちなみに、疑って数回試行してみましたが、結果変わらずStandardの方が早かったです。
なぜだろう...


## 2. 小さい大量データのread/write比較

小さい大量データの読み書きをしてみます。
3〜5KB程度のファイルをfor文で１万件アップロードする簡易なscriptを動かして検証してみます。

```python
import boto3
import json
import gzip
import io

s3 = boto3.resource("s3",region_name="ap-northeast-1")
bucket="test-bucket"
filename="test10000count.gz"
f = gzip.open(filename, 'r')

for row in f.readlines():
    d = json.loads(row)
    s3.Bucket(bucket).put_object(Key=f'{d["filekey"]}.text', Body=row)
```
※boto3 versionは1.33.8を使いました

https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3/client/get_object.html


まずはバケットへの書き込みをS3 Standard/S3 Expressで比較してみます。

#### S3 Standard（Write）
```bash
$ time python3 s3_put.py

real	8m10.806s
```
結果 **8m10s**
#### S3 Express（Write）
```bash
$ time python3 s3_put.py

real	1m26.347s
```
結果 **1m26s**

**S3 Expressの圧勝でした**
予想ではwriteは2倍程度かな...と思っていましたが、想像以上です。


次はバケットからの読み込みをS3 Standard/S3 Expressで比較してみます。
#### S3 Standard（Read）
```bash
$ time python3 s3_read.py

real	5m50.423s
```
結果 **5m50s**
#### S3 Express（Read）
```
$ time python3 s3_read.py

real	0m55.724s
```
結果 **55s**

**S3 Expressの圧勝でした**

6倍違うとは！！これはかなり使えそうです。


# 検証してみて
簡単な検証ですが、S3 ExpressはStandardと比べて全体的に早い結果が得られました。
さまざまなケースで活用できそうですね。

私的に使えそう！と思うケースは、分析用途で使っているAWS AthenaのストレージをS3 ExpressにすることでRead/Writeのクエリを高速化できて分析業務がもっと捗るかも？と思いました。
今度やってみようと思います！

End.