CFNでElastiCache入門 – Redis クラスター有効版

目次

CFNでElastiCache入門 – Redis クラスターモード有効版

以下のページで、ElastiCache入門ということで、Redis(クラスターモード無効版)を取り上げました。

あわせて読みたい
CFNでElastiCache入門 – Redis クラスター無効版 【CloudFormationでElastiCache(Redis クラスター無効)入門】 ElastiCacheはAWSが提供するインメモリキャッシングサービスです。 今回は入門編ということで、ElastiCach...

本ページでは、ElastiCache for Redis(クラスターモード有効版)を作成します。

構築する環境

Detail of Introduction to ElastiCache with CFN - Redis Cluster Enabled

基本的な構成は冒頭でご紹介したページと同様です。

異なる点はElastiCacheです。
今回はクラスターモード有効版のRedisとしてElastiCacheを構築します。

CloudFormationテンプレートファイル

上記の構成をCloudFormationで構築します。
以下のURLにCloudFormationテンプレートを配置しています。

https://github.com/awstut-an-r/awstut-dva/tree/main/03/004

テンプレートファイルのポイント解説

本ページは、クラスターモード有効版のElastiCache for Redisを作成するポイントを中心に取り上げます。

ElastiCache for Redisの基本的な事項については、以下のページをご確認ください。

あわせて読みたい
CFNでElastiCache入門 – Redis クラスター無効版 【CloudFormationでElastiCache(Redis クラスター無効)入門】 ElastiCacheはAWSが提供するインメモリキャッシングサービスです。 今回は入門編ということで、ElastiCach...

ElastiCache for Redis(クラスターモード有効版)

Resources:
  ReplicationGroup:
    Type: AWS::ElastiCache::ReplicationGroup
    Properties:
      AutomaticFailoverEnabled: true
      AutoMinorVersionUpgrade: true
      CacheNodeType: !Ref CacheNodeType
      CacheParameterGroupName: !Ref CacheParameterGroupName
      CacheSubnetGroupName: !Ref SubnetGroup
      Engine: !Ref CacheEngine
      EngineVersion: !Ref CacheEngineVersion
      MultiAZEnabled: true
      NodeGroupConfiguration:
        - PrimaryAvailabilityZone: !Sub "${AWS::Region}${AvailabilityZone1}"
          ReplicaAvailabilityZones:
            - !Sub "${AWS::Region}${AvailabilityZone2}"
          ReplicaCount: !Ref ReplicaCount
      NumNodeGroups: !Ref NumNodeGroups
      Port: !Ref RedisPort
      ReplicationGroupDescription: !Sub "${Prefix}-ReplicationGroup"
      ReplicationGroupId: !Sub "${Prefix}-replicationgroup"
      SecurityGroupIds:
        - !Ref CacheSecurityGroup
Code language: YAML (yaml)

クラスター有効版のElastiCache for Redisを作成する上でのポイントを作成します。

1つ目はAutomaticFailoverEnabledプロパティです。
ElastiCacheでクラスターモード有効版のRedisを構築する場合、本プロパティを有効化する必要があります。

AutomaticFailoverEnabled must be enabled for Redis (cluster mode enabled) replication groups.

AWS::ElastiCache::ReplicationGroup

2つ目はCacheParameterGroupNameプロパティです。
今回は最新バージョン(6.2)のRedisを選択しますが、本プロパティに設定する値は、クラスターモードの有効/無効に依存します。

  • クラスターモード有効化:default.redis6.x.cluster.on
  • クラスターモード無効化:default.redis6.x

上記に従って、今回は前者を指定します。

3つ目はNumNodeGroupsプロパティです。
1つのシャードに含めるノード(インスタンス)の数を設定します。
2つのインスタンスを作成しますが、それらを1つのシャードに含めます。
ですから本プロパティの値は「1」となります。

(参考)Lambda関数

