【AWSサービス 基礎編】Amazon ElastiCache でキャッシュを置いて読み込みを速くする

目次

概要

Web アプリケーションでは、同じデータが何度も読み込まれることがよくあります。トップページに並ぶ人気商品の一覧や、ログイン中のユーザーのプロフィールなどです。そのたびにデータベースへ問い合わせていると、データベースの負荷が上がり、応答も遅くなります。

そこで、よく読まれるデータのコピーをメモリ上の「キャッシュ」に置いておき、次からはキャッシュから返す、という工夫をします。Amazon ElastiCache は、このキャッシュ(インメモリデータストア)のセットアップ・管理・スケーリングを AWS が引き受けるマネージドサービスです。エンジンには Valkey・Redis OSS・Memcached の 3 つを選べます。

この記事では、キャッシュの基本的な考え方(キャッシュアサイド・TTL・キャッシュヒット率)、3 つのエンジンの違い、サーバーレスキャッシュとノードベースのクラスターの違い、レプリケーションとマルチ AZ、DynamoDB Accelerator(DAX)や Amazon CloudFront との使い分けを押さえたうえで、最小構成の Valkey クラスターを作成し、同じ VPC の EC2 から valkey-cli で SET・GET・TTL を試します。

クラウドおさる

今日は、よく使う物を手元の棚に置いておく仕組みを作るのでござる。猿山でも、毎朝食べるバナナまで山奥の倉庫へ取りに行っていたら、日が暮れてしまうのでござるな。

EC2 から同じ VPC の ElastiCache を見に行き、ないときだけ DB を読む
EC2 から同じ VPC の ElastiCache を見に行き、ないときだけ DB を読む

この記事のメリット

  • キャッシュを置くと何が速くなり、どんなデータがキャッシュに向いているかを説明できる
  • キャッシュアサイド(遅延読み込み)・書き込みスルー・TTL の考え方と、キャッシュヒット率の見方を理解できる
  • Valkey・Redis OSS・Memcached の違い(データ型、レプリケーション、バックアップなど)を把握できる
  • サーバーレスキャッシュとノードベースのクラスターの違いと、料金の決まり方を区別できる
  • レプリケーションとマルチ AZ による自動フェイルオーバーの仕組みを理解できる
  • ElastiCache・DAX・CloudFront を、キャッシュする場所と対象で使い分けられる

執筆者とキャラクター紹介

執筆者:土肥(とひ)

株式会社ジェニュインの代表であり元エンジニア。これまでオンプレミスと AWS 環境のインフラ業務を担当。AWS 認定資格の学習で得た知識を、ハンズオンとともに解説するのが得意。直近では新人の教育も行っており、これから技術を学ぶ方が納得できる解説を心がけています。基礎編・Cloud Practitioner の記事では、解説役としても登場します。

土肥

クラウドおさる

クラウドおさる

はじめましてでござる。弊猿はクラウドおさる。IT インフラが異常に発達した猿山から、雲に乗って地上の AWS を学びに降りてきたのでござる。

クラウドおさる

基礎編や Cloud Practitioner の記事では、とひさんに素朴な疑問をぶつける役でござるな。Security - Specialty などの記事では、要所でワンポイントや注意点をひとこと添えるでござる。

クラウドおさる

猿山にもデータセンターや監視当番があって、地上で起きることはだいたい猿山にも同じ仕組みがあるのでござる。例え話がつい猿山に寄るのは、弊猿の癖でござる。

技術解説

キャッシュとは何か

クラウドおさる

とひさん、「キャッシュを置くと速くなる」とよく聞くでござるが、そもそもキャッシュとは何でござるか?

土肥

よく使うデータのコピーを、取り出しやすい場所に置いておくことだよ。ElastiCache の場合、その置き場所はメモリなんだ。ディスクに保存するデータベースから毎回読むより、メモリから読むほうがずっと速いよね。ElastiCache のようなインメモリのキー値ストアは、データのコピーにミリ秒未満のレイテンシーでアクセスできることを目指しているんだ。

クラウドおさる

では、データは全部キャッシュに置けばよいのでござるか?

土肥

そこが考えどころなんだ。AWS のドキュメントでは、キャッシュに向いているかを考える観点として次のようなものが挙げられているよ。

