今更ながら「Amazon ElastiCache」を試す
ゆえあってElastiCacheを試す。
公式のチュートリアルを探してたのだけど、以前は AWS Hands-on for Beginners ってのがあったのだけど、今は Skill Builder に統一されてるような雰囲気。少し前にSkill Builderを使ったので、今回も。
ElastiCacheの日本語向けチュートリアルは以下の5つがある。

無料は左上と右下だけみたい。とりあえず左上のやつを試せば良さそう。
Amazon ElastiCache Getting Started
ElastiCacheとは
- 分散型インメモリキャッシュのマネージドサービス
- 超高速・高スループットのリアルタイム向け
- 通常はアプリ・DBの性能向上のためのキャッシュ利用が目的
- 永続性が必要ではないセッションストア、ゲームのリーダーボードなどのデータストアとしても利用可能
- 利用可能なインメモリキャッシュエンジン
- Redis
- 様々なデータ構造(文字列、リスト、マップ、ストリームなど)をサポートしているオープンソースのインメモリデータストア
- データベース、キャッシュ、PubSubなど、複数の用途で広く利用されている
- Memcached
- 高速なオープンソースのインメモリデータストア
- キャッシュや非永続的なセッションなどのユースケースで利用される
- Valkey
- (チュートリアルには書いていない)
- Redis互換のオープンソース実装
- Redis
ElastiCacheのソリューション
- フルマネージドサービスでデプロイ・運用・スケーリングを自動化・効率化、アプリケーション開発に集中できる
- Redis・MemcachedなどOSSで実績のあるソリューションとAPI互換性あり
- 垂直・水平の両方でスケーリング可能
- ニーズに合わせて読み取り・書き込みをスケーリング可能
- モニタリングや自動フェイルオーバなど
- 安全性(VPCでネットワーク分離、TLSによる暗号化、など)
- 信頼性(マルチAZ、自動フェイルオーバ)
エンジンタイプ
- Redis(Valkey) / Memcached
- Redisはレプリケーションとフェイルオーバの保証が提供されるが、Memcachedでは提供されない
料金
チュートリアルにあるのは、ノード型の料金で、現在はServerlessもある
- 従量課金、最低料金なし
- ノード型の料金
- ノード数・ノードタイプ・料金モデルで時間単位の課金
- オンデマンド・リザーブド・バックアップストレージ・データ転送量(リージョン跨ぎの場合)など
- ノード数・ノードタイプ・料金モデルで時間単位の課金
- 無料枠
- 新規アカウントのみ
- cache.t2.micro / cache.t3.micro ノード 750 時間分の使用が最大 12 か月間
料金表はこちら
サーバレスは、ストレージに保存されているデータ量と ElastiCache プロセッシングユニット (ECPU)(vCPU 時間と転送されたデータの両方を含む単位) で従量課金。
- Redisだと最小ストレージは1GB
- Valkeyだと他のエンジンと比べて、料金は 33%、最小データストレージ 100 MBとなり、コストを下げれる。
ユースケース例
- インメモリにより高速アクセスを実現、トレードオフとして永続性が下がる。
- データベースの一時的なキャッシュとして利用することで、アプリケーションのパフォーマンスを上げる
- キャッシュがあれば即回答(キャッシュヒット)、キャッシュがなければDBなどにアクセスしてデータ取得&キャッシュ(キャッシュミス)
ElastiCache for Redisのアーキテクチャモード
- 非クラスタモード
- 全ての書き込みを行うプライマリノードx1に対し、読み込み専用のリードレプリカ最大x5
- 自動フェイルオーバによりプライマリ障害時はレプリカがプライマリに昇格
- マルチAZサポート
- 単一シャードで少数のキーを使用する場合や、性能高めのノードで小さなクラスタを構成する場合向き
- クラスタモード
- プライマリノードx1に対し、リードレプリカ最大x5は同じ
- プライマリ障害時にレプリカがプライマリに昇格するのも同じ
- 複数のプライマリノード(シャード)をサポート(レプリカなしなら最大500ノード)
- 複数のシャードでシャーディングすることで負荷分散
以下がわかりやすい
ElastiCache for Memcached のアーキテクチャ
- 単純にノードが増える
こちらも上記のZennの記事がわかりやすい
Redis/Memcachedそれぞれのユースケース
RedisはRedisそのものがサポートしている様々なデータ型によりいろいろな活用方法があるのに対し、Memcachedはシンプルなキャッシュ。このあたりの特性を踏まえて使い分ける。
ElastiCache for Valkeyクラスタの作成
クラスターは以下で作成できる
- マネジメントコンソール
- AWS CLI
他にも、Terraform などの IaC や AWS CDK などもあるが、今回はマネージメントコンソールで、ノードベースのクラスタを作成してみる。また、Valkeyのほうがお安いようなのでそちらで。
VPCを作成しておく必要がある。こんな感じで作成。