Resources:
  Function:
    Type: AWS::Lambda::Function
    Properties:
      Architectures:
        - !Ref Architecture
      Environment:
        Variables:
          CONFIGURATION_ENDPOINT_ADDRESS: !Ref ConfigurationEndPointAddress
          REDIS_PORT: !Ref RedisPort
      Code:
        ZipFile: |
          import json
          import os
          import redis

          configuration_endpoint_address = os.environ['CONFIGURATION_ENDPOINT_ADDRESS']
          redis_port = int(os.environ['REDIS_PORT'])

          def lambda_handler(event, context):
            pool = redis.ConnectionPool(
              host=configuration_endpoint_address,
              port=redis_port
              )
            client = redis.StrictRedis(connection_pool=pool)

            client.set('hogehoge', 'fugafuga')

            return {
              'statusCode': 200,
              'body': json.dumps(
                {
                  'redis_result': client.get('hogehoge').decode()
                },
                indent=2
                )
            }
      FunctionName: !Sub "${Prefix}-function"
      Handler: !Ref Handler
      Layers:
        - !Ref LambdaLayer
      Runtime: !Ref Runtime
      Role: !GetAtt FunctionRole.Arn
      VpcConfig:
        SecurityGroupIds:
          - !Ref FunctionSecurityGroup
        SubnetIds:
          - !Ref LambdaSubnet
Code language: YAML (yaml)

PythonからRedisに接続し、試験用の値を保存した上で、取得する内容です。

環境構築

CloudFormationを使用して、本環境を構築し、実際の挙動を確認します。

CloudFormationスタックを作成し、スタック内のリソースを確認する

CloudFormationスタックを作成します。
スタックの作成および各スタックの確認方法については、以下のページをご確認ください。

あわせて読みたい
CloudFormationのネストされたスタックで環境を構築する 【CloudFormationのネストされたスタックで環境を構築する方法】 CloudFormationにおけるネストされたスタックを検証します。 CloudFormationでは、スタックをネストす...

各スタックのリソースを確認した結果、今回作成された主要リソースの情報は以下の通りです。

  • ElastiCache:dva-03-004-replicationgroup
  • ElastiCacheの設定エンドポイント:dva-03-004-replicationgroup.ryxnym.clustercfg.apne1.cache.amazonaws.com
  • EC2インスタンス:i-0e58df81a218038e1
  • Lambda関数のFunction URL:https://m2mcg2dyjisl7ycp5ar7ttdzwu0hchwd.lambda-url.ap-northeast-1.on.aws/

AWS Management Consoleから各リソースを確認します。
まずElastiCache本体を確認します。

Detail of Redis 1.

ElastiCacheが正常に作成されています。
エンジンがRedisで、クラスターモードが有効化されていることがわかります。
またクラスター内にシャードが1つ作成されており、その内部に2つノード(インスタンス)が作成されています。

クラスターに設定エンドポイントが作成されていることがわかります。
クラスターモードが無効版ではプライマリエンドポイント、読み込みエンドポイント、ノードエンドポイントの3種類が作成されますが、有効版は異なります。

Redis (クラスターモードが有効) には、クラスター内のすべてのプライマリエンドポイントとノードエンドポイントを「知っている」[設定エンドポイント] があります。アプリケーションは設定エンドポイントに接続します。アプリケーションからクラスターの設定エンドポイントに書き込みまたは読み取りを行うたびに、Redis は背後で、キーが属するシャードと、そのシャードで使用するエンドポイントを決定します。これはすべてアプリケーションに対して透過的です。

レプリケーショングループのエンドポイントの検索
Detail of Redis 2.
Detail of Redis 3.

1つのシャードの中に、2つのノードが存在していることがわかります。
確かに各ノード用のエンドポイントも作成されていることがわかります。

動作確認

準備が整いましたので、実際の動作を確認します。

EC2インスタンスからElastiCache for Redisに接続する

EC2インスタンスにアクセス後、ElastiCacheに接続します。
インスタンスへのアクセスはSSM Session Managerを使用します。

% aws ssm start-session --target i-0e58df81a218038e1
sh-4.2$
Code language: Bash (bash)

SSM Session Managerの詳細につきましては、以下のページをご確認ください。

あわせて読みたい
LinuxインスタンスにSSM Session Manager経由でアクセスする 【LinuxインスタンスにSSM Session Manager経由でアクセスする】 EC2インスタンスにSSM Session Manager経由でアクセスする構成を確認します。 Session Manager は完全...

ユーザーデータによるEC2インスタンスの初期化処理の実行状況を確認します。