観点考えること
速度とコストデータベースから取り出すのに時間やコストがかかるデータほど、キャッシュの効果が大きい
データとアクセスパターン比較的変化が少なく、頻繁に読まれるデータ(例: ソーシャルメディアの個人プロフィール)が向いている
古さキャッシュのデータは元のデータより古くなることがある。その遅れを許容できるか
クラウドおさる

なるほど、毎朝みんなが食べるバナナは手元の棚に置き、たまにしか使わない長老会の古文書は倉庫に置いたまま、ということでござるな!

土肥

そうそう、その通り! もう一つ、「棚のバナナが倉庫の最新の状態とずれていてもいいか」も一緒に考えるのがポイントだよ。

キャッシュアサイドと書き込みスルー

クラウドおさる

キャッシュにはどうやってデータを入れるのでござるか?

土肥

代表的な戦略が 2 つあるよ。1 つ目は「遅延読み込み」で、キャッシュアサイドとも呼ばれるんだ。アプリケーションはまずキャッシュを見に行って、データがあればそれを使う。これがキャッシュヒット。なければ(キャッシュミス)データベースから読んで、その結果をキャッシュに書き込んでおくんだ。

キャッシュアサイド: ヒットならキャッシュから、ミスなら DB から読んでキャッシュに入れる
キャッシュアサイド: ヒットならキャッシュから、ミスなら DB から読んでキャッシュに入れる
クラウドおさる

必要になったものだけ棚に置くのでござるな。弱点はないのでござる?

土肥

いいところに気づいたね! キャッシュミスのときは「キャッシュ → データベース → キャッシュ」と 3 回の往復が発生するから、最初の 1 回は遅くなるんだ。それと、データベース側で更新があってもキャッシュには古いデータが残ることがあるよ。そこで 2 つ目の「書き込みスルー」。データベースに書き込むたびに、キャッシュも一緒に追加・更新する方法なんだ。

戦略動き良い点気をつける点
遅延読み込み(キャッシュアサイド)読み込み時にキャッシュを確認し、ミスしたらデータベースから読んでキャッシュに書く実際に読まれたデータだけがキャッシュに入る。キャッシュのノードが壊れても致命的ではないキャッシュミスで 3 回の往復が発生する。データが古くなることがある
書き込みスルーデータベースへの書き込みと同時にキャッシュも更新するキャッシュのデータが古くならないほとんど読まれないデータまでキャッシュに入り、リソースを無駄にしやすい
土肥

たとえば RDS の会員テーブルの前に ElastiCache を置くなら、「member:1 というキーで会員 1 番のデータを探し、なければ RDS に SELECT して、結果を member:1 に入れておく」というのが遅延読み込みのイメージだね。

TTL とキャッシュヒット率

クラウドおさる

キャッシュのデータが古くなるのは困るでござる。何か手はないのでござるか?

土肥

そこで使うのが TTL(Time To Live)だよ。キーが期限切れになるまでの秒数を、書き込むときに指定しておくんだ。期限が切れたキーは「見つからない」扱いになるから、アプリケーションはデータベースから読み直してくれる。遅延読み込みや書き込みスルーに TTL を組み合わせると、データが古くなりすぎるのを防げて、キャッシュが不要なデータであふれるのも避けられるんだ。

クラウドおさる

棚のバナナに「この日までに食べること」と札を付けておき、期限が来たら倉庫から新しいのを取ってくる、ということでござるな!

土肥

ははは、まさにそう! そしてキャッシュがどれくらい役に立っているかを見る指標が「キャッシュヒット率」だよ。ElastiCache(Valkey / Redis OSS)では CloudWatch の CacheHitRate メトリクスで確認できて、cache_hits / (cache_hits + cache_misses) で計算されるんだ。

メトリクス意味
CacheHitsキーの読み取りに成功した数(キャッシュヒット)
CacheMissesキーの読み取りに失敗した数(キャッシュミス)
CacheHitRatecache_hits / (cache_hits + cache_misses)
Evictionsメモリの上限(maxmemory)に達したために追い出されたキーの数
土肥

