[アップデート] ElastiCache Serverless for Valkey でパブリックエンドポイントが使えるようになりました
いわさです。
Amazon ElastiCache Serverless を使う時、これまでエンドポイントを VPC に作成していたと思います。
先日のアップデートで、ElastiCache Serverless for Valkey がパブリックエンドポイントに対応しました。
インターネット経由でキャッシュが利用できるので、非 VPC Lambda や外部アプリケーションから利用しやすくなります。
接続は IAM 認証と TLS 1.3 が必須になっています。
今回こちらを確認してみたので紹介します。
コンソールで作成してみる
では早速コンソールから作ってみましょう。
Valkey のサーバーレスキャッシュを新しく作成します。東京リージョンです。
サーバーレスを選ぶと、設定の下の方に Connection type という項目がありますね。

ここで VPC か Public を選べるようになってます。
デフォルトは VPC になってましたが Connection type を Public にすると、IAM 認証が必要という注記が出ました。

The Public connection type requires IAM authentication. The user group associated with this cache must contain only IAM-authenticated users.
なお、パブリックエンドポイントの場合、キャッシュに紐づくユーザーグループは IAM 認証のユーザーだけで構成されている必要があります。
デフォルトのままだと default.iam-user-group(default.iam-user)が使われるので、そのまま作成しました。
エンジンバージョンが 9 未満だと Public を選べない
ドキュメントにも記載がありますが、Connection type で Public が選べるのは、エンジンバージョンが 9 以上のときだけでした。
エンジンバージョンを 8 以下にしてみると Connection type は VPC 固定で Public は選べなくなってました。なるほど!

The Public connection type requires Valkey version 9 or higher. Select a compatible engine version to enable this feature.
なお、ノードベースのキャッシュや Valkey 以外のエンジンは従来通り VPC が必要なままです!

作成できると、詳細画面の Connection type が Public になり、エンドポイントのアドレスに public が入っていました。

hoge0930valkey-kvdwjh.public.serverless.apn3.cache.amazonaws.com:6379 というエンドポイントになりました。
VPC 内のエンドポイントとは違い、名前に public が入っていますね。名前解決したらパブリック IP アドレスを取得出来ました。
以下の記事は、サーバーレスの VPC エンドポイントの実態を調査した記事ですが、VPC エンドポイント経由でアクセスしていたことがわかります。
今回はそれとは別に、インターネットから直接引けるアドレスが用意されるようです。
クライアントから直接つないでみる
作ったキャッシュに、接続してみます。
冒頭触れたように接続には IAM トークンが必要です。今回は Developer Toolkit for ElastiCache を使いました。
IAM トークンを発行してくれる Python のライブラリと CLI です[1]。
pip install developer-toolkit-elasticache valkey certifi
valkey-py に Developer Toolkit のトークンプロバイダを渡して接続します。
import certifi
import valkey
from valkey.credentials import CredentialProvider
from developer_toolkit_elasticache import ElastiCacheIAMAuthTokenProvider
ENDPOINT = "hoge0930valkey-kvdwjh.public.serverless.apn3.cache.amazonaws.com"
CACHE = "hoge0930valkey"
REGION = "ap-northeast-3"
USER = "default.iam-user"
class Prov(CredentialProvider):
def __init__(self, auth):
self._auth = auth
def get_credentials(self):
return self._auth.user_id, self._auth.get_token()
auth = ElastiCacheIAMAuthTokenProvider(
serverless_cache_name=CACHE, user_id=USER, region=REGION,
)
client = valkey.ValkeyCluster(
host=ENDPOINT, port=6379, ssl=True,
ssl_ca_certs=certifi.where(),
credential_provider=Prov(auth),
)
print("PING ->", client.ping())
print("SET ->", client.set("hoge", "piyo"))
print("GET ->", client.get("hoge"))
実行すると、接続出来てSET/GET ができてますね。
PING -> True
SET -> True
GET -> b'piyo'
ちなみにトークンプロバイダを渡さずに接続しようとすると、認証がないので拒否されます。
ERROR -> ValkeyClusterException ... : Authentication required.
さいごに
本日は ElastiCache Serverless for Valkey がパブリックエンドポイントに対応したので確認してみました。
サーバーレスかつ Valkey 9 以上であれば、VPC エンドポイント経由でのアクセスが不要になるので VPN や踏み台などがいらなくなりますね。
認証周りがちょっと変わる可能性ありますが、現在 踏み台などを経由してインターネット経路で常時アクセスさせているような環境だと見直してみても良いかもしれないですね。







