AWSでウェブアプリケーション環境構築：④ElastiCacheのRedisを作成し、セッション共有可能にする

# はじめに
これはシリーズ記事の中の1つです。

[AWSでウェブアプリケーション環境構築：⓪概要](https://qiita.com/minato-naka/items/ddb5f5301f9f590cdcbf)
[AWSでウェブアプリケーション環境構築：①EC2インスタンスにwebサーバを構築](https://qiita.com/minato-naka/items/c21e4d53db7a720f8fdd)
[AWSでウェブアプリケーション環境構築：②RDSでDBを作成し、Laravelサンプルアプリを動かす最小構成を構築](https://qiita.com/minato-naka/items/03f9dbd09eb3919a501f)
[AWSでウェブアプリケーション環境構築：③ロードバランサーを作成し、webサーバを冗長化する](https://qiita.com/minato-naka/items/396e2a25ec9a94840a67)
[AWSでウェブアプリケーション環境構築：④ElastiCacheのRedisを作成し、セッション共有可能にする](https://qiita.com/minato-naka/items/76cd5f660d987d34f7be)
**↑↑↑現在の記事↑↑↑**
[AWSでウェブアプリケーション環境構築：⑤webサーバをプライベートサブネットに配置し、メンテナンス用踏み台サーバを構築](https://qiita.com/minato-naka/items/406c2f247c0d29a93665)
[AWSでウェブアプリケーション環境構築：⑥Route53を利用して独自ドメインでアクセス可能にする](https://qiita.com/minato-naka/items/6f29694c1540f04dedb2)
[AWSでウェブアプリケーション環境構築：⑦ACMを利用してHTTPS通信可能にする](https://qiita.com/minato-naka/items/1a4f03e85857b8f61c4f)
[AWSでウェブアプリケーション環境構築：⑧サーバ負荷に応じてwebサーバがオートスケーリングする仕組みを構築](https://qiita.com/minato-naka/items/c0fab5d9fbb1cce68ac9)


# 前回まで
![3.png](https://qiita-image-store.s3.amazonaws.com/0/297693/a76c0a9a-ec2d-bbf1-ba9b-82126a587d13.png)

前回はロードバランサーを作成し、webサーバを冗長化して
Laravelサンプルアプリが動作する状態にしました。

しかし、2台のwebサーバがセッションを共有できていないため
「TokenMismatchException」が発生する状態です。

# 今回構築する環境
![4.png](https://qiita-image-store.s3.amazonaws.com/0/297693/632c4356-3028-a9ba-5db6-c90910bc2358.png)

webサーバ間でセッションを共有するために
ElastiCacheのRedisを作成します。

このRedisにセッションを保存し共有することで、
前回発生した「TokenMismatchException」が発生しなくなります。

# ElastiCacheのRedisを構築
Redisを作成するためには
・Redis用サブネットグループの作成
・Redis用セキュリティグループの作成
・Redisの作成
が必要です。

## Redis用サブネットグループ作成
[AWSでウェブアプリケーション環境構築：RDSでDBを作成し、Laravelサンプルアプリを動かす最小構成を構築](https://qiita.com/minato-naka/items/03f9dbd09eb3919a501f)
でRDS用にサブネットグループを作成したのと同じで、
Redisを作成するときもサブネットグループを作成する必要があります。

[ElastiCache]のページの
サイドメニューの[サブネットグループ]をクリックし、
上部にある[サブネットグループの作成]ボタンをクリック。

下記のように設定します。
![screencapture-us-east-2-console-aws-amazon-elasticache-home-2019-01-31-15_35_06.png](https://qiita-image-store.s3.amazonaws.com/0/297693/97e4836a-09bc-a274-615c-f887af57ccf4.png)

|項目|設定値|説明|
|:------------------------|:-------------------------|:-------------------------|
|名前|laravel-sample-subnet-group-redis|このサブネットグループの名前。<br>自分が管理するための任意の名前を付ける。|
|説明|laravel-sample-subnet-group-redis|任意の説明文。|
|VPC|{以前作成した[laravel-sample-vpc]のVPC}|このサブネットグループが作られるVPC。|

[サブネットの追加]
以前作成した
[laravel-sample-subnet-private-a]
と
[laravel-sample-subnet-private-b]
のサブネットを選択し、追加します。


## Redis用セキュリティグループ作成
Redisサーバに適用するためのセキュリティグループを事前に作成しておきます。

[VPC]のページの
サイドメニューの[セキュリティグループ]をクリックし、
上部にある[Create security group]ボタンをクリック。

下記のように設定します。
![screencapture-us-east-2-console-aws-amazon-vpc-home-2019-01-31-15_38_39.png](https://qiita-image-store.s3.amazonaws.com/0/297693/f6f60d86-9b7b-05db-474d-3430f70b8fb7.png)


|項目|設定値|説明|
|:------------------------|:-------------------------|:-------------------------|
|Security group name|laravel-sample-sg-redis|このセキュリティグループの名前。<br>自分が管理するための任意の名前を付ける。|
|Description|laravel-sample-sg-redis|任意の説明文。|
|VPC|{以前作成した[laravel-sample-vpc]のVPC}|このセキュリティグループが作られるVPC。|


作成したセキュリティグループのルールを修正します。

セキュリティグループの一覧で先ほど作成した[laravel-sample-sg-redis]をチェックし、
ページ上部の[アクション]→[Edit inbound rules]をクリック。

下記のように設定します。
![screencapture-us-east-2-console-aws-amazon-vpc-home-2019-01-31-15_41_57.png](https://qiita-image-store.s3.amazonaws.com/0/297693/9a92e45a-bba1-5c46-7a5f-9e014d87ebaf.png)

|項目|設定値|説明|
|:------------------------|:-------------------------|:-------------------------|
|タイプ|カスタムTCPルール|既存の選択肢としてRedisがないためカスタムTCPルールを選択します。|
|ポート|6379|Redisはデフォルトで6379番ポートを利用します。|
|ソース|{以前作成した[laravel-sample-sg-web]のセキュリティグループID}|セキュリティグループのソース（アクセス元）は、IPアドレスだけでなくセキュリティグループを指定することも可能。<br>今回はwebサーバの属するセキュリティグループをソースとして指定する。|

この設定で、
webサーバからのRedis（ポート6379）接続のみ許可するルールのセキュリティグループができました。

## Redisの作成
[ElastiCache]のページの
サイドメニューの[Redis]をクリックし、
上部にある[作成]ボタンをクリック。

下記のように設定します。
![screencapture-us-east-2-console-aws-amazon-elasticache-home-2019-01-31-15_53_35.png](https://qiita-image-store.s3.amazonaws.com/0/297693/8ee33ea4-cc0f-8220-ea3d-8dda6d8698d6.png)

|項目|設定値|説明|
|:------------------------|:-------------------------|:-------------------------|
|クラスターエンジン|Redis|RedisまたはMemcachedから選択できます。今回はRedisを選択します。|
|名前|laravel-sample-redis|このRedisの名前。<br>自分が管理するための任意の名前を付ける。|
|エンジンバージョンの互換性|5.0.0|Redisのバージョン。<br>最新のものを選択します。|
|ポート|6379|Redisはデフォルトで6379番ポートを利用します。|
|パラメータグループ|default.redis5.0|Redisサーバの詳細を設定したものがパラメータグループです。<br>基本的にデフォルトのままで問題ないです。|
|ノードのタイプ|cache.r5.large|Redisサーバのスペックです。<br>デフォルトのままにしました。|
|レプリケーション数|0|プライマリのRedisサーバに加えて、レプリケーションを作成する数を設定します。<br>今回は不要なので0個にします。|
|サブネットグループ|{先ほど作成した[laravel-sample-subnet-group-redis]のサブネットグループ}|このRedisサーバを配置するサブネットグループ。|
|優先アベイラビリティーゾーン|指定なし|プライマリ、レプリケーションを作成する場合、それぞれをどのアベイラビリティーゾーンに配置するか指定することができます。|
|セキュリティグループ|{先ほど作成した[laravel-sample-sg-redis]のセキュリティグループ}|このRedisに適用するセキュリティグループ|
|保管時の暗号化|チェック無し|Redis内に保管しているデータを暗号化するかどうかの設定。|
|送信中の暗号化|チェック無し|Redisと通信中のデータを暗号化するかどうかの設定。|
|シードする RDB ファイルの S3 の場所|-|初期データを投入したい場合、データを記述したファイルをS3に配置し、そのパスを入力する。|
|バックアップの有効化|チェック無し|有効化すると、Redisのデータを日次でバックアップできる。|
|メンテナンスウィンドウ|指定なし|サーバのスペック変更やセキュリティパッチ適用などを決められた時間に実行するかどうかの設定。|
|SNS通知のトピック|通知の無効化|メンテナンス発生時に通知を行うかどうかの設定。|

最後に[作成]ボタンをクリックするとRedisが作成されます。

# LaravelでRedisを利用する設定
Redisの作成が完了したので、
LaravelサンプルアプリでRedisサーバが使えるように設定します。

webサーバにSSH接続し、
下記のように設定を進めてください。
※webサーバ2台とも同じ設定をする必要があります

## predisのインストール
LaravelでRedisを利用するためには
predisというライブラリをインストールする必要があります。

```shell
#プロジェクトのディレクトリに移動
cd /var/www/html/laravel-sample
#predisインストール
composer require predis/predis
```

## .envの修正
LaravelサンプルアプリからRedisに接続するために
.envにある設定を変更します。

```shell
#.envファイルを開く
vim .env
```

下記の3行をを変更します。

①
`CACHE_DRIVER=file`
↓
`CACHE_DRIVER=redis`

②
`SESSION_DRIVER=file`
↓
`SESSION_DRIVER=redis`

③
`REDIS_HOST=127.0.0.1`
↓
`REDIS_HOST={先ほど作成した[laravel-sample-redis]のエンドポイント}`

このRedisエンドポイントは
Redisの一覧で[laravel-sample-redis]をチェックし
ページ下部に表示される詳細情報から確認できます。
<img width="960" alt="screencapture-us-east-2-console-aws-amazon-elasticache-home-2019-01-31-16_28_13.png" src="https://qiita-image-store.s3.amazonaws.com/0/297693/5c31c0a2-542b-39f6-463e-d3c83f4ab82c.png">
※末尾の「:6379」まで入力しないように注意してください

## 動作確認
Redisを作成し、
Laravel側の設定も完了したので動作確認します。

ブラウザにALBエンドポイントを入力してLaravelサンプルアプリにアクセスします。

アカウント登録、ログイン、タスク登録など一覧の操作をして
前回発生していた「TokenMismatchException」が発生しなければ
正しくRedisを使ってセッション共有できている状態です。

# 次回
現在webサーバ2台はpublicサブネットに配置されていますが、
これはセキュリティの観点から好ましくない状態です。

これを改善するため、
次回はwebサーバ2台をprivateサブネットに移動し、
それに伴い必要になる踏み台サーバ、NATゲートウェイを作成します。
[AWSでウェブアプリケーション環境構築：⑤webサーバをプライベートサブネットに配置し、メンテナンス用踏み台サーバを構築する](https://qiita.com/minato-naka/items/406c2f247c0d29a93665)