ドキュメントでは、この比率がおよそ 0.8 より小さい場合、かなりの量のキーが削除された・期限切れになった・そもそも存在しない、ということを意味すると説明されているよ。

クラウドおさる

棚を見に行って空振りばかりなら、棚の置き方を見直す合図でござるな。TTL を短くしすぎていないか、メモリが足りずに追い出されていないかを確かめるのでござる。

Valkey・Redis OSS・Memcached の違い

クラウドおさる

エンジンが 3 つもあって、どれを選べばよいか迷うでござる。

土肥

まず Valkey と Redis OSS の関係から話そうか。Valkey は Redis OSS から分かれたオープンソースプロジェクトで、Redis OSS 7.2 で使える機能は Valkey 7.2 以降でもそのまま使えるんだ。既存の ElastiCache for Redis OSS から Valkey にアップグレードすることもできるよ。コマンドも同じ感覚で使えるから、この 2 つは「近い仲間」と考えていいね。

クラウドおさる

では Memcached はどう違うのでござる?

土肥

Memcached は「シンプルで速いキャッシュ」に特化したエンジンなんだ。ノードベースのクラスターで比べると、こんな違いがあるよ。

項目Valkey / Redis OSSMemcached
データ型文字列・リスト・セット・ソート済みセット・ハッシュ・ビットマップなどシンプル(文字列、オブジェクト)
レプリケーション(高可用性)ありなし
自動フェイルオーバーありなし
バックアップと復元ありなし
Pub/Subありなし
マルチスレッドなしあり
既定のポート637911211
土肥

ソート済みセットを使えばゲームのランキング(リーダーボード)も作れるし、Pub/Sub でメッセージのやり取りもできる。単なるキャッシュ以上のことをしたいなら Valkey / Redis OSS、とにかく単純なキャッシュをマルチスレッドで回したいなら Memcached、という選び方になるね。

クラウドおさる

品書きも番付もこなす Valkey と、バナナを右から左へ素早く渡すのが得意な Memcached、という違いでござるな! 今日は Valkey を使うのでござる?

土肥

そう、今日は Valkey でいこう。

サーバーレスとノードベースのクラスター

クラウドおさる

キャッシュを作るとき、サーバーレスというのも選べると聞いたでござる。

土肥

ElastiCache には 2 つのデプロイオプションがあるんだ。サーバーレスキャッシュは名前を付けるだけで作れて、容量の計画やノードの管理がいらない。メモリ・CPU・ネットワークの使用状況を見ながら自動でスケールしてくれて、データは複数の AZ に自動でレプリケートされるよ。もう一つのノードベースのクラスターは、ノードの種類・大きさ・数・AZ の配置を自分で決める方式だね。

項目サーバーレスキャッシュノードベースのクラスター
作り方名前を付けるだけ。容量の計画が不要ノードタイプ・ノード数・シャード数・AZ 配置を選ぶ
スケーリング自動(垂直・水平)手動でノードサイズやシャード・レプリカを変更。Auto Scaling も設定できる
可用性複数 AZ に自動でレプリケートシングル AZ か、レプリカを置いてマルチ AZ にするかを選ぶ
転送中の暗号化常に有効(TLS 対応のクライアントが必要)作成時に選ぶ
料金の決まり方保存したデータ量(GB 時間)と処理量(ECPU)ノードごとの時間単位
クラウドおさる

ECPU とは何でござるか?

土肥

ElastiCache Processing Units の略で、vCPU の時間と転送データ量の両方を含む単位なんだ。単純な読み書きなら、転送データ 1 KB につき 1 ECPU だよ。それと、サーバーレスキャッシュは保存データが最低 1 GB として計量されるんだ。

クラウドおさる

サーバーレスは、ほとんど何も入れていなくても 1 GB 分のデータ保存料金が時間ごとにかかるのでござる。ちょっと試すだけなら、東京リージョンの料金ページを見比べたうえで、小さなノード 1 台のクラスターのほうがバナナの減りが少なくて済むのでござるな。

土肥

そういうこと。今回のハンズオンは、ノードベースのクラスターを最小のノード 1 台で作るよ。

レプリケーションとマルチ AZ

クラウドおさる

ノード 1 台だと、そのノードが壊れたらキャッシュは空っぽでござるか?

