- AWS
ElastiCacheの使い方|Valkey/Redisの作り方と接続コード
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期連続の黒字決算。