DVA

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

スポンサーリンク
CFNでElastiCache入門 - Redisクラスター有効版 DVA
スポンサーリンク
スポンサーリンク

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

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

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

構築する環境

Detail of Introduction to ElastiCache with CFN - Redis Cluster Enabled

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

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

CloudFormationテンプレートファイル

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

awstut-dva/03/004 at main · awstut-an-r/awstut-dva
Contribute to awstut-an-r/awstut-dva development by creating an account on GitHub.

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

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

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

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スタックを作成します。
スタックの作成および各スタックの確認方法については、以下のページをご確認ください。

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

  • 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の詳細につきましては、以下のページをご確認ください。

ユーザーデータによる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に関する詳細は、以下のページをご確認ください。

Detail of Redis 4.

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

まとめ

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

タイトルとURLをコピーしました