CFNでElastiCache入門 – Redis クラスターモード有効版
以下のページで、ElastiCache入門ということで、Redis(クラスターモード無効版)を取り上げました。
本ページでは、ElastiCache for Redis(クラスターモード有効版)を作成します。
構築する環境
基本的な構成は冒頭でご紹介したページと同様です。
異なる点は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の基本的な事項については、以下のページをご確認ください。
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本体を確認します。
ElastiCacheが正常に作成されています。
エンジンがRedisで、クラスターモードが有効化されていることがわかります。
またクラスター内にシャードが1つ作成されており、その内部に2つノード(インスタンス)が作成されています。
クラスターに設定エンドポイントが作成されていることがわかります。
クラスターモードが無効版ではプライマリエンドポイント、読み込みエンドポイント、ノードエンドポイントの3種類が作成されますが、有効版は異なります。
Redis (クラスターモードが有効) には、クラスター内のすべてのプライマリエンドポイントとノードエンドポイントを「知っている」[設定エンドポイント] があります。アプリケーションは設定エンドポイントに接続します。アプリケーションからクラスターの設定エンドポイントに書き込みまたは読み取りを行うたびに、Redis は背後で、キーが属するシャードと、そのシャードで使用するエンドポイントを決定します。これはすべてアプリケーションに対して透過的です。
レプリケーショングループのエンドポイントの検索
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に関する詳細は、以下のページをご確認ください。
関数内で保存した値を正常に取得することができました。
このようにLambda関数からも、クラスターモードを有効化したElastiCache for Redisに接続することができます。
まとめ
ElastiCache for Redis(クラスターモード有効)を作成する方法を確認しました。
作成したElastiCacheに、EC2インスタンスおよびLambda関数から接続できることを確認しました。