こんにちは。ディベロップメントサービス3課の平松です。 最近また一段と寒くなってきましたね。弊社でも体調不良の方が急に増えたような気がします。皆さんも体調には気を付けつけてください。
さて、今回は先日発表されたAmazon MemoryDB for Valkeyの構築、CLIアクセス、プログラムアクセスを試してみたので、主にリソース作成から、接続して簡単なデータの操作までを解説しようと思います。
Amazon MemoryDB とは
Amazon MemoryDB(以下、MemoryDB) は、Valkey および Redis OSS 互換の、耐久性のある、フルマネージド型インメモリデータベースサービスです。 マルチ AZ の耐久性、マイクロ秒単位の読み取りレイテンシー、1 桁ミリ秒単位の書き込みレイテンシー、高スループットを実現できます。
AWSのインメモリデータベースと聞くと、Amazon ElastiCache(以下、ElastiCache) が先に思いつくかもしれませんが、MemoryDBとElastiCacheの大きな違いは、データの耐久性です。
MemoryDBは格納データの永続化が保証されています。
したがって、格納するデータに耐久性を求めるかどうかで使い分けるといいかと思います。選定に関する考慮事項はこちらをご確認ください。
MemoryDB for Valkeyとは
MemoryDB for Valkey は、Valkey互換の耐久性のあるフルマネージド型インメモリデータベースサービスです。
そもそも「Valkey」とは何かというと、ValkeyはRedisからフォークされてOSSとして開発されているインメモリデータストア(Key-Valueストア)です。
MemoryDB for Redis との違いは価格面です。(機能面は現時点では基本的には同じです)
MemoryDB for Valkey は、MemoryDB for Redis OSS と比較して、インスタンス時間あたりの価格が 30%低いです。そのため、現在MemoryDB for Redis OSS を使用している場合は移行するだけでコスト削減を見込めます。
移行大変なのでは?と思う方に朗報です。
Redis OSS の API とデータ形式と互換性があるので、コードの書き直しやアーキテクチャの変更なしにアプリケーションを移行できますし、既存の MemoryDB for Redis OSS ユーザーは、なんとダウンタイムなしで MemoryDB for Valkey に迅速にアップグレードできます。(マネジメントコンソール画面からポチるだけでエンドポイントすら変わりません。)
やってみる
構成
以下のリソースは構築済みの前提で進めます。
- VPC
- パブリックサブネット2つ
- セキュリティグループ(EC2用)
- ローカルからSSH接続できるインバウンドルール設定
- セキュリティグループ(MemoryDB用)
- EC2用のセキュリティグループからポート6379へのアクセスを許可するインバウンドルール設定
- EC2(Amazon Linux 2023)
- 上記作成のEC2用のセキュリティグループをアタッチしておく
MemoryDB for Valkey 作成
今回はデモなので以下のような設定で作成しました。
MemoryDBのサービスページから「クラスター」-> 「クラスターを作成」を押下します。
以下のページで各種設定項目を入力します。
- クラスターの作成方法を選択
- 簡易作成
- 設定
- デモ
- クラスター情報
- 名前:任意の名前
- エンジン: Valkey
- サブネットグループ
- サブネットグループ:新しいサブネットグループを作成
- 名前: 任意の名前
- VPC ID:作成済みのVPCを選択
- サブネット選択済み: 作成済みのパブリックサブネット2つを選択
後の設定項目はデフォルトのままで、「作成」を押下。ステータスがCreating -> Availableになれば作成完了です。
「デモ」設定で作成すると、作成時にセキュリティグループが選択できないので、作成後に事前作成したセキュリティグループをアタッチします。 作成したクラスターを選択し、画面右上の「修正」を押下します。
- セキュリティ
- 「管理」から事前作成したセキュリティグループを選択。(デフォルトで選択されていたセキュリティグループは選択解除してOKです。)
「変更をプレビュー」-> 「変更を保存」を押下します。これで準備万端です。
CLIアクセス(valkey-cli)
Valkeyはvalkey-cliというコマンドラインツールを使用して、アクセスできます。
EC2にvalkey-cli をインストールします
sudo yum install gcc jemalloc-devel openssl-devel tcl tcl-devel -y wget https://github.com/valkey-io/valkey/archive/refs/tags/7.2.7.tar.gz tar xvzf 7.2.7.tar.gz cd valkey-7.2.7/ make BUILD_TLS=yes install
以下のコマンドで、MemoryDB for Valkey データベースに接続します。
valkey-cli -h clustercfg.xxxxxxxxxxr.xxxxxx.memorydb.ap-northeast-1.amazonaws.com -p 6379 -c --tls
- -h = ホスト名(= クラスターエンドポイント)
- -p = ポート
- -c = クラスターモード
- –tls = TLS 有効クラスター
接続できました。
[ec2-user@ip-10-0-4-99 memorydb-test]$ valkey-cli -h clustercfg.blog-demo-cluster.c8utee.memorydb.ap-northeast-1.amazonaws.com -p 6379 -c --tls clustercfg.blog-demo-cluster.c8utee.memorydb.ap-northeast-1.amazonaws.com:6379>
Keyがfoo
、Valueがbar
のデータを登録、取得してみます。
[ec2-user@ip-10-0-4-99 memorydb-test]$ valkey-cli -h clustercfg.blog-demo-cluster.c8utee.memorydb.ap-northeast-1.amazonaws.com -p 6379 -c --tls clustercfg.blog-demo-cluster.c8utee.memorydb.ap-northeast-1.amazonaws.com:6379> SET foo bar OK clustercfg.blog-demo-cluster.c8utee.memorydb.ap-northeast-1.amazonaws.com:6379> GET foo "bar" clustercfg.blog-demo-cluster.c8utee.memorydb.ap-northeast-1.amazonaws.com:6379>
プログラムアクセス(Valkey GLIDE)
プログラムアクセスするために、AWSが Valkey GLIDE というValkey と Redis OSS向けのクライアントライブラリを用意してくれています。(ElastiCache でも MemoryDB でも使えます。) Valkey の公式クライアントライブラリの 1 つにもなっているので、安心して使用できます。
2024年11月現在では、Java・Python・Node に対応しています。今回はPython版を使います。
Python版のValkey GLIDEをインストールします。
(.venv) [ec2-user@ip-10-0-4-99 memorydb-test]$ pip install valkey-glide
CLIアクセスの時と同様のデータを格納し、取得する処理を書きます。
import asyncio from glide import ( GlideClusterClientConfiguration, NodeAddress, GlideClusterClient ) async def test_cluster_client(): addresses = [NodeAddress(host="clustercfg.xxxxxxxxx.xxxxxxxx.memorydb.ap-northeast-1.amazonaws.com", port=6379)] config = GlideClusterClientConfiguration(addresses, use_tls=True) client = await GlideClusterClient.create(config) set_result = await client.set("foo", "bar") print(f"Set response is {set_result}") get_result = await client.get("foo") print(f"Get response is {get_result}") if __name__ == "__main__": asyncio.run(test_cluster_client())
基本的にはREADMEのサンプルと同じですが、1点だけ手を加えています。
それは、以下のuse_tls=True
というTLS有効の設定です。デモ設定でクラスターを作成するとデフォルトでTLS有効化のため必要になります。(valkey-cliでも同様)
config = GlideClusterClientConfiguration(addresses, use_tls=True)
では、実行してみます。
(.venv) [ec2-user@ip-10-0-4-99 memorydb-test]$ python memorydb-valkey-access.py Set response is OK Get response is b'bar'
無事に、MemoryDB for Valkey データベースに接続して、データを操作することができました。
ちなみに、use_tls=True
なしだと以下のようなエラーが出ます。
client creation - Connection error: Cluster(Failed to create initial connections - IoError: Failed to refresh both connections - IoError: Node: "clustercfg.blog-demo-cluster.c8utee.memorydb.ap-northeast-1.amazonaws.com:6379" received errors: `timed out`, `timed out`)
初めはタイムアウトというエラー表示なので、ネットワークが疎通してないのかと疑っていましたが、CLIでは接続できるので、別の観点で原因を探しました。
最終的には、GlideClusterClientConfiguration
クラスのソースを確認して、use_tls
オプションが存在することとデフォルトでFalseであることから、そこに原因があることに気づきました。(この時点では、デモ設定でクラスターを作成するとデフォルトでTLS有効化になることを知らなかったので、中々気づけませんでした...)
もちろんライブラリは使っているだけでも便利ですが、生のソースコードに少し触れるだけでも、いろいろ学びがあると、個人的には思っています。
最後に
いかがだったでしょうか?どなたかの役に立っていたら幸いです。
この検証をやっていて一番驚いたのでが、MemoryDB のクラスター作成時のエンジン選択欄のデフォルトがValkeyになっていたことです。これを見てこれからAWSはValkey推しでいくんだろうなということを確信しました(※個人の見解です)
今回は、MemoryDBのアクセス制御については言及せず、パスワードなしのデフォルトユーザーで接続しましたが、パスワード認証に加えて、IAM認証も使用できます。
次回は実際にアプリケーションを開発することを意識して、IAM認証時のプログラム実装やローカル開発時のことを記事にしてみようと思っているので、お楽しみに(?)
最後までご覧いただきありがとうございました。