土肥

そうなるね。そこで Valkey / Redis OSS ではレプリケーショングループを使うんだ。読み書きできるプライマリノード 1 個と、読み取り専用のリードレプリカ 1〜5 個をまとめたものだよ。プライマリのデータはレプリカへ非同期でコピーされて、読み取りをレプリカに振り分けることもできるんだ。

クラウドおさる

プライマリが倒れたら、どうなるのでござる?

土肥

マルチ AZ を有効にしておけば、レプリケーションの遅延が最も小さいリードレプリカが自動でプライマリに昇格するよ。昇格は通常数秒で終わって、アプリケーションがプライマリエンドポイントに書き込んでいるなら、接続先を変える必要もないんだ。ただし、マルチ AZ を有効にするにはリードレプリカが 1 つ以上必要で、Memcached では使えないよ。

レプリカを別の AZ に置くと、プライマリの障害時にレプリカが昇格して続けられる
レプリカを別の AZ に置くと、プライマリの障害時にレプリカが昇格して続けられる
クラウドおさる

見張り台を 2 つの峰に置いておき、片方が崩れたらもう片方が本番の見張り台になるのでござるな。合図の旗の場所(エンドポイント)は変わらないから、猿たちは迷わないのでござる!

土肥

うまいね! 今回は料金を抑えるためにレプリカなし・マルチ AZ なしで作るけど、本番ではレプリカとマルチ AZ をセットで考えるのが基本だよ。

DAX・CloudFront との使い分け

クラウドおさる

AWS には他にもキャッシュのサービスがあると聞いたでござる。DAX や CloudFront とはどう違うのでござるか?

土肥

どれもキャッシュだけど、「どこに置いて、何をキャッシュするか」が違うんだ。DynamoDB Accelerator(DAX)は DynamoDB 専用のインメモリキャッシュで、DynamoDB と API の互換性があるから、既存のアプリケーションは最小限の変更で使えるよ。結果整合性のある読み込みの応答時間を、1 桁ミリ秒からマイクロ秒単位にまで短くできるんだ。CloudFront は世界中のエッジロケーションで、HTML・CSS・JavaScript・画像などのウェブコンテンツをキャッシュして配信するサービスだね。

サービスキャッシュする場所主な対象向いている場面
ElastiCacheVPC 内(アプリケーションの近く)アプリケーションが自由に決めたキーと値(RDS のクエリ結果、セッション、ランキングなど)データベースの種類を問わず、アプリケーション側でキャッシュを制御したい
DAXアプリケーションと DynamoDB の間DynamoDB の読み込み結果DynamoDB の読み込みを、アプリケーションの変更を最小限にして速くしたい
CloudFront世界中のエッジロケーションウェブコンテンツ(静的・動的)利用者に近い場所からコンテンツを配信したい
クラウドおさる

麓の茶屋に置く土産物が CloudFront、蔵の前に置く DynamoDB 専用の棚が DAX、どの蔵の品でも置ける手元の棚が ElastiCache、という分け方でござるな!

土肥

そうそう、その整理でばっちり! 1 つのシステムで組み合わせて使うことも多いよ。では実際に、Valkey のクラスターを作って手を動かしてみよう。

新卒・未経験の方へ
クラウドおさる

AWS を仕事にしたい方へ ── 新卒・未経験から

この記事を書いているのは、AWS の設計・構築を仕事にしている現役エンジニアです。運営元の株式会社ジェニュインでは、新卒・未経験の方も募集しています。異業種や文系からインフラエンジニアになり活躍しているメンバーもいます。

  • ✓システム開発・WEB エンジニア / インフラ構築などの職種で、未経験から応募できます
  • ✓未経験から入社した社員の声を含む社員アンケートを掲載
  • ✓応募フォームから 1 分で応募できます

実践

ハンズオンガイド7 ステップ画面 8 枚

コンソールの横に開いて、チェックしながら進めましょう。

ガイドを開く

別タブで開きます。チェックはこのブラウザに保存されます。

プライベートサブネットにノード 1 台の Valkey クラスター(クラスターモード無効、レプリカなし、転送中の暗号化あり)を作成し、同じ VPC のパブリックサブネットにある EC2 から valkey-cli で接続して、SET・GET・TTL とキャッシュヒット・ミスの数を確認します。キャッシュ用のセキュリティグループとサブネットグループも手順の中で作成します。

