Amazon ElastiCache は、AWS が運用するインメモリのキャッシュ(Valkey・Redis OSS・Memcached)です。 新しく作るなら、エンジンは Valkey、形は手軽な サーバーレス か、細かく決められる ノードベース を選びます。サーバーレスは TLS が必須で、クラスターモードでしか動きません。 接続コードは「TLS を有効にする」「クラスター対応のクライアントを使う」の2点が要です。

# サーバーレス(Valkey)に Python から接続する最小コード
from redis.cluster import RedisCluster

rc = RedisCluster(
    host="orders-xxxxxx.serverless.apne1.cache.amazonaws.com", port=6379,
    ssl=True,                                  # サーバーレスは TLS 必須
    username="app-user", password="...",       # RBAC のユーザー(使う場合)
    decode_responses=True,
)
rc.set("app:greeting", "hello", ex=60)
print(rc.get("app:greeting"))
項目 サーバーレス ノードベース
作り方 名前を決めるだけ(1分かからない) ノードの種類・数・AZ を決める
増減 自動(縦・横とも) 自分で決める(ノードの大きさ、シャード、レプリカ、Auto Scaling)
料金 保存量(GB 時間)+リクエスト(ECPU) ノードの時間単価
TLS 常に有効 有効・無効を選ぶ
クラスターモード 有効だけ 有効・無効を選ぶ
認証 RBAC(ユーザーとユーザーグループ)、IAM AUTH トークン、RBAC、IAM

確認環境:Valkey 7.2.13(Ubuntu 24.04 の apt パッケージ)を TLS 付きで動かし、単体(クラスターモード無効に相当)と3ノードのクラスター(クラスターモード有効に相当)、ElastiCache の RBAC と同じ形のアクセス文字列を持つユーザーを用意しました。Python 3.11 の redis-py 8.1.0・valkey-py 6.2.0、Java 21 の Jedis 8.0.2(GitHub のソースからビルド)で接続し、つながらないときのエラーを再現しています。ElastiCache の作成コマンドは AWS CLI 1.46.1 を moto 5.2.4 に向けて形を確かめ(create-serverless-cache は moto が対応していないため botocore 1.43.112 の Stubber で引数の形だけ)、ElastiCache 側の仕様・上限・料金は AWS のドキュメントと料金ページに基づいています(確認日 2026年10月13日)。

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「ElastiCacheの使い方|Valkey/Redisの作り方と接続コード」

Valkey と Redis OSS の関係

項目 内容(AWS のドキュメント・発表)
Valkey とは Linux Foundation が管理する、オープンソースのキーと値のデータストア。AWS の発表では「Redis OSS の置き換えとしてそのまま使える(drop in replacement)」
機能の互換 「Redis OSS 7.2 で使えるすべての機能は、Valkey 7.2 以上で既定で使える」。ElastiCache の Valkey 7.2 は Redis OSS 7.2.4 までの変更を含む
ElastiCache で選べる版 Valkey:7.2・8.0・8.1・8.2・9.0・9.1。Redis OSS:4.0.10〜7.1
料金 Valkey はサーバーレスで 33%、ノードベースで 20% 安い(他のエンジン比)
Valkey だけの機能 8.1 以降のブルームフィルター、8.2 以降のベクトル検索、9.0 以降の全文検索・耐久性(Durability)・サーバーレスのパブリックエンドポイントなど
移行 Redis OSS から Valkey へ、コンソールや modify-replication-group --engine valkey で切り替えられる

コマンドとプロトコルは同じなので、redis-py・Jedis などの Redis 用クライアントがそのまま使えます。 手元でも、redis-py と valkey-py(Valkey 用に分かれたクライアント)は同じ書き方で同じ Valkey に接続できました。Redis の基本的な使い方・データ型は、関連記事「Redisとは?使い方入門|データ型・キャッシュ・よくある失敗を実行結果で解説」で扱っています。

Redis OSS 4・5 は 2026年1月31日、6 は 2027年1月31日に標準サポートが終わり、その後は延長サポート(追加料金)になります(ドキュメントの表)。

サーバーレスとノードベースの選び方

