ElastiCache Serverless の新機能「パブリックエンドポイント」のスループットを計測してみた

ElastiCache Serverless の新機能「パブリックエンドポイント」のスループットを計測してみた

ElastiCache for Valkey Serverless のパブリックエンドポイントの性能をレイテンシ・スループットで計測しました。接続を使い回せば VPC 内の Serverless とほぼ同水準で利用できます。都度接続では 200 倍以上遅くなるため、接続の使い回しが前提になります。
2026.10.02

はじめに

2026-09-29 に、ElastiCache for Valkey Serverless がパブリックエンドポイントに対応しました。これまで VPC 内からしか接続できなかった Serverless キャッシュへ、VPC 外の Lambda などから接続が可能になりました。

https://dev.classmethod.jp/articles/amazon-elasticache-serverless-public-endpoints/

どの程度の性能・スループットで Valkey を利用できるか確認するため、同じリージョンの EC2 からパブリックエンドポイントへ接続し、VPC 内の Serverless やノードベースのクラスターとレイテンシを比べます。

検証環境

クライアントは ap-northeast-1 の EC2(c8g.xlarge)で、valkey-glide 2.5.3(Python)の GlideClusterClient を使いました。接続先はすべて Valkey 9.0・クラスターモード有効で、次の 7 構成を用意しました。

構成 種別 ノードタイプ 経路 TLS 認証
N1 ノードベース cache.t4g.small VPC 直接 なし なし
N2 ノードベース cache.t4g.small VPC 直接 あり なし
N3 ノードベース cache.m8g.large VPC 直接 なし なし
N4 ノードベース cache.m8g.large VPC 直接 あり なし
SV1 Serverless — VPC 内(PrivateLink) TLS 1.3 なし
SV2 Serverless — VPC 内(PrivateLink) TLS 1.3 IAM
SP1 Serverless — パブリック(IGW) TLS 1.3 IAM

パブリックエンドポイントを使うのは SP1 だけです。SV2 は TLS と IAM 認証の条件が SP1 と同じで経路だけが VPC 内なので、経路の差を見る比較相手になります。N1〜N4 はノードベースのクラスターで、ノードタイプと TLS の有無による違いを見るためのものです。

測定方法

各構成に対し、GET と SET を半々に発行する 2 つのモードで測りました。

  • プールあり: 4 並列プロセスがそれぞれ 1 接続を持ち、20 秒間使い回す
  • 都度接続: 1 操作ごとにクライアントを作成し、操作後に閉じる

この記事で「コネクションプール」と呼ぶのは前者の方式で、作成した接続を閉じずに使い回すことを指します。複数の接続を貸し出す本格的なプール実装ではありません。

ベンチマークの接続部分は次のとおりです。IAM 認証は ServerCredentials に IamAuthConfig を渡して設定します。t はエンドポイント、ポート、TLS の有無、IAM ユーザー名、キャッシュ名を持つ接続先の設定です。

def make_config(t):
    creds = None
    if t.get("iam"):
        creds = ServerCredentials(
            username=t["iam_user"],
            iam_config=IamAuthConfig(
                cluster_name=t["iam_cluster_name"],
                service=ServiceType.ELASTICACHE,
                region=REGION,
            ),
        )
    return GlideClusterClientConfiguration(
        addresses=[NodeAddress(t["host"], t["port"])],
        use_tls=t["tls"],
        credentials=creds,
        request_timeout=5000,
    )

プールありはクライアントを 1 回だけ作成してループ内で使い回し、都度接続は操作ごとに作成と破棄を繰り返します。

if mode == "pool":
    client = await GlideClusterClient.create(cfg)
if mode == "pool":
    op = await one_op(client, rnd)
else:
    c = await GlideClusterClient.create(cfg)
    try:
        op = await one_op(c, rnd)
    finally:
        await c.close()

パブリックエンドポイントを使うには、次の条件があります。

  • Valkey 9.0 以降
  • IAM 認証と TLS 1.3 が必須
  • ConnectionType は作成時に決め、後から変更できない
  • ユーザーグループのすべてのユーザーが IAM 認証であること

SP1 はこの条件を満たすよう、次のコマンドで作成しました。--connection-type は AWS CLI 2.37.6 以降で使えます(2.37.5 では未対応でした)。

パブリックエンドポイント付き Serverless キャッシュの作成コマンド
aws elasticache create-serverless-cache \
  --region ap-northeast-1 \
  --serverless-cache-name <CACHE_NAME> \
  --engine valkey \
  --major-engine-version 9 \
  --cache-usage-limits 'DataStorage={Maximum=1,Unit=GB},ECPUPerSecond={Maximum=30000}' \
  --user-group-id <IAM_USER_GROUP_ID> \
  --connection-type public

<IAM_USER_GROUP_ID> には、すべてのユーザーが IAM 認証であるユーザーグループを指定します。

測定結果を読むうえでの制約は次の 2 点です。

  • クライアントは AWS 内(同一リージョンの EC2)です。AWS 外からの接続は経路が長くなるため、ここでの数値より遅くなりえます。
  • パブリックエンドポイントはクライアントと同じ AZ への接続が保証されません。今回の測定でクライアントと接続先の AZ が同じだったかは確認していないため、AZ をまたぐ環境では RTT が今回より大きくなる可能性があります。

