MemoryDB for Valkey へCLIアクセス/プログラムアクセスやってみた【valkey-cli】【Valkey GLIDE】

記事タイトルとURLをコピーする

こんにちは。ディベロップメントサービス3課の平松です。 最近また一段と寒くなってきましたね。弊社でも体調不良の方が急に増えたような気がします。皆さんも体調には気を付けつけてください。

さて、今回は先日発表されたAmazon MemoryDB for Valkeyの構築、CLIアクセス、プログラムアクセスを試してみたので、主にリソース作成から、接続して簡単なデータの操作までを解説しようと思います。

aws.amazon.com

Amazon MemoryDB とは

Amazon MemoryDB(以下、MemoryDB) は、Valkey および Redis OSS 互換の、耐久性のある、フルマネージド型インメモリデータベースサービスです。 マルチ AZ の耐久性、マイクロ秒単位の読み取りレイテンシー、1 桁ミリ秒単位の書き込みレイテンシー、高スループットを実現できます。

AWSのインメモリデータベースと聞くと、Amazon ElastiCache(以下、ElastiCache) が先に思いつくかもしれませんが、MemoryDBとElastiCacheの大きな違いは、データの耐久性です。

MemoryDBは格納データの永続化が保証されています。

BlackBelt から引用

したがって、格納するデータに耐久性を求めるかどうかで使い分けるといいかと思います。選定に関する考慮事項はこちらをご確認ください。

関連サービス - Amazon ElastiCache

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> 

参考 aws.amazon.com

プログラムアクセス(Valkey GLIDE)

プログラムアクセスするために、AWSが Valkey GLIDE というValkey と Redis OSS向けのクライアントライブラリを用意してくれています。(ElastiCache でも MemoryDB でも使えます。) Valkey の公式クライアントライブラリの 1 つにもなっているので、安心して使用できます。

aws.amazon.com

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認証時のプログラム実装やローカル開発時のことを記事にしてみようと思っているので、お楽しみに(?)

最後までご覧いただきありがとうございました。

平松 暢顕 (記事一覧)

22卒。日々勉強中。

少しでもお役に立てる情報を発信できるよう頑張ります