redis-cliを使用して、ElastiCacheに接続します。
まずプライマリエンドポイントを指定し、プライマリノードに接続します。

sh-4.2$ redis-cli -h dva-03-004-replicationgroup.ryxnym.clustercfg.apne1.cache.amazonaws.com -p 6379
dva-03-004-replicationgroup.ryxnym.clustercfg.apne1.cache.amazonaws.com:6379>
Code language: Bash (bash)

正常に接続することができました。

試験用の値を保存します。

dva-03-004-replicationgroup.ryxnym.clustercfg.apne1.cache.amazonaws.com:6379> set hoge foo
OK
Code language: Bash (bash)

正常に保存できました。

保存した値を取得します。

dva-03-004-replicationgroup.ryxnym.clustercfg.apne1.cache.amazonaws.com:6379> get hoge
"foo"
Code language: Bash (bash)

参考として、設定エンドポイントのIPアドレスを確認します。

sh-4.2$ nslookup dva-03-004-replicationgroup.ryxnym.clustercfg.apne1.cache.amazonaws.com
Server:		10.0.0.2
Address:	10.0.0.2#53

Non-authoritative answer:
Name:	dva-03-004-replicationgroup.ryxnym.clustercfg.apne1.cache.amazonaws.com
Address: 10.0.4.114
Name:	dva-03-004-replicationgroup.ryxnym.clustercfg.apne1.cache.amazonaws.com
Address: 10.0.3.146
Code language: Bash (bash)

2つのアドレスが返ってきました。

続けてノードエンドポイントの名前解決を行います。

sh-4.2$ nslookup dva-03-004-replicationgroup-0001-001.ryxnym.0001.apne1.cache.amazonaws.com
Server:		10.0.0.2
Address:	10.0.0.2#53

Non-authoritative answer:
Name:	dva-03-004-replicationgroup-0001-001.ryxnym.0001.apne1.cache.amazonaws.com
Address: 10.0.3.146
Code language: Bash (bash)
sh-4.2$ nslookup dva-03-004-replicationgroup-0001-002.ryxnym.0001.apne1.cache.amazonaws.com
Server:		10.0.0.2
Address:	10.0.0.2#53

Non-authoritative answer:
Name:	dva-03-004-replicationgroup-0001-002.ryxnym.0001.apne1.cache.amazonaws.com
Address: 10.0.4.114
Code language: Bash (bash)

設定エンドポイントに紐づいているアドレスは、2つのノードのものだということがわかります。

さらに参考として、各ノードエンドポイントに接続した際の挙動を確認します。

sh-4.2$ redis-cli -h dva-03-004-replicationgroup-0001-001.ryxnym.0001.apne1.cache.amazonaws.com -p 6379
dva-03-004-replicationgroup-0001-001.ryxnym.0001.apne1.cache.amazonaws.com:6379> get hoge
"foo"
Code language: Bash (bash)
sh-4.2$ redis-cli -h dva-03-004-replicationgroup-0001-002.ryxnym.0001.apne1.cache.amazonaws.com -p 6379
dva-03-004-replicationgroup-0001-002.ryxnym.0001.apne1.cache.amazonaws.com:6379> get hoge
(error) MOVED 1525 10.0.3.146:6379
Code language: Bash (bash)

先ほど保存した値を2つのノードで取得しようと試みましたが、一方では失敗しました。
これはアクセスしているノードと、実際に保存しているノードが異なっていたことが原因です。

Lambda関数からElastiCache for Redisに接続する

Lambda関数からElastiCacheに接続します。

この関数のFunction URLにアクセスします。
Function URLに関する詳細は、以下のページをご確認ください。

あわせて読みたい
CFNでLambda Function URL – 認証方式: NONE 【CloudFormationでLambda Function URLを作成する(NONEバージョン)】 2022年4月22日にLambda Function URLがリリースされました。 この新機能は、AWS Lambda サービス...
Detail of Redis 4.

関数内で保存した値を正常に取得することができました。
このようにLambda関数からも、クラスターモードを有効化したElastiCache for Redisに接続することができます。

まとめ

ElastiCache for Redis(クラスターモード有効)を作成する方法を確認しました。
作成したElastiCacheに、EC2インスタンスおよびLambda関数から接続できることを確認しました。

目次