測定結果

各構成・モードを 3 回ずつ実行しました。p50・p99・ops/s は 3 回の中央値、範囲は 3 回の最小〜最大、試行とエラーは 3 回の合計です。

プールありの結果です。エラーはどの構成でも 0 件でした。

構成 p50 (µs) p50 範囲 p99 (µs) p99 範囲 ops/s 試行
N1 259 257–264 544 519–568 14,128 843,588
N2 269 269–269 503 472–1,161 13,912 789,359
N3 151 150–153 273 264–295 24,506 1,469,488
N4 148 148–151 274 274–312 25,073 1,480,875
SV1 474 451–550 793 735–798 7,940 468,205
SV2 476 474–516 719 670–729 8,310 482,434
SP1 549 411–571 3,827 3,744–3,833 2,624 168,359

都度接続の結果です。

構成 p50 (µs) p50 範囲 p99 (µs) p99 範囲 ops/s エラー / 試行
N1 4,391 4,302–4,692 10,043 8,174–10,633 360 26 / 21,957
N2 20,844 20,838–20,869 29,092 28,540–42,314 189 0 / 11,235
N3 2,002 1,848–2,021 4,092 3,690–5,643 140 48 / 9,247
N4 8,661 8,513–8,695 13,286 12,991–14,456 87 36 / 5,277
SV1 13,170 13,100–13,364 20,596 20,106–5,011,883 50 20 / 2,757
SV2 23,430 23,027–28,184 1,128,621 1,123,318–1,133,108 40 16 / 2,358
SP1 111,719 109,367–126,695 1,052,986 995,786–1,158,488 18 0 / 1,129

都度接続のエラーは ClosingError: connection attempt timed out と RequestError: Connection in recovery で、エラー率はどの実行でも 1% 未満です。値には request_timeout(5,000 ms)でタイムアウトした操作の計測値も含まれています。ops/s はプールありの 1/39(N1)〜1/288(N4)に落ち、SP1 は 1/146 でした。

パブリックエンドポイントと VPC 内 Serverless の比較

SP1 と、認証条件が同じで経路だけが VPC 内の SV2 を、プールありの値で比べます。

指標 SV2(VPC 内) SP1(パブリック) SP1 ÷ SV2
p50 (µs) 476 549 1.15 倍
p99 (µs) 719 3,827 5.32 倍
ops/s 8,310 2,624 0.32 倍

p50 はほぼ並びました。p99 では SP1 が 3 回とも約 3.8 ms と SV2 の約 5 倍で、この遅い操作に接続が占有される分、ops/s は約 1/3 に下がっています。

なお、SP1 で接続を使い回さない場合の p50 は 111,719 µs で、プールありの 203.5 倍でした。

接続確立にかかる時間の内訳

都度接続でどこに時間がかかるかを見るため、接続の各フェーズを順に計時するスクリプト(probe.py)で、1 プロセスから 200 回ずつ接続しました。値は中央値です。

構成 DNS (µs) TCP (µs) TLS (µs) AUTH (µs) CLUSTER SLOTS (µs) GET (µs) 合計 (µs)
N1 164 256 0 0 354 223 1,014
N2 411 284 6,968 0 373 245 8,405
N3 162 120 0 0 188 125 587
N4 406 134 5,417 0 190 115 6,274
SV2 449 1,224 6,081 6,124 334 505 15,116
SP1 461 2,496 7,507 5,463 1,929 3,620 21,736

接続確立の時間を占めるのは TLS ハンドシェイクと IAM の AUTH です。TLS ありの構成では TLS に 5〜7.5 ms、IAM 認証ありの SV2・SP1 ではさらに AUTH に 5〜6 ms かかりました。両方が必須の SP1 は合計約 22 ms で、そのうち約 13 ms がこの 2 つです。TLS も認証もない N1・N3 の接続確立は 1 ms 以下でした。接続を使い回せば、このコストを払うのは最初の 1 回だけです。

まとめ

今回の測定では、同一リージョンの EC2 から ElastiCache for Valkey Serverless を利用する場合、接続を使い回せば、パブリックエンドポイントでも同一 VPC と同等のレイテンシで、スループットの低下も少ないことが確認できました(SP1: 2,624 ops/s、SV2: 8,310 ops/s)。Lambda のペイロードなどで Valkey の接続を使い回せる場合には、VPC Lambda を採用しなくても十分な性能で利用できる可能性があります。

一方、都度接続で 1 操作ごとに TLS と IAM 認証をやり直す使い方では、レイテンシとスループットが低下します。VPC 内 Serverless(SV2)の都度接続が 40 ops/s であるのに対し、パブリックエンドポイント(SP1)は 18 ops/s でした。

都度接続を改善できないワークロードで Valkey Serverless のパブリックエンドポイントを採用する場合は、必要な性能が出るか事前に十分評価することをおすすめします。評価の結果によっては、同一 VPC 内での利用や、IAM 認証を省いたプロビジョニング済みの Valkey を同一 VPC 内に置き、セキュリティグループでアクセスを制御する構成もご検討ください。

この記事をシェアする

関連記事