こんなとき 向いている形
量が読めない、すぐ使いたい、運用を減らしたい サーバーレス
毎日ほぼ一定の量で、時間単価で安くしたい ノードベース(リザーブドノードも使える)
クラスターに対応していないクライアント・SELECT で DB 番号を切り替えている ノードベース(クラスターモード無効)
リージョンをまたぐ複製(Global Datastore)、データ階層化(r6gd) ノードベース
TLS に対応していないクライアント ノードベース(TLS の無効も選べる)

サーバーレスの増え方は、ドキュメントでは「Valkey 8.0 では 2〜3 分ごとに処理できるリクエスト数が倍になり、13 分以内に 1 キャッシュあたり 500 万 RPS」とされています。空のキャッシュでは 30,000 ECPU/秒(リードレプリカを使うと 90,000)から始まります。

作る前の準備:ネットワークとセキュリティグループ

ElastiCache(VPC 接続)は、同じ VPC の中(またはピアリング先)からしか接続できません。 アプリ用とキャッシュ用のセキュリティグループを分け、キャッシュ側でアプリのグループからの 6379(サーバーレスは 6380 も)を許可します。

VPC=vpc-0123456789abcdef0
APP_SG=$(aws ec2 create-security-group --group-name app-sg --description app --vpc-id $VPC --query GroupId --output text)
CACHE_SG=$(aws ec2 create-security-group --group-name cache-sg --description cache --vpc-id $VPC --query GroupId --output text)

# アプリのセキュリティグループから 6379-6380 を許可
aws ec2 authorize-security-group-ingress --group-id $CACHE_SG \
  --ip-permissions "IpProtocol=tcp,FromPort=6379,ToPort=6380,UserIdGroupPairs=[{GroupId=$APP_SG}]"
ポート(ドキュメント) 使い道
6379 サーバーレスのプライマリエンドポイント。ノードベースの既定
6380 サーバーレスの読み取り用(リードレプリカから読む)

サーバーレスは 6380 も開けておきます。 ドキュメントでは、読み取り用を使わなくても両方のポートにつなぐクライアントがあり、6380 が閉じていると接続に時間がかかる、とされています。セキュリティグループの操作は、関連記事「AWS CLIでセキュリティグループ設定|ルール追加・削除・確認」で扱っています。

作り方1:サーバーレス(CLI)

aws elasticache create-serverless-cache \
  --serverless-cache-name orders \
  --engine valkey \
  --major-engine-version 8 \
  --subnet-ids subnet-0aaa1111 subnet-0bbb2222 \
  --security-group-ids $CACHE_SG \
  --cache-usage-limits 'DataStorage={Maximum=10,Unit=GB},ECPUPerSecond={Maximum=50000}' \
  --user-group-id app-users

# 状態が available になるまで見る(CREATING → AVAILABLE)
aws elasticache describe-serverless-caches --serverless-cache-name orders \
  --query 'ServerlessCaches[0].[Status,Endpoint.Address,Endpoint.Port,ReaderEndpoint.Port]'
オプション(CLI リファレンス) 内容
--engine valkey・redis・memcached
--subnet-ids VPC エンドポイントを置くサブネット。アプリと同じ AZ にすると AZ をまたぐ遅れが出にくい
--security-group-ids 省くと VPC の既定のセキュリティグループ
--cache-usage-limits 保存量(GB)と ECPU/秒の上限・下限。費用の上限に使う
--user-group-id RBAC のユーザーグループ(既定は無し)。パスワードで認証するなら指定する
--snapshot-retention-limit 自動スナップショットを残す日数(最大 35)

上限に達したときの動き(ドキュメント):保存量の上限に達すると、TTL のあるデータから LRU で追い出し、追い出せるものが無ければ書き込みが OOM エラーになります。ECPU/秒の上限を超えるとリクエストが絞られます。上限の 75% でアラームを作ることが勧められています。

サーバーレスの Valkey 9.0 以降では、VPC を使わない パブリックエンドポイント(--connection-type public、IAM 認証のユーザーだけ、TLS 1.3)も作れます。

作り方2:ノードベース(CLI)

クラスターモード無効・プライマリ1台+レプリカ1台・TLS と AUTH トークン付きの例です。moto で作って形を確かめました。

# サブネットグループ(2つの AZ)
aws elasticache create-cache-subnet-group --cache-subnet-group-name cache-subnets \
  --cache-subnet-group-description "cache" --subnet-ids subnet-0aaa1111 subnet-0bbb2222