前提条件

  • リージョン: ap-northeast-1(東京)
  • AWS マネジメントコンソールにログイン済みで、IAM ユーザーまたはロールに ElastiCache・EC2・Systems Manager の操作権限があること
  • 以下のリソースが作成済みであること
リソース種別リソース名内容
VPCelasticache-vpcCIDR 10.0.0.0/16
パブリックサブネットelasticache-public-subnet-1a10.0.1.0/24(ap-northeast-1a)。インターネットゲートウェイへのルートあり
プライベートサブネットelasticache-private-subnet-1a / elasticache-private-subnet-1c10.0.11.0/24(ap-northeast-1a)/ 10.0.12.0/24(ap-northeast-1c)。インターネットへのルートなし
セキュリティグループelasticache-client-sgクライアント EC2 用。インバウンドルールなし
EC2 インスタンスelasticache-clientAmazon Linux 2023。elasticache-public-subnet-1a に配置し、elasticache-client-sg を付与。valkey-cli を含む valkey パッケージをインストール済み。AmazonSSMManagedInstanceCore を含むインスタンスプロファイルが付与され、Session Manager で接続できる状態

VPC とサブネットの考え方は Amazon VPC で仮想ネットワークを構築しサブネットを設定する、EC2 の基本は Amazon EC2 でインスタンスを起動しSSH接続する、セキュリティグループの考え方は セキュリティグループとネットワーク ACL でアクセスを制御する を参照してください。

作成するリソース一覧

リソース種別リソース名用途
セキュリティグループelasticache-cache-sgキャッシュ用。elasticache-client-sg からの TCP 6379 のみ許可
ElastiCache サブネットグループelasticache-handson-subnet-groupキャッシュを置くプライベートサブネット 2 つ(2 AZ)のセット
ElastiCache クラスター(Valkey)elasticache-handson-valkeyノードベース、クラスターモード無効、cache.t4g.micro 1 台(レプリカなし)

キャッシュ用のセキュリティグループを作成する

  • AWS マネジメントコンソールにログインし、リージョンが ap-northeast-1(東京)であることを確認します
  • 上部の検索バーに EC2 と入力し、表示された「EC2」を選択します
  • 左側ナビゲーションの「ネットワーク & セキュリティ」→「セキュリティグループ」を選択します
  • 右上の「セキュリティグループを作成」をクリックします
  • 「基本的な詳細」で以下を入力します
  • セキュリティグループ名: elasticache-cache-sg
  • 説明: Security group for elasticache-handson-valkey
  • VPC: elasticache-vpc
  • 「インバウンドルール」セクションで「ルールを追加」をクリックし、以下を入力します
  • タイプ: カスタム TCP
  • ポート範囲: 6379
  • ソース: カスタム のまま、右の検索ボックスに elasticache-client-sg と入力して候補から選択(選択すると sg- で始まる ID が表示されます)
  • 「アウトバウンドルール」はデフォルトのままにします
  • ページ下部の「セキュリティグループを作成」をクリックします
elasticache-cache-sg のインバウンドルール入力画面(タイプ カスタム TCP、ポート範囲 6379、ソースに elasticache-client-sg を指定した状態)
elasticache-cache-sg のインバウンドルール入力画面(タイプ カスタム TCP、ポート範囲 6379、ソースに elasticache-client-sg を指定した状態)

サブネットグループを作成する

  • 上部の検索バーに ElastiCache と入力し、表示された「ElastiCache」を選択します
  • 左側ナビゲーションの「設定」→「サブネットグループ」を選択します
  • 「サブネットグループを作成」をクリックします
  • 「サブネットグループの設定」で以下を入力します
  • 名前: elasticache-handson-subnet-group
  • 説明: Private subnets for elasticache-handson-valkey
  • VPC ID: 初期表示は別の VPC なので、選択欄から elasticache-vpc の VPC ID(vpc-xxxx (elasticache-vpc) 形式)を選び直す
  • VPC を選び直すと「選択済みのサブネット」に VPC 内のサブネットがすべて表示されるので、「管理」をクリックし、elasticache-private-subnet-1a(10.0.11.0/24)と elasticache-private-subnet-1c(10.0.12.0/24)の 2 つだけにチェックを入れて「選択」をクリックします
  • 「作成」をクリックします
