はじめに
この記事は一休.com Advent Calendar 2023 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されました。
特徴
- 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時点の東京リージョンの価格
ストレージコストが10TB保存したとすると、23万のコストアップ...
クエリ単価ではExpressの方が安いので、S3に対して頻繁にアクセスされるようなケースではコストメリットがあると考えて良さそうですね。
S3 StandardとS3 Expressのパフォーマンスを比べてみる
お金を払ってまで早いのか...?
そこが気になるところ。
比較にあたって、以下のケースを検証してみました。
- 大きいデータのwrite/read比較
- 小さい大量データのwrite/read比較
2本勝負です!!やってみましょう
1. 大きいデータのread/write比較
検証用として、700MBの大きなファイルを用意して、データを読み書きしてみます。
まずはバケットへの書き込み(write)をS3 Standard/S3 Expressで比較してみます。
速度の測定はtimeコマンドで行いました。
S3 Standard(Write)
$ 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)
$ 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が2倍程度早い!
次はバケットからの読み込み(read)をS3 Standard/S3 Expressで比較してみます。
S3 Standard(Read)
$ 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)
$ 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文で1万件アップロードする簡易なscriptを動かして検証してみます。
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を使いました
まずはバケットへの書き込みをS3 Standard/S3 Expressで比較してみます。
S3 Standard(Write)
$ time python3 s3_put.py
real 8m10.806s
結果 8m10s
S3 Express(Write)
$ time python3 s3_put.py
real 1m26.347s
結果 1m26s
S3 Expressの圧勝でした
予想ではwriteは2倍程度かな...と思っていましたが、想像以上です。
次はバケットからの読み込みをS3 Standard/S3 Expressで比較してみます。
S3 Standard(Read)
$ 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.