AWS再入門2022 AWS ElastiCacheについて

2022.02.15

こんにちは、白石です。

当エントリは弊社コンサルティング部による『AWS 再入門ブログリレー 2022』の 10日目のエントリです。

このブログリレーの企画は、普段 AWS サービスについて最新のネタ・深い/細かいテーマを主に書き連ねてきたメンバーの手によって、 今一度初心に返って、基本的な部分を見つめ直してみよう、解説してみようというコンセプトが含まれています。

AWSをこれから学ぼう!という方にとっては文字通りの入門記事として、またすでにAWSを活用されている方にとってもAWSサービスの再発見や2022年のサービスアップデートのキャッチアップの場となればと考えておりますので、ぜひ最後までお付合い頂ければ幸いです。1つでも知らない機能があり、学びにつながれば幸いです。

では、さっそくいってみましょう。10日目のテーマはAmazon ElastiCacheです。

Amazon ElastiCache とは?

Amazon ElastiCache は、柔軟なリアルタイムのユースケースをサポートするフルマネージドのインメモリキャッシングサービスで、Memcached または Redis プロトコルに互換性があります。

特徴

読み込み量が多いアプリケーションの大量の作業負荷 (ソーシャルネットワーキング、ゲーム、メディア共有、Q&A ポータルなど) や莫大な計算処理を必要とする作業負荷 (レコメンデーションエンジンなど) におけるレイテンシーやスループットを改善するために使用することができます。さらに、Redis は高度なデータ構造をサポートしているため、コスト効率が高い方法で、データベース層を拡張し、データベース経由では簡単に達成できない機能を実行できます。
Amazon ElastiCache の特徴

料金

オンデマンドノードは、1時間あたりの課金となり、リザーブドノードは、1年または3年での支払いになります。 これらに加えて、バックアップストレージとデータ転送(リージョン内/外)、ElastiCache for Outposts利用可否によって値段が決まります。

Amazon ElastiCache の料金

ユースケース

ビジネスユースケースにおいて、最もユーザーが必要としている/より多くアクセスされるデータを高速にレスポンスとして返したい際、データをキャッシュし利用します。 アプリケーションとデータベースパフォーマンスを高速化するキャッシングに使ったり、セッションストア、ゲーミングリーダーボード、ストリーミング、および分析などの耐久性を必要としないユースケースのプライマリデータストアとして使用することができます。

個人的な経験上、マルチプレーヤーゲームにおけるユーザーランキング計算/表示、Formデータ計算結果の一時保存、各ユーザー状態に依存する分岐条件、また、抽選サイトや配信サイトのセッションデータ、レコメンデーション、DBデータの一時退避・冗長退避など、多くの場面で使うことが出来る印象です。

後述で紹介しているブログ内にあります、どんなデータを保存したら良いの?も、とても参考になりますので、ぜひご一読ください。

Memcached と Redis の比較

個人的には、下記公式リファレンスより、Memcachedの説明文にある「できるだけシンプルなモデルが必要である。」が、的を得て重要なのではないかと思いました。これは、詰まるところ、キャッシュを利用するにあたり、そのプロダクトで扱う各ノードの構成、データ型の複雑性やソート、バックアップと復元性、(並行)処理やイベント通知方法など、一つ一つ判断していく必要があると考えるからです。

選択の判断に関しては、過去、弊社ブログでも紹介されており、とても参考になります。

ElastiCacheはMemcachedとRedisのどっちを選ぶ?

ノード、シャード、クラスターとは?

上記のリファレンスや記事でも出てくる、「ノード、シャード、クラスター」についての説明です。  

