電通総研 テックブログ

電通総研が運営する技術ブログ

AWS CDKでElastiCache for Valkeyクラスターを作ってみた

こんにちは。コーポレート本部 サイバーセキュリティ推進部の耿です。

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となっているので高可用性が実現できています。

作成したServerlessクラスタ

よもやま話

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で執筆されました