サブネットグループの作成画面(VPC に elasticache-vpc、選択済みのサブネットにプライベートサブネット 2 つが表示されている状態)
サブネットグループの作成画面(VPC に elasticache-vpc、選択済みのサブネットにプライベートサブネット 2 つが表示されている状態)

サブネットグループの一覧に elasticache-handson-subnet-group が表示されることを確認します。

Valkey クラスターを作成する

設定項目が多いため、ここで指定する項目以外はすべてデフォルトのままにします。

  • 左側ナビゲーションの「Valkey キャッシュ」を選択し、「Valkey キャッシュを作成」をクリックします
  • 「モード」が Valkey であることを確認し、「デプロイオプション」で ノードベースのキャッシュ を選択します(初期値はサーバーレスです)
  • 「作成方法」で クラスターキャッシュ を選択します(初期値は 簡単な作成 です)
  • 「クラスターモード」で 無効 を選択します
  • 「クラスター情報」の「名前」に elasticache-handson-valkey と入力します
  • 「ロケーション」で AWS クラウド を選択し、「マルチ AZ」の「有効化」のチェックを外します
Valkey キャッシュの作成画面の上部(ノードベースのキャッシュ・クラスターキャッシュ・クラスターモード無効・名前・マルチ AZ のチェックを外した状態)
Valkey キャッシュの作成画面の上部(ノードベースのキャッシュ・クラスターキャッシュ・クラスターモード無効・名前・マルチ AZ のチェックを外した状態)

続けて、同じ画面の「キャッシュ設定」と「接続性」を設定します。

  • 「キャッシュ設定」で以下を設定します
  • エンジンバージョン: デフォルトのまま
  • ポート: 6379(デフォルト)
  • ノードのタイプ: 選択欄を開いて cache.t4g.micro を検索して選択(初期値は cache.r8g.large です)
  • レプリケーション数: 0(初期値は 2 です)。0 にすると、「マルチ AZ」と「自動フェイルオーバー」は選択できない状態になります
  • 「接続性」で以下を設定します
  • ネットワークタイプ: IPv4(デフォルト)
  • サブネットグループ: 既存のサブネットグループを選択 を選び、elasticache-handson-subnet-group を選択(このアカウントでは作成済みのサブネットグループが 1 つだけなので、最初から選ばれています)
  • 「アベイラビリティーゾーンの配置」は 指定がありません(デフォルト)のままにします
  • 「次へ」をクリックします
Valkey キャッシュの作成画面の「キャッシュ設定」「接続性」セクション(ノードのタイプ cache.t4g.micro、レプリケーション数 0、サブネットグループ elasticache-handson-subnet-group を設定した状態)
Valkey キャッシュの作成画面の「キャッシュ設定」「接続性」セクション(ノードのタイプ cache.t4g.micro、レプリケーション数 0、サブネットグループ elasticache-handson-subnet-group を設定した状態)

「詳細設定」の画面で、セキュリティとバックアップを設定します。

  • 「セキュリティ」で以下を設定します
  • 保管時の暗号化: デフォルト(有効)のまま
  • 転送中の暗号化: 有効化 にチェックが入っていることを確認します
  • アクセスコントロール: アクセスコントロールがありません(デフォルト)
  • 「選択済みのセキュリティグループ」で「管理」をクリックし、elasticache-cache-sg にチェックを入れて「選択」をクリックします(初期状態ではどのセキュリティグループも選ばれていません)
  • 「バックアップ」で「自動バックアップを有効化」のチェックを外します
  • その他の項目はデフォルトのままにし、「次へ」をクリックします
詳細設定画面の「セキュリティ」セクション(転送中の暗号化が有効、セキュリティグループに elasticache-cache-sg を選択した状態)
詳細設定画面の「セキュリティ」セクション(転送中の暗号化が有効、セキュリティグループに elasticache-cache-sg を選択した状態)
  • 確認画面で設定内容を確認し、ページ下部の「作成」をクリックします

