ElastiCacheでRedisClusterを作成する

## 目的
ElastiCacheでRedisClusterを作成し接続確認を行います。

## 前提条件

今回はClusterモードを有効な状態で作成します。
※Clusterモードの説明に関してはこの記事では割愛させて頂きます。
[こちら](http://docs.aws.amazon.com/ja_jp/AmazonElastiCache/latest/UserGuide/Replication.Redis-RedisCluster.html) に記載されています。

## 事前準備

必要な事前準備は下記の通りになります。
※Clusterを作りながらでも、進められるのですが、今回は事前に必要な物の作成を行っておきます。

- Clusterに割り当てるサブネット、サブネットグループ
- Clusterに適応するセキュリティグループ

### サブネットの作成

ElastiCacheが利用するサブネットの作成を行います。

対障害性を向上させる為に、東京リージョンの ```ap-northeast-1a``` と ```ap-northeast-1c``` の2つのアベイラビリティーゾーンにサブネットを構築します。

- ネームタグ: dev-session-redis-1a
- IPv4 CIDRs: 192.0.50.0/24

![create-subnet-a1.png](https://qiita-image-store.s3.amazonaws.com/0/71899/482ea1d7-e824-5220-b7cb-afc3f1647bbe.png)

- ネームタグ: dev-session-redis-1c
- IPv4 CIDRs: 192.0.51.0/24

![create-subnet-c1.png](https://qiita-image-store.s3.amazonaws.com/0/71899/83bacb09-291a-c697-a869-3606b87caf5e.png)

サブネットグループの作成を行います。
マネジメントコンソールのElastiCache → Subnet Groups → 「Create Subnet Group」より作成を行います。

Name、Description は分かりやすいものであれば何でも構いません。
Availability Zoneにそれぞれ先程作成したサブネットを追加して「Create」をクリックします。

![create-subnet-group.png](https://qiita-image-store.s3.amazonaws.com/0/71899/9b292016-0199-561d-ba0a-a6dc20d29af7.png)

以上でサブネットの準備は完了です。

### セキュリティグループの作成

ElastiCache用にセキュリティグループの作成を行います。

インバウンドルールで接続元からの6379ポートを空けておきます。

![security-group1.png](https://qiita-image-store.s3.amazonaws.com/0/71899/c91cbdc0-ecef-61e1-3f5b-2562e0ab8c1a.png)

![security-group2.png](https://qiita-image-store.s3.amazonaws.com/0/71899/7c2287cd-cb35-9fff-6873-fa391e28dc8d.png)

## Clusterの作成（本題）

ここからようやく本題です。

マネジメントコンソールのElastiCache → Redis → 「Create」より作成を行います。

Cluster engine: Redis
Cluster Mode enabled (Scale Out): チェックを入れる

![redis-cluster1.png](https://qiita-image-store.s3.amazonaws.com/0/71899/d9da9ac5-8b4b-c992-32b5-923976bf6bb7.png)

Name、Description は分かりやすいものであれば何でも構いません。
Subnet Groupには先程作成したサブネットグループを指定します。
その他は下記画像の通りに入力して下さい。（ほぼデフォルト設定のハズ）

![redis-cluster2.png](https://qiita-image-store.s3.amazonaws.com/0/71899/fcb3ea06-49a0-69f8-ba8c-cbb545f5de9b.png)

Multi-AZ with Auto-Failover: チェックを入れます。（というかCluster Mode enabled (Scale Out)にチェックを入れた時点でチェック済になっているハズ）

Slots and keyspaces: [Equal distribution]
Availability zone(s): [No preference]
Security groups: 先程作成したセキュリティグループを指定

![redis-cluster3.png](https://qiita-image-store.s3.amazonaws.com/0/71899/62c562e4-7cbc-58a9-ba0f-3f257e268429.png)

Import data to cluster: 空
Backup: デフォルトのまま ※本格的に運用する際は要件に合わせて設定して下さい。
Maintenance: デフォルトのまま ※これも実運用の際は要件に合わせて設定して下さい。

ちなみにこれらのパラメータは [公式ドキュメント](http://docs.aws.amazon.com/ja_jp/AmazonElastiCache/latest/UserGuide/Clusters.Create.CON.RedisCluster.html) に解説がありますので、本格運用される場合は目を通しておく事をオススメします。

![redis-cluster4.png](https://qiita-image-store.s3.amazonaws.com/0/71899/a346da61-46e2-5e20-65a7-7588dd99c9c7.png)

ここまでで全てのパラメータの設定が完了したので「Create」をクリックすると作成が開始されます。

作成すると下記のような画面になります。

![redis-cluster5.png](https://qiita-image-store.s3.amazonaws.com/0/71899/b760cd5b-cb9b-ee0e-6d5f-4aa695656a0d.png)

しばらくするとステータスが「available」になり、利用出来る状態となります。

![redis-cluster6.png](https://qiita-image-store.s3.amazonaws.com/0/71899/d33c47bb-97f2-183f-3595-ec0ac2285cc1.png)

## 動作確認

作成したClusterに接続出来るサーバにログインを行い ```redis-cli``` で動作確認を行います。

作成したサーバを選択し、Configuration Endpoint を確認すると接続用のホスト名が分かります。

ここでは ```dev-sessions.abcde9.clustercfg.apne1.cache.amazonaws.com``` が接続用のホストだとします。

```bash:redis-cliでログイン
redis-cli -h dev-sessions.abcde9.clustercfg.apne1.cache.amazonaws.com -c
```

```bash:テストデータを1件入力
SET test "testValue"

-> Redirected to slot [6918] located at 192.0.51.155:6379
OK
192.0.51.155:6379>
```

```bash:テストデータを取得出来るか確認
GET test

"testValue"
```

```bash:追加したテストデータを削除し削除出来ているか確認する
DEL test
(integer) 1

GET test
(nil)
```

※余談ですが、```FLUSHALL``` で全てのデータを削除出来ますので、テストデータを一度キレイにしたい場合は ```FLUSHALL``` を実行すれば大丈夫です。
無論、運用中のサーバに対して実行すると全てのデータが消えてしまうので注意して下さい。

## まとめ

あっさりとRedisClusterを立ち上げる事が出来ました。
本格運用の際にはまだまだ考慮すべき点は多いですが、取っ掛かりとしてこの記事が参考になれば幸いです。

最後まで読んで頂きありがとうございました。