Amazon ElastiCache でキャッシュを置いて読み込みを速くする
記事の「実践」を 1 項目ずつ進めるためのページです。AWS マネジメントコンソールで操作したら、右の一覧にチェックを入れてください。チェックはこのブラウザに保存されます。
前提条件
- リージョン:
ap-northeast-1(東京) - AWS マネジメントコンソールにログイン済みで、IAM ユーザーまたはロールに ElastiCache・EC2・Systems Manager の操作権限があること
- 以下のリソースが作成済みであること
| リソース種別 | リソース名 | 内容 |
|---|---|---|
| VPC | elasticache-vpc | CIDR 10.0.0.0/16 |
| パブリックサブネット | elasticache-public-subnet-1a | 10.0.1.0/24(ap-northeast-1a)。インターネットゲートウェイへのルートあり |
| プライベートサブネット | elasticache-private-subnet-1a / elasticache-private-subnet-1c | 10.0.11.0/24(ap-northeast-1a)/ 10.0.12.0/24(ap-northeast-1c)。インターネットへのルートなし |
| セキュリティグループ | elasticache-client-sg | クライアント EC2 用。インバウンドルールなし |
| EC2 インスタンス | elasticache-client | Amazon 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と入力し、表示された「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 つだけにチェックを入れて「選択」をクリックします - 「作成」をクリックします
サブネットグループの一覧に elasticache-handson-subnet-group が表示されることを確認します。
Valkey クラスターを作成する
設定項目が多いため、ここで指定する項目以外はすべてデフォルトのままにします。
- 左側ナビゲーションの「Valkey キャッシュ」を選択し、「Valkey キャッシュを作成」をクリックします
- 「モード」が
Valkeyであることを確認し、「デプロイオプション」でノードベースのキャッシュを選択します(初期値はサーバーレスです) - 「作成方法」で
クラスターキャッシュを選択します(初期値は簡単な作成です) - 「クラスターモード」で
無効を選択します - 「クラスター情報」の「名前」に
elasticache-handson-valkeyと入力します - 「ロケーション」で
AWS クラウドを選択し、「マルチ AZ」の「有効化」のチェックを外します
続けて、同じ画面の「キャッシュ設定」と「接続性」を設定します。
- 「キャッシュ設定」で以下を設定します
- エンジンバージョン: デフォルトのまま
- ポート:
6379(デフォルト) - ノードのタイプ: 選択欄を開いて
cache.t4g.microを検索して選択(初期値はcache.r8g.largeです) - レプリケーション数:
0(初期値は2です)。0にすると、「マルチ AZ」と「自動フェイルオーバー」は選択できない状態になります
- 「接続性」で以下を設定します
- ネットワークタイプ:
IPv4(デフォルト) - サブネットグループ:
既存のサブネットグループを選択を選び、elasticache-handson-subnet-groupを選択(このアカウントでは作成済みのサブネットグループが 1 つだけなので、最初から選ばれています)
- ネットワークタイプ:
- 「アベイラビリティーゾーンの配置」は
指定がありません(デフォルト)のままにします - 「次へ」をクリックします
「詳細設定」の画面で、セキュリティとバックアップを設定します。
- 「セキュリティ」で以下を設定します
- 保管時の暗号化: デフォルト(有効)のまま
- 転送中の暗号化:
有効化にチェックが入っていることを確認します - アクセスコントロール:
アクセスコントロールがありません(デフォルト)
- 「選択済みのセキュリティグループ」で「管理」をクリックし、
elasticache-cache-sgにチェックを入れて「選択」をクリックします(初期状態ではどのセキュリティグループも選ばれていません) - 「バックアップ」で「自動バックアップを有効化」のチェックを外します
- その他の項目はデフォルトのままにし、「次へ」をクリックします
- 確認画面で設定内容を確認し、ページ下部の「作成」をクリックします
Valkey キャッシュの一覧に elasticache-handson-valkey が表示されます。作成には 10 分以上かかります。ステータスが Creating から Available になるまで待ちます。
elasticache-handson-valkeyの名前をクリックし、詳細画面を開きます- 「クラスターの詳細」の「プライマリエンドポイント」(
master.elasticache-handson-valkey.xxxxxx.apne1.cache.amazonaws.com:6379のような形式)をコピーして控えます - 「転送中の暗号化」が有効になっていることを確認します
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) が返り、期限が切れたキーは「見つからない」扱いになったことが確認できます。アプリケーションであれば、ここでデータベースから読み直してキャッシュに入れ直します(キャッシュミス)。
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 ずつ増えていることが確認できます。