aws elasticache create-replication-group \
  --replication-group-id orders-cache \
  --replication-group-description "orders cache" \
  --engine valkey --engine-version 8.2 \
  --cache-node-type cache.t4g.micro \
  --num-cache-clusters 2 \
  --automatic-failover-enabled --multi-az-enabled \
  --cache-subnet-group-name cache-subnets \
  --security-group-ids $CACHE_SG \
  --transit-encryption-enabled --at-rest-encryption-enabled \
  --auth-token 'This-is-a-sample-token-0123'

aws elasticache describe-replication-groups --replication-group-id orders-cache \
  --query 'ReplicationGroups[0].NodeGroups[0].{Primary:PrimaryEndpoint,Reader:ReaderEndpoint}'
オプション 内容
--num-cache-clusters 2 ノード 2 台(プライマリ+レプリカ)。クラスターモード無効
--num-node-groups・--replicas-per-node-group クラスターモード有効にするとき(シャード数とレプリカ数)
--automatic-failover-enabled・--multi-az-enabled プライマリが落ちたときにレプリカを昇格。レプリカが要る
--transit-encryption-enabled TLS。AUTH トークン・RBAC を使うときは必須
--auth-token 16〜128 文字。記号は ! & # $ ^ < > - だけ
エンドポイント 接続先
プライマリエンドポイント(master.orders-cache.xxxx.apne1.cache.amazonaws.com) 書き込み・読み込み。フェイルオーバーしても名前は同じ
リーダーエンドポイント レプリカへの読み取り
設定エンドポイント(クラスターモード有効) クラスター対応のクライアントに渡す

アプリにはノードの名前ではなく、プライマリエンドポイント(クラスターモード有効なら設定エンドポイント)を渡します。 フェイルオーバーでノードの役割が入れ替わっても、名前は変わりません。

認証:AUTH トークン・RBAC・IAM

方式 使える所(ドキュメント) 接続コードで渡すもの
AUTH トークン ノードベースだけ。TLS が必要 password だけ
RBAC(ユーザー+ユーザーグループ) サーバーレス・ノードベース(Valkey 7.2 以上、Redis OSS 6.0〜7.2) username と password
IAM 認証 Valkey 7.2 以上、Redis OSS 7.0 以上。TLS が必要 username と、15 分有効のトークン

RBAC のユーザーは、アクセス文字列で使えるキーとコマンドを決めます。

aws elasticache create-user --user-id app-user --user-name app-user --engine valkey \
  --passwords 'Str0ng-Passw0rd-0123' \
  --access-string 'on ~app:* &* +@all -@dangerous'

# default ユーザーを「無効」にした別ユーザーに置き換える(user-name は default)
aws elasticache create-user --user-id app-default --user-name default --engine valkey \
  --passwords 'Another-Str0ng-Passw0rd' --access-string 'off ~* -@all'

aws elasticache create-user-group --user-group-id app-users --engine valkey \
  --user-ids app-default app-user
アクセス文字列 意味
on / off 有効・無効
~app:* app: で始まるキーだけ
&* すべての Pub/Sub チャンネル
+@all -@dangerous すべてのコマンドから、FLUSHALL・KEYS・INFO などの危険なものを除く
-@all +@read 読み取りのコマンドだけ

ユーザーグループには default という名前のユーザーが必ず要ります。 ドキュメントでは、すべてのコマンドとキーを使える既定の default ユーザーを、無効にした(または強いパスワードの)default ユーザーに置き換えるよう書かれています。

手元の Valkey に同じアクセス文字列のユーザーを作ると、範囲外の操作は次のエラーになりました。

redis.exceptions.NoPermissionError: No permissions to access a key                       ← other:key に SET
redis.exceptions.NoPermissionError: User app has no permissions to run the 'flushall' command
redis.exceptions.NoPermissionError: User app has no permissions to run the 'info' command

INFO も @dangerous に入るので、監視ツールで使うユーザーには別のアクセス文字列を用意します。

Python から接続する(redis-py・valkey-py)

import os
import redis
from redis.cluster import RedisCluster

HOST = os.environ["CACHE_HOST"]
USER = os.environ.get("CACHE_USER", "app-user")
PASSWORD = os.environ["CACHE_PASSWORD"]          # Secrets Manager などから
CA = os.environ.get("CACHE_CA")                  # ElastiCache では不要(公的な CA の証明書)

