こんにちは。コーポレート本部 サイバーセキュリティ推進部の耿です。
ElastiCache for Valkey が 日本時間 2024/10/9 に利用できるようになりました。Valkey とは、ライセンス変更が発生した Redis をフォークしたインメモリデータベースであり、今後も継続して OSS として使用できるよう開発を進めていくことが発表されています。
Redis の代替の選択肢となり得る ElastiCache for Valkey を早速 AWS CDK で作ってみました。
オンデマンド (Self-designed) クラスタを作成する
ElastiCache for Valkey の公式アナウンスからも Serverless クラスタがプッシュされているのだろうと想像できますが、Serverless ではないオンデマンドクラスタも作ることができました。最新のドキュメントでは「Self-designed クラスタ」と表現されているようです。
ElastiCache には L2 コンストラクトがないため、L1 で作成します。
import * as elasticache from "aws-cdk-lib/aws-elasticache"; export class CacheConstruct extends Construct { constructor(scope: Construct, id: string) { super(scope, id); // ...(VPC, サブネット, SGの作成は省略) const description = "test-cache"; new elasticache.CfnReplicationGroup(this, "ReplicationGroup", { replicationGroupDescription: description, engine: "valkey", // engine は valkey を指定 engineVersion: "7.2", // engineVersion は 7.2 を指定すると作成できた cacheNodeType: "cache.t3.micro", cacheSubnetGroupName: new elasticache.CfnSubnetGroup(this, "SubnetGroup", { description, subnetIds: vpc.selectSubnets({ subnetGroupName: "private-subnet" }).subnetIds, }).ref, cacheParameterGroupName: new elasticache.CfnParameterGroup(this, "ParameterGroup", { description, cacheParameterGroupFamily: "valkey7", // パラメータグループは valkey7 を指定 }).ref, numNodeGroups: 1, replicasPerNodeGroup: 1, securityGroupIds: [mySecurityGroup.securityGroupId], atRestEncryptionEnabled: true, transitEncryptionEnabled: true, }); } }
マネジメントコンソールで確認すると、問題なく作成できていました。

Serverlessクラスタを作成する
続いてプッシュされている Serverless クラスタも作成してみます。L1 の CfnServerlessCache コンストラクトを使用します。
ServerlessCache で特徴的なのは cacheUsageLimits パラメータです。Serverless クラスタの場合、時間あたりの「データストレージ」と「コンピューティングリソース(ECPU)」によって課金額が変わります。cacheUsageLimits を利用することにより、利用料が想定を超えないようリソース上限を設けることが可能です。Valkey のストレージの最小値は 100MB ですが、cacheUsageLimits で設定できる「上限値」は現状 1GB でした。ただしこれはスケールした時の上限値なので、保管データ量が少なければ最小 100MB 分の料金しかかからないと思われます。
また、保管時と通信時の暗号化は指定する必要がなく、デフォルトで有効となっていました。
import * as elasticache from "aws-cdk-lib/aws-elasticache"; export class CacheConstruct extends Construct { constructor(scope: Construct, id: string) { super(scope, id); // ...(VPC, サブネット, SGの作成は省略) const serverless = new elasticache.CfnServerlessCache(this, "ServerlessCache", { serverlessCacheName: "serverless-valkey", engine: "valkey", // engine は valkey を指定 cacheUsageLimits: { dataStorage: { // データストレージの上限を指定 unit: "GB", maximum: 1, }, ecpuPerSecond: { // ECPUの上限を指定 maximum: 1000, }, }, majorEngineVersion: "7", subnetIds: vpc.selectSubnets({ subnetGroupName: "private-subnet" }).subnetIds, securityGroupIds: [mySecurityGroup.securityGroupId], }); } }
マネジメントコンソールで確認すると、こちらも問題なく作成できていました。
自動でマルチAZとなっているので高可用性が実現できています。

よもやま話
Valkey の Serverless は安い
公式アナウンスに customers can create a cache in under a minute and get started as low as $6/month. とある通り、Valkey を Serverless で使えば従来に比べてとても安く済む可能性があります。ElastiCache の料金ページに従って、東京リージョンにおける毎月のデータストレージの最小利用料を計算してみました。最小のデータストレージは 100 MB(0.1 GB)なので、
0.1 (GB) * 0.101 (ドル/ GB-hour) * 24 * 30 (hour/月) = 7.272 (ドル/月)
となります。従来のオンデマンドクラスタだと最小でも14.4 (ドル/月) かかるため、小規模なアプリケーションでも ElastiCache を利用しやすくなったと言えるでしょう。
(これにECPU料金が上乗せされますが、仮定を設けるのがちょっと難しいです。ただ小規模な利用であれば非常に安く済みます。)
Node.js 用のクライアント
アプリケーションから Valkey に接続するためのクライアントですが、Node.js の場合は ioredis からフォークした iovalkey があります。
参考:Getting started with Valkey using JavaScript
ただし今のところ ioredis と大きな変更点はなさそうなので、基本的なオペレーションは ioredis をそのまま利用できました。(全てのオペレーションについては確認できていないため、利用の際には自己責任でお願いします。)iovalkey はまだメジャーバージョンが 1 に到達していないため、適切な時期に iovalkey に移行すると良いでしょう。
執筆:@kou.kinyo、レビュー:@nagamatsu.yuji
(Shodoで執筆されました)



