Amazon ElastiCacheでValkeyサーバレスを使ってみる

こんにちは、池脇です。
[前回の記事](https://qiita.com/pesysyon/items/24f2009e3aa13aef2bf7)でRedisからValkeyへの移行について解説しましたが、今回はオンデマンドからサーバレスキャッシュへの変更について試してみたので、その手順を解説したいと思います。

## サーバレスキャッシュへの変更を検討する経緯
一言で言うとコストカットのためです。
現在のプロジェクトでのAWSのコストの占める割合を見てみるとRDSに次いでElastiCacheが2番目になっています。
プロジェクトでのキャッシュの利用方法から鑑みてElastiCacheにかかっている費用を下げることは容易そう、かつ大幅に費用削減につながる可能性があるということでサーバレスキャッシュの検討をしています。

## サーバレスキャッシュの費用について
ElastiCacheのサーバレスは[2023年11月にGAされた機能](https://dev.classmethod.jp/articles/reinvent2023-elasticache-serverless/)です。
サーバレスキャッシュの特徴として水平・垂直どちらの方向にもオートスケールし、SLAも99.99%であるため運用において通常の監視は不要になります。
一方で費用については
- ストレージ利用量
- ElastiCache Processing Units(ECPU)[^1]

の2本立てで決まり、容量については**最低1GB**からとなっていたため小さめのプロジェクトでは採用すると費用が嵩む結果となっていました。
しかしElastiCache Valkeyが発表された2024年10月から費用について
- [前回の記事](https://qiita.com/pesysyon/items/24f2009e3aa13aef2bf7)でも述べたエンジン変更による値下げ(**-33%**)
- ストレージ最低利用量の引き下げ(**1GB→100MB**)

上記の改善が入っており、小さめのプロジェクトでもサーバレスキャッシュの利用について検討できるようになりました。
以下が月あたりの費用の比較を行った表です。
|費用の比較表|月(30日)あたりの料金|
|---|---|
|Redisオンデマンド(t4g.micro)|18.0$|
|Valkeyオンデマンド(t4g.micro)|14.4$|
|Valkeyサーバレス|7.272$ + α|

詳しい料金については[こちら](https://aws.amazon.com/jp/elasticache/pricing/)を参照してください。

## 実際にやってみる
実際にサーバレスキャッシュを作成する手順をご紹介します。
下準備として[**6379、6380ポート**を開けたセキュリティグループの作成が必要となる](https://docs.aws.amazon.com/AmazonElastiCache/latest/dg/set-up.html#elasticache-install-grant-access-VPN)ので作成しておきましょう。
![スクリーンショット 2025-02-05 18.29.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/051410c2-9aad-1033-6797-7e0962821951.png)

**「Valkeyキャッシュを作成」** から作成を開始。
![スクリーンショット 2025-02-05 18.25.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/6e9b7aaa-6901-83e1-7379-e98294b9551b.png)

**「サーバレス」** を選択、また今回は新規キャッシュとして作成するので **「新しいキャッシュ」** を選択。
**「エンジンバージョン」** は最新の**8**を選択。
![スクリーンショット 2025-02-05 18.25.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/ce9e4a08-bc73-ed8a-136a-82aae07943a5.png)

今回はデフォルト以外のVPCで作成するため、**「デフォルト設定をカスタマイズ」** を選択。
(デフォルトのVPCで作成する場合は「デフォルト設定を使用」でも大丈夫ですが、セキュリティグループもデフォルト指定になるため注意)
![スクリーンショット 2025-02-05 18.26.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/ed6b4bcc-63eb-257c-7110-b1a3cbacb879.png)

**「VPC ID」** でキャッシュを作成するVPCを選択。
またオンデマンドと違いサブネットグループの指定ではなく、**アベイラビリティーゾーンとして利用するサブネット**を複数選択。
![スクリーンショット 2025-02-05 18.27.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/813efbb3-0d82-770e-55ed-cd75d7343353.png)

**「セキュリティ設定をカスタマイズ」** を選択。
**下準備で作成したセキュリティグループを指定**。
![スクリーンショット 2025-02-05 18.43.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/4e9e19c8-8fd1-3b9d-a9df-ace9eea29baa.png)

ページ下部の **「作成」** を選択で完了です。

作成したキャッシュのエンドポイントをコピーし、キャッシュを利用したいサービスから接続を試してみてください。

:::note info
サーバレスキャッシュは**転送中の暗号化が必ず有効**となります。
TLS設定を行っていない場合は、サービスで利用する際の追記を忘れず行いましょう。
```diff_go:Go
    redis.NewClient(&redis.Options{
        Addr:      addr,
        DB:        db,
+       TLSConfig: &tls.Config{}, // ← 追記
    })
```
cliでのアクセス時も`-tls`オプションが必要です。
```
redis-cli --tls -h [host] -p 6379
```
:::

## まとめ
Valkeyサポート後のElastiCacheではサーバレスでの運用がどんな環境でも現実的なものになっているように感じました。
今回は解説していませんがスケーリングの上限設定等も可能であるため、自分のユースケースに合わせて検討してみてはどうでしょうか？

## 参考
- [2023年11月にGAされたAmazon Elasticache Serverlessの監視を考える](https://zenn.dev/yutakon/articles/edb624f9d6ef24)
- [Amazon ElastiCacheがサーバーレスになって運用がバチクソ楽になった](https://dev.classmethod.jp/articles/amazon-elasticache-serverless-ops-made-easy/)
- [ElastiCache検証：Valkey化でアップデートされた Serverless 導入のポイントとValkey 8.0について](https://blog.applibot.co.jp/2024/12/01/elasticache-serverless-and-valkey-8/)

[^1]:詳しくは[こちら](https://docs.aws.amazon.com/ja_jp/AmazonElastiCache/latest/dg/WhatIs.corecomponents.html)の **ElastiCache処理単位(ECPUs)** を参照