common = dict(
    username=USER, password=PASSWORD,
    ssl=True, ssl_ca_certs=CA,
    socket_connect_timeout=3, socket_timeout=3,
    decode_responses=True,
)

# ① ノードベース・クラスターモード無効(プライマリエンドポイントに接続)
r = redis.Redis(host=HOST, port=6379, **common)
print("standalone PING:", r.ping())
r.set("app:greeting", "hello", ex=60)
print("GET:", r.get("app:greeting"), "TTL:", r.ttl("app:greeting"))

# ② サーバーレス・クラスターモード有効(クラスター対応のクライアント)
rc = RedisCluster(host=HOST, port=6379, **common)
print("cluster PING:", rc.ping())
for i in range(6):
    rc.set(f"app:user:{i}", i)
print("keys on nodes:", {n.port: n.redis_connection.dbsize() for n in rc.get_primaries()})
print("MGET same slot:", rc.mget("app:{cart:42}:items", "app:{cart:42}:total"))

TLS 付きの Valkey(単体を 6390、3ノードのクラスターを 7001〜7003 で起動)に向けた出力です。

standalone PING: True
GET: hello TTL: 60
cluster PING: True
keys on nodes: {7001: 1, 7002: 1, 7003: 4}
MGET same slot: [None, None]

6 つのキーが3ノードに分かれて入りました。{cart:42} のように {} で囲んだ部分(ハッシュタグ)が同じキーは、同じスロット(同じノード)に入ります。 複数キーをまとめて扱う MGET・トランザクション・Lua は、同じスロットのキーだけで使えます。

項目 書き方
TLS ssl=True。ElastiCache の証明書は公的な CA なので ssl_ca_certs は不要
AUTH トークン(ノードベース) password だけ渡す
RBAC username と password
サーバーレス・クラスターモード有効 RedisCluster(valkey-py なら ValkeyCluster)
接続を使い回す クライアントはプロセスで1つ作って使い回す(中で接続プールを持つ)

valkey-py は import 名が変わるだけです。

import valkey
from valkey.cluster import ValkeyCluster

v = valkey.Valkey(host=HOST, port=6379, username=USER, password=PASSWORD, ssl=True, decode_responses=True)
vc = ValkeyCluster(host=HOST, port=6379, username=USER, password=PASSWORD, ssl=True, decode_responses=True)

手元では valkey-py: 6.2.0 True True v(PING・SET・GET)、クラスターの GET app:user:3 も 3 が返りました。Lambda から使う場合は、関連記事「AWS Lambda Python入門|3.14対応handler例とローカルテスト」の形で、クライアントをハンドラーの外で作ると、呼び出しごとに TLS の接続をやり直さずに済みます。

redis-py 8 の再試行に注意

redis-py 8.1.0 の既定は「10 回まで再試行」です(_defaults.py の DEFAULT_RETRY_COUNT = 10)。届かないアドレスに socket_connect_timeout=3 で接続すると、エラーが出るまでの時間は次のとおりでした。

設定 TimeoutError が出るまでの時間
既定(再試行 10 回) 37.6 秒
retry=Retry(ExponentialWithJitterBackoff(base=0.1, cap=1), 1) 6.1 秒
from redis.retry import Retry
from redis.backoff import ExponentialWithJitterBackoff

rc = RedisCluster(host=HOST, port=6379, ssl=True, username=USER, password=PASSWORD,
                  socket_connect_timeout=3, socket_timeout=3,
                  retry=Retry(ExponentialWithJitterBackoff(base=0.1, cap=1), 1))

Lambda のタイムアウトより短くしておかないと、キャッシュの障害がそのままタイムアウトになります。関連記事「Task timed out afterの直し方|Lambdaタイムアウト原因別」で扱っています。

IAM 認証のトークンを作る

IAM 認証では、パスワードの代わりに SigV4 で署名した URL(15 分有効)を渡します。ドキュメントの Java 例と同じ形(Action=connect・User・サーバーレスなら ResourceType=ServerlessCache)を botocore で作り、redis-py の CredentialProvider で渡す例です。

import time
from urllib.parse import urlencode
import botocore.session
from botocore.model import ServiceId
from botocore.signers import RequestSigner
from redis import CredentialProvider


