🐕

S3とDynamoDBの読み込み速度を調べる(lambdaで)

2021/11/10に公開

はじめに

S3もDynamoDBも無料枠があり、小さなテキストを格納する場合どちらも利用できます。

自分はS3しか利用していなかったのですが、DynamoDBはレイテンシーに優れているとして、AWSのベストプラクティスによく出てきます。
一体どれくらい早いの?
ということが気になって調べてみました。

結論

S3の読み取り平均時間 0.14秒
DynamoDBの読み取り平均時間 0.03秒
なので、S3の4倍くらい早い

環境や条件、コードなど

測った時間 2021/11/10 21:00~21:05JST
lambda デフォルト(メモリ 128MB)

DynamoDBの設定

キャパシティーモード プロビジョンド
読み込みキャパシティーの Auto Scaling オフ
プロビジョンされた読み込みキャパシティーユニット 5
書き込みキャパシティーの Auto Scaling オフ
プロビジョンされた書き込みキャパシティーユニット 5

テーブルの中身

client_id NewValue2
s z

読み込みキャパシティユニット5なら、一回あたり20KBの読み込みができるはずです。
この小さなテーブルなら、読み込み一回分の時間が計測できているというつもりでいます。

DynamoDB読み込みコード

import time
import boto3
from boto3.dynamodb.conditions import Key, Attr

dynamodb = boto3.resource('dynamodb')
def lambda_handler(event, context):
    # 開始時間
    start_time = time.time()
    
    table_name = "device_properties"
    partition_key = {"client_id": "s"}
    dynamotable = dynamodb.Table(table_name)
    res = dynamotable.get_item(Key=partition_key)
    item = res["Item"]
    
    # 終了時間
    end_time = time.time()
    print("経過時間")
    print(end_time-start_time)
    
    return item

10回計測した結果

0.1777
0.0192
0.0045
0.0135
0.0114
0.0059
0.0182
0.0094
0.0169
0.0045

S3の設定

バージョニング オフ
暗号化 オフ
リージョン 東京

オブジェクトサイズは1KB

S3読み込みコード

import boto3
import time

BUCKET_NAME = 'test43245'
OBJECT_KEY_NAME = 's.txt'

s3 = boto3.resource('s3')

def lambda_handler(event, context):
    # 開始時間
    start_time = time.time()
    
    bucket = s3.Bucket(BUCKET_NAME)
    obj = bucket.Object(OBJECT_KEY_NAME)
    response = obj.get()    
    body = response['Body'].read()
    
    # 終了時間
    end_time = time.time()
    print("経過時間")
    print(end_time-start_time)
    
    return body

10回計測した結果

0.2805
0.1945
0.2005
0.1903
0.0369
0.1984
0.0323
0.0319
0.1843
0.0235

おわりに

最小サイズでの取得を試してみました。この条件ならDynamoDBがかなり早いみたいです。
このレイテンシーを活かしてみたいですね。
DynamoDBを使ったことがなかったのでいい経験になりました。

参考リンク
https://recipe.kc-cloud.jp/archives/10420
https://dev.classmethod.jp/articles/get-s3-object-with-python-in-lambda/

Discussion