Valkey キャッシュの一覧に elasticache-handson-valkey が表示されます。作成には 10 分以上かかります。ステータスが Creating から Available になるまで待ちます。

  • elasticache-handson-valkey の名前をクリックし、詳細画面を開きます
  • 「クラスターの詳細」の「プライマリエンドポイント」(master.elasticache-handson-valkey.xxxxxx.apne1.cache.amazonaws.com:6379 のような形式)をコピーして控えます
  • 「転送中の暗号化」が有効になっていることを確認します
elasticache-handson-valkey の詳細画面(ステータス「Available」、ノードのタイプ cache.t4g.micro、プライマリエンドポイント、転送中の暗号化が有効と表示されている状態)
elasticache-handson-valkey の詳細画面(ステータス「Available」、ノードのタイプ cache.t4g.micro、プライマリエンドポイント、転送中の暗号化が有効と表示されている状態)
クラウドおさる

ノードベースのクラスターは、使っていなくてもAvailable になった時点から 1 時間単位でノードの料金がかかり続けるのでござる。止めておく機能はないので、試し終わったらクラスターを削除するのを忘れぬようにするのでござるぞ。

EC2 から Valkey に接続して SET・GET・TTL を試す

  • 上部の検索バーに EC2 と入力し、表示された「EC2」を選択します
  • 左側ナビゲーションの「インスタンス」を選択し、elasticache-client を選択して「接続」をクリックします
  • 「ウェブブラウザで」タブの「接続方法を選択」で SSM セッションマネージャー を選択し、右下の「接続」をクリックします
  • ブラウザ上にターミナルが開いたら、控えたプライマリエンドポイントのホスト名部分(末尾の :6379 を除いたもの)を変数に入れ、名前解決します
EP=<プライマリエンドポイントのホスト名>
getent hosts $EP

10.0.11.x または 10.0.12.x のプライベート IP アドレスが返り、キャッシュがプライベートサブネットにあることが確認できます。

  • valkey-cli で接続します。転送中の暗号化を有効にしたので --tls を付けます
valkey-cli -h $EP --tls -p 6379
  • PING を実行し、PONG が返ることを確認します
PING
  • 会員 1 番のデータをキャッシュに書き込んで、読み出してみます。キャッシュアサイドで「RDS から読んだ結果をキャッシュに入れた」状態をイメージした操作です
SET member:1 "cloud-osaru"
GET member:1

SET に OK、GET に "cloud-osaru" が返ります。これがキャッシュヒットです。

  • 次に、30 秒で期限切れになるキーを書き込み、TTL で残り秒数を確認します
SET session:osaru "banana" EX 30
TTL session:osaru

TTL を実行するたびに、30 から減っていく残り秒数が返ります。

  • 30 秒以上待ってから、同じキーを読み出します
GET session:osaru

(nil) が返り、期限が切れたキーは「見つからない」扱いになったことが確認できます。アプリケーションであれば、ここでデータベースから読み直してキャッシュに入れ直します(キャッシュミス)。

Session Manager のターミナルで getent hosts がプライベート IP を返し、valkey-cli で PING・SET・GET・TTL を実行し、期限切れ後の GET が (nil) を返している画面
Session Manager のターミナルで getent hosts がプライベート IP を返し、valkey-cli で PING・SET・GET・TTL を実行し、期限切れ後の GET が (nil) を返している画面
  • exit と入力して valkey-cli を終了します

キャッシュヒットとキャッシュミスの数を確認する

CacheHits・CacheMisses メトリクスの元になっている統計(keyspace_hits・keyspace_misses)は、INFO コマンドで直接見ることができます。

  • 同じターミナルで、以下を実行します
valkey-cli -h $EP --tls -p 6379 INFO stats | grep keyspace

keyspace_hits と keyspace_misses が表示されます。先ほどの GET member:1 と、キーが存在している間に実行した TTL(2 回)が成功した読み取りとして keyspace_hits に、期限切れ後の GET session:osaru が失敗した読み取りとして keyspace_misses に数えられています(検証では keyspace_hits が 3、keyspace_misses が 1 でした)。GET 以外でも、存在するキーを参照するコマンドはヒットに数えられます。

  • ヒット・ミスが増えることを確かめるため、存在するキーと存在しないキーを 1 回ずつ読み出してから、もう一度統計を表示します