class ElastiCacheIAMProvider(CredentialProvider):
    """ElastiCache の IAM 認証トークン(15 分有効)を作って AUTH に渡す"""

    def __init__(self, user, cache_name, region="ap-northeast-1", serverless=True):
        self.user, self.cache_name, self.region, self.serverless = user, cache_name, region, serverless
        session = botocore.session.get_session()
        self.signer = RequestSigner(ServiceId("elasticache"), region, "elasticache", "v4",
                                    session.get_credentials(), session.get_component("event_emitter"))
        self._token, self._at = None, 0.0

    def get_credentials(self):
        if self._token is None or time.time() - self._at > 600:      # 10 分で作り直す
            query = {"Action": "connect", "User": self.user}
            if self.serverless:
                query["ResourceType"] = "ServerlessCache"
            url = self.signer.generate_presigned_url(
                {"method": "GET", "url": f"http://{self.cache_name}/?{urlencode(query)}",
                 "body": {}, "headers": {}, "context": {}},
                operation_name="connect", expires_in=900, region_name=self.region)
            self._token, self._at = url.removeprefix("http://"), time.time()
        return (self.user, self._token)

# 使い方:パスワードの代わりに credential_provider を渡す
# rc = RedisCluster(host=HOST, port=6379, ssl=True,
#                   credential_provider=ElastiCacheIAMProvider("app-iam-user", "orders"))

例のアクセスキーで作ったトークンの形です(改行は見やすくするため)。

my-cache/?Action=connect
  &User=app-iam-user
  &ResourceType=ServerlessCache
  &X-Amz-Algorithm=AWS4-HMAC-SHA256
  &X-Amz-Credential=AKIAIOSFODNN7EXAMPLE%2F20261013%2Fap-northeast-1%2Felasticache%2Faws4_request
  &X-Amz-Date=20261013T035005Z
  &X-Amz-Expires=900
  &X-Amz-SignedHeaders=host
  &X-Amz-Signature=c01753dc...
IAM 認証の決まり(ドキュメント) 内容
ユーザー create-user --authentication-mode Type=iam。ユーザー ID とユーザー名を同じにする
IAM の権限 elasticache:Connect(キャッシュとユーザーの ARN)
トークン 15 分有効。期限切れのトークンで再認証すると拒否
接続 12 時間で切断。新しいトークンで AUTH か HELLO を送ると 12 時間延びる

Java から接続する(Jedis 8)

Jedis 8 では JedisPooled が無くなり、RedisClient・RedisClusterClient を使います。TLS は SslOptions で指定し、ホスト名の検証が既定で有効になりました(移行ガイド)。

import java.io.File;
import java.util.Set;
import redis.clients.jedis.*;

public class CacheDemo {
    public static void main(String[] args) {
        String host = System.getenv().getOrDefault("CACHE_HOST", "localhost");
        int port1 = Integer.parseInt(System.getenv().getOrDefault("PORT1", "6379"));
        int port2 = Integer.parseInt(System.getenv().getOrDefault("PORT2", "6379"));

        // TLS:ElastiCache の証明書は公的な CA なので、JVM 既定の truststore で検証できる
        SslOptions.Builder ssl = SslOptions.builder().sslVerifyMode(SslVerifyMode.FULL);
        String ts = System.getenv("CACHE_TRUSTSTORE");          // 自前の CA を使うときだけ
        if (ts != null) ssl.truststore(new File(ts), "changeit".toCharArray());

        JedisClientConfig config = DefaultJedisClientConfig.builder()
                .sslOptions(ssl.build())
                .user(System.getenv().getOrDefault("CACHE_USER", "app"))
                .password(System.getenv("CACHE_PASSWORD"))
                .connectionTimeoutMillis(3000)
                .socketTimeoutMillis(3000)
                .clientName("order-api")
                .build();

        // ① ノードベース・クラスターモード無効:プライマリエンドポイントへ(接続プール付き)
        try (RedisClient redis = RedisClient.builder()
                .hostAndPort(host, port1).clientConfig(config).build()) {
            redis.setex("app:greeting", 60, "hello");
            System.out.println("standalone GET: " + redis.get("app:greeting") + " TTL: " + redis.ttl("app:greeting"));
        }

        // ② サーバーレス・クラスターモード有効:RedisClusterClient
        try (RedisClusterClient cluster = RedisClusterClient.builder()
                .nodes(Set.of(new HostAndPort(host, port2))).clientConfig(config).build()) {
            for (int i = 0; i < 6; i++) cluster.set("app:user:" + i, String.valueOf(i));
            System.out.println("cluster nodes: " + cluster.getClusterNodes().keySet());
            System.out.println("cluster GET app:user:3 = " + cluster.get("app:user:3"));
        }
    }
}
standalone GET: hello TTL: 60
cluster nodes: [127.0.0.1:7001, 127.0.0.1:7002, 127.0.0.1:7003]
cluster GET app:user:3 = 3