あとElastiCacheクラスタ用のセキュリティグループも作成してVPC内から6379番ポートへのアクセスを許可しておく。チュートリアルにはクラスタ作成時に作れるような書き方になっているが、自分が試した限りはできなかった。

ElastiCacheの画面でクラスタを作成

クラスタの設定はこんな感じで。


詳細設定画面では、上記で作成したセキュリティグループを選択する。



あとはログを有効化するぐらいで他はデフォルトにした。

確認したら作成。自分はなんかエラーがでて、再度やり直したらロググループが既に存在する、とか言われて一度戻って既存のロググループを選択する形にやりなおす必要があった。たまたまかなと思うけど。

作成されている。完了するまでしばし待つ。

AvailableになればOK

ElastiCacheへの接続
作成したElastiCacheクラスタに接続してみる。パブリックkサブネットに1台EC2インスタンスを立ち上げてそこからアクセスするようにする。ここは詳細を割愛するが、UbuntuでEC2 Instance Connectで接続できるEC2を立ち上げた。
まずvalkey-cliでアクセスしてみる。
sudo apt update && sudo apt install -y valkey
which valkey-cli
/usr/bin/valkey-cli
クラスタの接続先はElastiCacheの管理画面で該当のクラスタ情報から確認できる。

接続。TLSを有効にする必要があるのとクラスタの場合は -c を付ける必要がある。詳しくはここ。
valkey-cli \
-c \
-h clustercfg.elasticache-tutorial-cluster.XXXXXXX.apne1.cache.amazonaws.com \
-p 6379 \
--tls
clustercfg.elasticache-tutorial-cluster.XXXXXXX.apne1.cache.amazonaws.com:6379> KEYS *
(empty array)
clustercfg.elasticache-tutorial-cluster.XXXXXXX.apne1.cache.amazonaws.com:6379> SET foo "bar"
-> Redirected to slot [12182] located at elasticache-tutorial-cluster-0003-001.elasticache-tutorial-cluster.XXXXXXX.apne1.cache.amazonaws.com:6379
OK
elasticache-tutorial-cluster-0003-001.elasticache-tutorial-cluster.XXXXXXX.apne1.cache.amazonaws.com:6379> GET foo
"bar"
cluster.XXXXXXX.apne1.cache.amazonaws.com:6379> KEYS *
1) "foo"
なるほどね、クラスタの場合は登録更新時はプライマリにリダイレクトしてくれる感じなのね。
管理画面で見てみるとこんな感じでクラスタが構成されていた。

次にPythonでも。
uvをインストール
curl -LsSf https://astral.sh/uv/install.sh | sh
exec $SHELL -l
which uv
/home/ubuntu/.local/bin/uv
仮想環境を作成
uv init -p 3.12 elasticache-test && cd elasticache-test
パッケージインストール
uv add "valkey[libvalkey]"
サンプルコード。こちらもクラスタに合わせて。
from valkey.cluster import ValkeyCluster as Valkey
r = Valkey(
host="clustercfg.elasticache-tutorial-cluster.XXXXXXX.apne1.cache.amazonaws.com",
port=6379,
ssl=True,
decode_responses=True
)
print(r.get("foo"))
r.set("foo", "hoge")
print(r.get("foo"))
bar
hoge
サーバレスも試してみた。
- クラスタ周りの設定は不要
- おまかせでやると、VPCやセキュリティグループの設定は、デフォルトVPCが選択されるようなので、カスタマイズが必要っぽい
あと、KEYSコマンドが使えないっぽい。
(error) ERR unknown command 'keys', with args beginning with: *
SCAN 0とか使えばいいみたい。
1) "0"
2) 1) "foo"
それ以外は基本的に同じように使えた。
クラスタやVPCなどの削除も忘れずに。