インフラブログ

とあるWEBサイトのインフラを構築運用するメモ

AWS ElasticacheでRedisサーバを立ち上げる

Redisを使用するのでelasticacheのredisでmaster-slaveのレプリケーション構成を作ります。 手順は以下のようになります。

  • パラメータグループを新規作成、一部のパラメータを変更する(aof,timeout)
  • このパラメータグループを使うノードを作成する(マスターノードとなる)
  • このノードをマスターとするレプリケーショングループを作成する
  • このレプリケーショングループに所属するノードをつくる(スレーブノードとなる)

AWS Mamagement Consoleからでもさくさくと作れますが、複製を作るかもしれないのでスクリプトにしておきます。

なお、アプリからredisに接続する時のエンドポイントはレプリケーショングループID.xxx.0001.apne1.cache.amazonaws.com:6379といた具合になります。

master = "#{stage}-master-1"
slave = "#{stage}-slave-1"
repl_group = "#{stage}-redis-1"
subnet_group = "#{stage}-redis-subnet"
param_group = "#{stage}-redis26"
family_param_group = "redis2.6"
availability_zones = ["ap-northeast-1a", "ap-northeast-1c"]
node_type = "cache.m1.small"
arn = "xxx"
security_group = "xxx"
subnets = ["subnet-xxx", "subnet-xxx"]
redis_version = "2.6.13"

client = AWS::ElastiCache::Client.new

#パラメータグループの作成
client.create_cache_parameter_group(
  :cache_parameter_group_name => param_group,
  :cache_parameter_group_family => family_param_group,
  :description => "#{param_group}",
)

#パラメータ変更
client.modify_cache_parameter_group(
  :cache_parameter_group_name => param_group,
  :parameter_name_values => [ {:parameter_name => "timeout", :parameter_value => "300"}, {:parameter_name => "appendonly", :parameter_value => "yes"} ]
)

#サブネットグループの作成
client.create_cache_subnet_group(
  :cache_subnet_group_name => subnet_group,
  :cache_subnet_group_description => "#{stage} redis subnet group",
  :subnet_ids => [subnets[0]]
)

#マスターノードの作成
client.create_cache_cluster(
  :cache_cluster_id => master,
  :num_cache_nodes => 1,
  :cache_node_type => node_type,
  :engine => "redis",
  :engine_version => redis_version,
  :cache_parameter_group_name => param_group,
  :cache_subnet_group_name => subnet_group,
  :security_group_ids => [security_group],
  :preferred_availability_zone => availability_zones[0],
  :preferred_maintenance_window => "mon:19:00-mon:20:00",
  :notification_topic_arn => arn,
  :auto_minor_version_upgrade => false
)

#マスターの作成を待つ
while "available" != client.describe_cache_clusters(:cache_cluster_id => master)[:cache_clusters][0][:cache_cluster_status]
  sleep 30
end

#レプリケーショングループの作成
client.create_replication_group(
  :replication_group_id => repl_group,
  :primary_cluster_id => master,
  :replication_group_description => "#{stage} replication group"
)

#レプリケーショングループの作成を待つ
while "available" != client.describe_replication_groups(:replication_group_id => repl_group)[:replication_groups][0][:status]
  sleep 30
end

#スレーブノードの作成
client.create_cache_cluster(
  :cache_cluster_id => slave,
  :replication_group_id => repl_group,
)