自前の CA の証明書を truststore に入れずに動かすと、次のエラーで止まりました。ElastiCache では Amazon の公的な CA の証明書なので、JVM 既定の truststore で通ります。

redis.clients.jedis.exceptions.JedisConnectionException: javax.net.ssl.SSLHandshakeException: (certificate_unknown) PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
Jedis の版 書き方の違い
8.x RedisClient・RedisClusterClient、SslOptions。ホスト名の検証が既定で有効。RESP3 を自動で交渉
7.x RedisClient が加わり、JedisPooled も使える
5.x・6.x JedisPooled・JedisCluster、DefaultJedisClientConfig.builder().ssl(true)

AWS のドキュメントには、Valkey GLIDE(Valkey 用のクライアント)の Java の例もあります。Spring Boot から使う場合は、spring.data.redis.ssl.enabled=true と username・password を設定します。

つながらないときの原因表

手元の Valkey で再現したエラーと、ElastiCache で考えられる原因です(redis-py 8.1.0 の文面)。

エラー 原因 直し方
TimeoutError: Timeout connecting to server セキュリティグループで 6379(6380)が閉じている、別の VPC から接続している キャッシュ側の SG でアプリの SG を許可。同じ VPC か VPC ピアリング
ConnectionError: Error while reading from ...: (104, 'Connection reset by peer') TLS なしで TLS のポートに接続 ssl=True。ドキュメントでは「接続が固まる」原因として TLS の付け忘れが挙がっている
AuthenticationError: invalid username-password pair or user is disabled. パスワードの誤り、ユーザー名を渡していない、ユーザーが off RBAC は username も渡す。describe-users で状態を見る
ConnectionError: ... [SSL: CERTIFICATE_VERIFY_FAILED] 証明書を検証できない(社内のプロキシ、自前の CA) ElastiCache では通常起きない。ssl_cert_reqs を外さず、CA を確かめる
MovedError: 12157 127.0.0.1:7003 クラスターモード有効に、非クラスターのクライアントで接続 RedisCluster・RedisClusterClient を使う
RedisClusterException: MGET - all keys must map to the same key slot 別のスロットのキーをまとめて操作(AWS では CROSSLOT) ハッシュタグ {...} でそろえる。redis-py は mget_nonatomic で分けて取れる
NoPermissionError: ... no permissions to run the '...' command RBAC のアクセス文字列で許していない アクセス文字列を見直す
ConnectionError: Error -2 connecting to ... Name or service not known. エンドポイントの名前の誤り、VPC の DNS 設定 describe-* の Endpoint.Address をそのまま使う
ConnectionError: Error 111 ... Connection refused. ポート番号の誤り サーバーレスは 6379(読み取りは 6380)
SELECT でエラー サーバーレス・クラスターモード有効では DB 番号を切り替えられない キーの接頭辞で分ける。ノードベースのクラスターモード無効なら使える
OOM command not allowed サーバーレスの保存量の上限、ノードのメモリ不足 上限を上げる、TTL を付ける、maxmemory-policy を見直す

mget_nonatomic で別スロットのキーを取ると ['1', '2'] が返りました。ローカルの PC から VPC の中のキャッシュに直接はつながりません。 踏み台の EC2 から試す方法は、関連記事「Session ManagerでEC2に接続する方法|SSH鍵なしの手順」で扱っています(ポートフォワードでも、TLS の名前の検証に注意)。

EC2 から valkey-cli で確かめるときは、--tls と、クラスターなら -c を付けます。

valkey-cli --tls -c -h orders-xxxxxx.serverless.apne1.cache.amazonaws.com -p 6379 \
  --user app-user --pass 'Str0ng-Passw0rd-0123' PING

料金の考え方

