[AWS]キャッシュサーバーの作成

# キャッシュの仕組み
アプリのクライアントとサーバー間の通信の高速化を実現するための手法として、「キャッシュ」が存在します。キャッシュは時間のかかる処理を、キャッシュサーバーにデータを保存することで、2回目以降の通信は保存済みのデータから処理の結果を返すことによって、通信の高速化を実現化しています。

オリジンサーバーは、配信するデータの元となるオリジナルのコンテンツ（動画・画像・文字データなど）を格納しているサーバーです。キャッシュサーバーは、このオリジンサーバーから配信されるデータを複製して格納したサーバーのことで、複数のキャッシュサーバーは物理的に離れたところに配置されており、2回目のサーバーへの接続はユーザーから一番近いキャッシュサーバーから配信されます。

![名称未設定ファイル-ページ4.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790379/f9c62f32-6b61-5030-3037-ce9f28a7a8be.png)

キャッシュサーバーがあることで、オリジンサーバーへのアクセスが集中することを防ぐことができ、ユーザーはWebコンテンツなどのレスポンスが向上するなど、メリットがあります。しかし、デメリットも存在しています。具体的には、サーバー内に残っているキャッシュが古い場合は、最新の情報が配信されない、キャッシュに個人情報が残っていると、個人情報の漏洩のリスクなどが挙げられます。これらを解決するためにも、キャッシュを最新なものにする、そしてキャッシュの保持する期間を短くするなど、さまざまな対応が求められます。

# キャッシュサービスの種類
オープンソースで提供されているキャッシュで、よく利用されているものにRedis、Memcachedと呼ばれるものがあります。これらはより効率的、高速、信頼性を実現するのに適しています。

https://aws.amazon.com/jp/elasticache/redis-vs-memcached/

AWSには、ElastiCacheと呼ばれるRedis、Memcachedと互換性のあるマネージドサービスが用意されています。利用者は単に、利用するキャッシュを選択するだけで簡単にキャッシュサーバーを構築できます。また、キーバリュー方式型の仕組みを採用しており、データ種類や量に応じて効率的に管理をすることができます。

# ElasiCacheの特徴
ElastiCacheには、ノードと呼ばれるキャッシュを保存する場所が存在します。また、ノードが1~6個集まるとシャードと呼ばれます。ノードには2種類存在し、更新と照会を行うプライマリーノードと、プライマリーノードが行った更新をコピーしたレプリカノードがあり、シャード1単位をこれら2つを含めたものになります。データの照会はプライマリーノードが行い、レプリカノードはプライマリーノードが更新されると、複数のレプリカノードにコピーを行います。これによって、例えプライマリーノードに障害が発生しても、照会はレプリカノードでもできるといった耐障害性を持っています。

そして、複数のシャードで構成されているものをクラスターと呼び、ElastiCacheではクラスター構成を取ることができます。クラスター構成によって、複数のサーバを一つに集約させて、利用者や他のサーバから、全体で1台のサーバであるかのように見せることができます。

# ElastiCacheの作成
今回は、キャッシュエンジンにRedisを使って、シャード内にノードを3つ(プライマリー1+レプリカ2)の構成で作成していきます。

ElastiCacheダッシュボード=>Redisクラスターを作成 をクリックします。

![ELCache 作成①.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790379/e1c08651-6966-b0b4-20c4-976e57f88fef.png)

|名前|説明|ロケーション|マルチAZ|
|:--:|:--:|:--:|:--:|
|sample-elasticache|Sample Elasticache|AWSクラウド|有効化|

マルチAZ構成を有効化することで、片方のAZに障害が発生してもキャッシュサーバーが機能するようにします。

![クラスター情報.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790379/d67f2811-1e17-e396-ccdd-f1a8eea6f40d.png)

![クラスター設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790379/7a2d673f-098d-8cd3-392f-2383a66018ef.png)

|ネットワークタイプ|名前|説明|VPC|
|:--:|:--:|:--:|:--:|
|IPv4|sample-elasticache-sg|任意の説明|作成したVPC|

![接続性.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790379/5dadcc70-0390-5309-ad4d-1bd1a341515d.png)

![ELCache AZ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790379/9c4a0fe3-dde5-1634-44ef-3b5fa2c4ce55.png)

# 動作確認

```
$ ssh web01
```
Amazon linnux2にはredis-cliコマンドがインストールされていないため、まずはインストールします。
```
$ amazon-linux-extras list (redis6ライブラリーがあるかの確認)

$ sudo amazon-linux-extras install redis6
```
次に、クラスターに接続テストを行っていきます。まずは、キャッシュサーバーに接続して、キーのオブジェクトを取得した際に、バリューが返ってくるかを確認していきます。
```
$ redis-cli -c -h <Redisクラスターの設定からエンドポイントを指定(末尾のポート番号は消去)>
```
```
$ set key1 "hello wrold"
$ expire key1 10
$ get key1
```
setで"key1"に"hello world"を設定し、expireで"key1"の有効期限を10秒間とします。getで"key1"の中身が帰ってきますが、10秒たった後にgetコマンドを入力すると、nillが返ってきます。

# 参考
AWSではじめるインフラ構築入門 翔泳社出版

https://adam-technologies.jp/column/seo-speed/cdn/

https://voice.stream.co.jp/technology/20211109/

https://chibinfra-techblog.com/aws-amazon-elasticache-howto-1/