valkey-cli -h $EP --tls -p 6379 GET member:1
valkey-cli -h $EP --tls -p 6379 GET member:2
valkey-cli -h $EP --tls -p 6379 INFO stats | grep keyspace

keyspace_hits と keyspace_misses がそれぞれ 1 ずつ増えていることが確認できます。

Session Manager のターミナルで INFO stats の keyspace_hits・keyspace_misses が表示され、GET の後にそれぞれ 1 ずつ増えている画面
Session Manager のターミナルで INFO stats の keyspace_hits・keyspace_misses が表示され、GET の後にそれぞれ 1 ずつ増えている画面
クラウドおさる

キャッシュにはパブリック IP もインターネットへの道もないのに、腕章(elasticache-client-sg)を付けた EC2 からだけは話しかけられたのでござる。棚を見に行って当たった数と空振りした数も数えられるので、棚の置き方の良し悪しを数字で確かめられるのでござるな。

まとめ

  • Amazon ElastiCache は、Valkey・Redis OSS・Memcached を使うインメモリのキャッシュ・データストアを、AWS がセットアップ・管理・スケーリングしてくれるマネージドサービスである
  • 遅延読み込み(キャッシュアサイド)は読み込み時にミスしたデータだけをキャッシュに入れ、書き込みスルーはデータベースへの書き込み時にキャッシュも更新する。TTL を組み合わせると、データが古くなりすぎるのを防げる
  • キャッシュヒット率は cache_hits / (cache_hits + cache_misses) で、CloudWatch の CacheHitRate で確認できる
  • Valkey / Redis OSS は多彩なデータ型・レプリケーション・バックアップを持ち、Memcached はシンプルなデータ型とマルチスレッドが特徴である
  • サーバーレスキャッシュは容量の計画が不要で、保存データ量(最低 1 GB として計量)と ECPU で課金される。ノードベースのクラスターはノードの種類・数・配置を自分で決め、ノード時間で課金される
  • Valkey / Redis OSS のレプリケーショングループはプライマリ 1 個とリードレプリカ 1〜5 個で構成され、マルチ AZ を有効にするとプライマリ障害時にレプリカが自動で昇格する(レプリカ 1 個以上が必要)
  • ElastiCache はアプリケーションが制御する汎用のキャッシュ、DAX は DynamoDB 専用のキャッシュ、CloudFront はエッジロケーションでウェブコンテンツをキャッシュするサービスとして使い分ける

参照先

キャリア相談
クラウドおさる

独学の先に、AWS の仕事がある ── ジュニアおさるのキャリア相談

CLF には受かったけれど、次に何をすればいいのか分からない。独学で AWS を学ぶジュニアおさるの相談に、株式会社ジェニュイン代表の土肥が答えています。

  • ✓資格はゴールか、CLF の次に何から手を付けるか
  • ✓EC2 の次に作ってみる構成と、IaC・コスト管理
  • ✓実務経験ゼロでも、面接で話せる「これまで」の作り方
新卒・未経験の方へ
クラウドおさる

AWS を仕事にしたい方へ ── 新卒・未経験から

この記事を書いているのは、AWS の設計・構築を仕事にしている現役エンジニアです。運営元の株式会社ジェニュインでは、新卒・未経験の方も募集しています。異業種や文系からインフラエンジニアになり活躍しているメンバーもいます。

  • ✓システム開発・WEB エンジニア / インフラ構築などの職種で、未経験から応募できます
  • ✓未経験から入社した社員の声を含む社員アンケートを掲載
  • ✓応募フォームから 1 分で応募できます

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

株式会社ジェニュイン(https://genuine-pt.jp)の代表取締役.

2018年〜インフラエンジニアとしてキャリアをスタートし、オンプレミスのネットワーク・サーバ環境で3年半、クラウド環境で4年半の8年間エンジニアとして従事。
2021年に佐藤氏の創業した株式会社Luxyを引き継ぎ、代表に就任。
その後アガルートグループ内の株式会社ジェニュインと合併。
合併後同社代表に就任。

目次