形 料金の決まり方(ドキュメント・料金ページ)
サーバーレス 保存量(GB 時間)+ ECPU。1 回の GET・SET は 1 KB ごとに 1 ECPU(3.2 KB の SET は 3.2 ECPU)。CPU を多く使うコマンドはその分多い
サーバーレスの最小 料金ページでは Valkey が 100 MB(ほかのエンジンは 1 GB)
ノードベース ノードの種類 × 台数 × 時間。Valkey は Redis OSS より 20% 安い
無料利用枠 2025年7月15日より前に登録したアカウントは cache.t3.micro が 12 か月 750 時間。サーバーレスは対象外

料金ページの計算例(米国東部、Valkey サーバーレス)の単価で計算します。

例 計算 1 時間
料金ページの例:10 GB・50,000 リクエスト/秒(各 1 KB 以下) 10 GB × 0.084 USD + 1.8 億 ECPU × 0.0023 USD/100 万 1.254 USD
最小:100 MB・ほぼアクセスなし 0.1 GB × 0.084 USD × 730 時間 月 約 6.1 USD

最小の計算は、AWS の発表の「月 6 USD から」と合います。開発者ガイドの「コンポーネント」のページには「最小 1 GB で計測」と書かれており、料金ページの Valkey の 100 MB と表現が違うため、見積もりは料金ページと料金計算ツールで行います。東京リージョンの単価は料金ページで確かめます。費用の確認は、関連記事「AWSの料金を確認する方法|Cost Explorer・CLI・予算アラート」で扱っています。

リクエストが一日中多いなら、ノードベースの方が安くなることがあります。 例えば 1 時間 1.254 USD は月 900 USD を超えるので、同じ量を処理できるノードの時間単価と比べて決めます。

Redis OSS から Valkey に切り替える

# ノードベース
aws elasticache modify-replication-group --replication-group-id myReplGroup \
  --engine valkey --engine-version 9.0

# サーバーレス
aws elasticache modify-serverless-cache --serverless-cache-name myCluster \
  --engine valkey --major-engine-version 9
決まり(ドキュメント) 内容
CLI の版 AWS CLI v1 は 1.35.2 以上、v2 は 2.18.2 以上
停止時間 Redis OSS 5.0.6 以上からは最小限。それより前の版は 30〜60 秒のフェイルオーバー
パラメータグループ 独自のものを使っているなら、同じ静的パラメータの Valkey 用を --cache-parameter-group-name で渡す
単一ノードのクラスター 先にレプリケーショングループにしてから切り替える

よくある質問

Q. 接続のパスワードはどこに置きますか。 A. Secrets Manager に置き、起動時に取り出す形がよく使われます。関連記事「AWS Secrets Managerの使い方 CLI・boto3取得早見表」で扱っています。

Q. サーバーレスで KEYS * は使えますか。 A. クラスターモードなので、キーはノードに分かれています。全件を見る操作は重く、本番では SCAN を使います。RBAC で -@dangerous にしている場合、KEYS は拒否されます。

Q. Memcached とどちらを選びますか。 A. データ型(リスト・ソート済みセット・ハッシュ)、複製とフェイルオーバー、Pub/Sub、バックアップが要るなら Valkey です。単純な文字列のキャッシュで、マルチスレッドを生かしたいなら Memcached が候補になります(ドキュメントの比較表)。

Q. ローカルで開発するときは何を使いますか。 A. この記事と同じく、apt や公式のコンテナで Valkey を動かせます。TLS とユーザーを設定すると、本番と同じ接続コードで試せます。

まとめ

  • 新しく作るなら Valkey。Redis 用のクライアントがそのまま使え、料金も安い
  • サーバーレスは TLS 必須・クラスターモードだけ。RedisCluster/RedisClusterClient で接続
  • 接続できる範囲は 同じ VPC。キャッシュの SG でアプリの SG から 6379・6380 を許可
  • 認証はノードベースなら AUTH トークン、サーバーレスは RBAC(username+password) か IAM
  • redis-py 8 は既定で 10 回再試行。タイムアウトと再試行の回数を決めておく
  • Jedis 8 は RedisClient・SslOptions。ホスト名の検証が既定で有効
  • 料金はサーバーレスが「GB 時間+ECPU」、ノードベースが「ノードの時間単価」

参考・出典