ノードとは、Amazon ElastiCache をデプロイするときの最小構成要素です。これは、ネットワークに接続されたセキュアな RAM の固定サイズの断片です。各ノードでは Memcached または Redis プロトコル準拠サービスのインスタンスが実行され、それぞれの DNS 名とポートがあります。関連付けられているメモリ量の異なる、複数タイプのノードがサポートされています。Redis シャードは、クラスターのキースペースのサブセットで、プライマリノードおよびゼロ個以上のリードレプリカを含めることができます。Redis デプロイメントの詳細については、下の Redis についてのセクションを参照してください。クラスターは複数のシャードによって形成されます。
Amazon ElastiCache のノード、シャード、クラスターとは何ですか?

シャードは、詰まるところノードのグループです。

シャード (API と CLI ではノードグループ) はノードの階層的配列であり、
Redis のノードとシャード

チュートリアル

ElastiCacheのハンズオンが3つ公開されています。
手始めに Amazon ElastiCache for Redis を使い、MySQL データベースのパフォーマンスを向上させる をやってみました。

構成は下記で、実行コードはこちらです。

やってることとしては、1つ目の関数は、Redis上の値の存在チェックを行ない、値が存在しない場合はデータベースにSQLで問い合わせています。その後、問い合わせた結果を、Redisに保存しています。2つ目の関数は、単にキャッシュまたは、データベースからid指定(key)でレコードを取得しています。

ファイル構成

(venv) [ec2-user@ip-xxx-xx-x-x database-caching]$ ls
INSTALL  README.md  __pycache__  example.py  example.pyc  images  requirements.txt  seed.sql  venv
(venv) [ec2-user@ip-xxx-xx-x-x database-caching]$ cat requirements.txt 
PyMySQL==0.9.3
redis==3.2.1

ポイント

  • 気づいたら venv 環境下におらず、コマンドが通らない...場合は、焦らず「チュートリアル概要の前提条件」のコマンドに立ち返りましょう
  • 各STEPにて書かれてはいますが、もしMySQLやElastiCacheへの通信が出来ない場合は、セキュリティグループのインバウンドを見直して見て下さい
  • L59 f"" 部分で Invalid Syntax が出る
    • こちらの記事 を参考にさせていただき、該当部分を "".format() に書き換えました。実際にエラーが出た環境も3系でした。
      (venv) [ec2-user@ip-xxx-xx-x-x database-caching]$ python --version
      Python 3.7.10
      def planet(id):
          """Retrieve a record from the cache, or else from the database."""
          key = "planet:{id}".format()
          res = Cache.hgetall(key)
  • シェルから python を実行する方法
    (venv) [ec2-user@ip-xxx-xx-x-x database-caching]$ python -c 'import example; print(example.fetch("SELECT * FROM planet"))'
    [{'id': 1, 'name': 'Mercury'}, {'id': 2, 'name': 'Venus'}, {'id': 3, 'name': 'Earth'}, {'id': 4, 'name': 'Mars'}, {'id': 5, 'name': 'Jupiter'}, {'id': 6, 'name': 'Saturn'}, {'id': 7, 'name': 'Uranus'}, {'id': 8, 'name': 'Neptune'}]

合わせて読みたい

.

ElastiCache学習の第一歩に、Webアプリケーションのセッション情報を保存する公式チュートリアルをやってみた

ElastiCacheは良いサービス!!特徴や使い方をおさらいしましょ!

最後に

これまで何気無く利用してきたキャッシュサービスも、実際に実装してみることで理解が深まります。

チュートリアルと動画 には、入門向け/上級者向け動画として、AWS re:Invent 2020 時点で紹介された Amazon ElastiCache の新機能やベストプラクティスへのリンクが掲載されています。

より具体的な実装イメージがわきそうなので、次はAmazon Aurora Serverless と Amazon ElastiCache を使用してリアルタイムなリーダーボードをビルドするハンズオンにチャレンジしてみたいと思います。

以上、『AWS 再入門ブログリレー 2022』の 10日目のエントリ『AWS Elasticache』編でした。

明日 (2/16) は、川村さんの 「Amazon Transcribe」の予定です。お楽しみに!!

参考