LoginSignup
5
1

More than 1 year has passed since last update.

CloudFormationでElasticache for redis(クラスターモード有効)を構築してみた

Posted at

概要

ElastiCacheのエンジンは Memcache or Redisの2つがあります。
Redisを選択する場合はクラスタモードを有効にするか無効にするかも選択する必要があります。
※クラスターモードの有効/無効に関するメリット・デメリットはこちら

CloudFormationにてElastiCacheを構築する際にMemcache/Redis(クラスターモード有効)/Redis(クラスター無効)の3パターンそれぞれで利用できる設定箇所が異なる点や専用用語もあり非常に混乱しやすい印象を受けました。

本記事ではRedisでクラスターモードを有効にしたElastiCache構築のCloudFormationコードを紹介すると共に、詰まった点や解決方法がわからず断念した点をご紹介します。

サンプルコード

サンプルコードは以下の条件に従って記載しています。

  • ElastiCache(Redis クラスターモード有効)を構築する部分のみ抜粋
    • SubnetやSecurityGroupも別途定義が必要
  • クラスターの構成は以下の通り
    • 利用するノードタイプは cache.m6g.large
    • 利用するredisのバージョンは6系
    • ノードグループは4つであり、1つのノードグループに付き3台構成
      • Primaryが1台、Replicaが2台
    • 耐障害性を考慮して各NodeGruoupにてAZを分散する
AWSTemplateFormatVersion: '2010-09-09'
Description: 'ElastiCache for Redis(Cluster mode on)'
Parameters:
  ElastiCacheMaintenanceWindow:
    Type: String
    Default: Mon:18:00-Mon:19:00 # JST TUE 3:00-4:00
    Description: Maintenance window for ElastiCache

Resources:
  ElastiCacheRedisClusterEnalbe:
    Type: AWS::ElastiCache::ReplicationGroup
    DeletionPolicy: Retain
    UpdateReplacePolicy: Retain
    UpdatePolicy:
      UseOnlineResharding: true
    Properties:
      AtRestEncryptionEnabled: false
      AutomaticFailoverEnabled: true
      MultiAZEnabled: true
      CacheNodeType: cache.m6g.large
      CacheParameterGroupName: default.redis6.x.cluster.on
      Engine: redis
      EngineVersion: 6.x
      NumNodeGroups: 4
      ReplicasPerNodeGroup: 2
      NodeGroupConfiguration:
        - PrimaryAvailabilityZone: ap-northeast-1a
          ReplicaAvailabilityZones:
            - ap-northeast-1a
            - ap-northeast-1c
          NodeGroupId: "0001"
        - PrimaryAvailabilityZone: ap-northeast-1c
          ReplicaAvailabilityZones:
            - ap-northeast-1a
            - ap-northeast-1c
          NodeGroupId: "0002"
        - PrimaryAvailabilityZone: ap-northeast-1a
          ReplicaAvailabilityZones:
            - ap-northeast-1a
            - ap-northeast-1c
          NodeGroupId: "0003"
        - PrimaryAvailabilityZone: ap-northeast-1c
          ReplicaAvailabilityZones:
            - ap-northeast-1a
            - ap-northeast-1c
          NodeGroupId: "0004"
      Port: 6379
      ReplicationGroupDescription: 'ElastiCache Redis Cluster (Enable Cluster mode)'
      ReplicationGroupId: elasticache-redis
      PreferredMaintenanceWindow: !Ref ElastiCacheMaintenanceWindow

詰まった点

構築する際に詰まった点として大きく2点あります。
それぞれご紹介します。

3AZに分散できない

今回利用するノードタイプはメモリ量も多く費用とスペックのバランスが良い cache.m6g.large を利用しました。
AWSのセミナー等でもオススメされるノードタイプだと思います。
ですが、m6g系のノードタイプは東京リージョンのAZである ap-northeast-1d に対応しておらず、 ap-northeast-1aap-northeast-1c のみで分散する事になりました。

NodeGroupId指定

今回の構成では耐障害性を考慮して4つあるノードグループを以下の通りに設計しました。

  • 各ノードグループのPrimaryノードはAZを分散させる
    • 2つのノードグループはPrimaryを ap-northeast-1a
    • 2つのノードグループはPrimaryを ap-northeast-1c
  • 各ノードグループ内のReplicaもAZを分散させる
    • 各ノードグループのReplicaは ap-northeast-1a に1つ、 ap-northeast-1c に1つとする

これらの要件を明示的に指定するためには NodeGroupConfiguration を利用する必要がありました。
その際にマニュアルでは NodeGroupId は必須の記載が無いのですが、明示的に指定しないとエラーになりました。

断念した点

ElastiCacheを構築する際に dev/stg/prd 環境にてノードグループの台数を変数にて調整したいと考えてCloudFormationのコードを作成に取り組みました。
初期の想定では NumNodeGroups にて指定する値を変数化して環境毎に数値指定する事で各環境のElastiCacheクラスターのノードグループ数を指定できると思っていました。
しかしながら、先の耐障害性を考慮して各ノードグループの構成を明示的に決めるために NodeGroupConfiguration を利用したところ、NumNodeGroupsにて指定した数に応じた NodeGroupConfiguration の設定が必要になったので変数だけで各環境の台数を定義するのが難しくなりました。

条件関数使う等で記載する方法を検討しましたが、コードの複雑さが増してメンテナンス性が下がる事を懸念して断念しました。

現在はdev/stg/prd環境のクラスターをそれぞれ別のリソースとして定義しています。

最後に

ElastiCacheは構成のパターンも多く、公式マニュアルだけではCloudFormationのyaml作成が難しい印象を受けました。
ノードグループの制限等もあり戸惑う部分も多かったのですが、構築できて安心しています。

今回断念した部分も解決策を調査しています。
もしご存知の方が居ましたら是非とも情報交換させてください。

5
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
1