確認日はいずれも 2026年10月13日です。

  • Amazon ElastiCache User Guide「Choosing between deployment options」:https://docs.aws.amazon.com/AmazonElastiCache/latest/dg/WhatIs.deployment.html
  • Amazon ElastiCache User Guide「Engine versions and upgrading」:https://docs.aws.amazon.com/AmazonElastiCache/latest/dg/engine-versions.html
  • Amazon ElastiCache User Guide「Comparing node-based Valkey, Memcached, and Redis OSS clusters」:https://docs.aws.amazon.com/AmazonElastiCache/latest/dg/SelectEngine.html
  • Amazon ElastiCache User Guide「ElastiCache components and features」(ECPU とデータ保存量):https://docs.aws.amazon.com/AmazonElastiCache/latest/dg/WhatIs.corecomponents.html
  • Amazon ElastiCache User Guide「Scaling ElastiCache Serverless」:https://docs.aws.amazon.com/AmazonElastiCache/latest/dg/Scaling-serverless.html
  • Amazon ElastiCache User Guide「Create a Valkey serverless cache in a VPC」:https://docs.aws.amazon.com/AmazonElastiCache/latest/dg/getting-started-valkey-vpc.html
  • Amazon ElastiCache User Guide「Create a Valkey serverless cache with a public endpoint」:https://docs.aws.amazon.com/AmazonElastiCache/latest/dg/serverless-public-endpoints-chapter.html
  • Amazon ElastiCache User Guide「Authenticating with the Valkey and Redis OSS AUTH command」:https://docs.aws.amazon.com/AmazonElastiCache/latest/dg/auth.html
  • Amazon ElastiCache User Guide「Role-Based Access Control (RBAC)」:https://docs.aws.amazon.com/AmazonElastiCache/latest/dg/Clusters.RBAC.html
  • Amazon ElastiCache User Guide「Authenticating with IAM」:https://docs.aws.amazon.com/AmazonElastiCache/latest/dg/auth-iam.html
  • Amazon ElastiCache User Guide「Best Practices for using Read Replicas」:https://docs.aws.amazon.com/AmazonElastiCache/latest/dg/ReadReplicas.html
  • Amazon ElastiCache User Guide「Troubleshooting」:https://docs.aws.amazon.com/AmazonElastiCache/latest/dg/wwe-troubleshooting.html
  • Amazon ElastiCache User Guide「Upgrading from Redis OSS to Valkey」:https://docs.aws.amazon.com/AmazonElastiCache/latest/dg/VersionManagement.HowTo.cross-engine-upgrade.html
  • AWS CLI Command Reference「elasticache create-serverless-cache」:https://docs.aws.amazon.com/cli/latest/reference/elasticache/create-serverless-cache.html
  • Amazon ElastiCache の料金:https://aws.amazon.com/elasticache/pricing/
  • AWS What's New「Announcing Amazon ElastiCache for Valkey」(2024年10月):https://aws.amazon.com/about-aws/whats-new/2024/10/amazon-elasticache-valkey
  • AWS Database Blog「Get started with Amazon ElastiCache for Valkey」:https://aws.amazon.com/blogs/database/get-started-with-amazon-elasticache-for-valkey
  • クラスメソッド DevelopersIO の ElastiCache for Valkey の入門記事(2025年6月):https://dev.classmethod.jp/articles/aws-elasticache-valkey-intro/
  • Jedis「Jedis 8.0.0 Migration Guide」(v8.0.2 のソースに同梱):https://github.com/redis/jedis/blob/master/docs/migration-guides/v7-to-v8.md

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「ElastiCacheの使い方|Valkey/Redisの作り方と接続コード」

株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。

WE ARE HIRING

RJCで一緒に開発しながら、
成長を楽しみませんか?

RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!

  • 127日年間休日
  • 12時間平均残業時間
  • 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!

ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。

ABOUT RJC RJCがどんな会社か知る 考え方、研修、働き方、福利厚生、社員の前職まで。RJCのことが丸わかり! RJC丸わかりページへ JOB DESCRIPTION 仕事内容・待遇を見てみる 仕事内容、給与・待遇、選考の流れ。経験者も未経験も!応募前に知りたいこと、まとめました! 募集要項を見る ENTRY エントリーする エントリーは1〜2分・履歴書不要です。まずは話を聞いてみたい、という方でも歓迎です! エントリーフォームへ

RJCで一緒に開発しながら、 成長を楽しみませんか?