「ElastiCacheのマルチAZ設定で自動フェイルオーバーを試したが、どのオプションを付ければいいかわからない」
こういった声は、AWSでWebアプリを本番運用し始めたエンジニアからよく聞きます。Amazon ElastiCache for Redisはセッション管理・クエリキャッシュ・ランキング集計など幅広い用途で使われていますが、シングルノード構成のままでは可用性に問題があります。プライマリノードが障害を起こすとキャッシュが失われ、バックエンドのRDSに一気に大量クエリが流れ込む「キャッシュスタンピード」が発生するリスクがあります。
この記事では、ElastiCache for Redisをマルチ AZ 冗長構成(レプリケーショングループ)で設計・構築する手順を、AWS CLIを使って実践的に解説します。自動フェイルオーバーの仕組みから、リーダーエンドポイントを使った読み取り負荷分散、VPC内のセキュリティ設計まで一通り押さえます。
動作確認環境: Amazon Linux 2023 / AWS CLI 2.17.x / ElastiCache for Redis 7.1(クラスターモード無効)
この記事のポイント
・マルチAZ構成は --automatic-failover-enabled で作成する
・プライマリ障害時はリードレプリカが自動昇格(約1~2分)
・リーダーエンドポイント経由で読み取りを分散しDBへの負荷を軽減
・VPCプライベートサブネット配置+暗号化(TLS/at-rest)が設計の鉄則
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
なぜキャッシュ層(ElastiCache)が必要なのか
WebアプリのパフォーマンスボトルネックはほとんどがDB(RDS)にあります。「ユーザーごとのタイムライン取得」「商品ランキングの集計」「セッション情報の保存」——これらを毎回RDSから引くと、リクエスト増加に比例して遅延が大きくなります。ElastiCache for Redisをキャッシュ層に挟むと、読み取りリクエストの大部分をRDSではなくRedisが処理するため、RDSのCPUとIOPSを大幅に節約できます。RedisはインメモリDBのため、数マイクロ秒単位で応答でき、RDSの数十倍~数百倍高速です。
・用途1(クエリキャッシュ): SELECT結果をRedisにTTL付きで保存。同じクエリが来たらRDSを通さず即返答
・用途2(セッション管理): ユーザーのログイン状態をRedisに保存。スケールアウト後もセッションを共有できる
・用途3(レート制限): INCRコマンドでAPIコールカウントを管理。1秒あたり100リクエスト制限などを実装
問題はシングルノード構成の脆弱性です。プライマリノードが障害を起こすと、自動復旧まで数分~十数分かかります。その間キャッシュが使えず、RDSへキャッシュミスが集中して連鎖ダウンが起きることがあります。これが「マルチAZ冗長構成が必須」な理由です。
AWSでLinuxサーバーを構築する基礎から学びたい方には、Amazon Linuxの入門教材・学習ロードマップもあわせてご覧ください。
ElastiCache for Redisのマルチ AZ 構成の仕組み
マルチ AZ 冗長構成の正式名称は「レプリケーショングループ(クラスターモード無効)」です。構成要素は主に2つです。・プライマリノード: 書き込み(SET/INCR/LPUSH等)を全て受け付けるノード。プライマリエンドポイント経由でアクセスする
・リードレプリカ: プライマリからデータをレプリケーション。読み取り(GET/LRANGE等)専用でリーダーエンドポイント経由でアクセス
プライマリとレプリカを別々のアベイラビリティゾーン(AZ)に配置することで、1つのAZのデータセンターに障害が発生しても、別AZのノードでサービスを継続できます。
自動フェイルオーバーの流れ
1. ElastiCacheがプライマリノードの死活を検知(通常10秒前後)
2. リードレプリカをプライマリに昇格(約1~2分)
3. DNSエントリが新プライマリのエンドポイントに切り替わる
4. アプリはエンドポイントURLを変えることなく新プライマリへ接続
アプリ側ではプライマリエンドポイントのDNS名を設定するだけです。フェイルオーバー後にDNSのTTLが切れれば、自動的に新プライマリへ向き直ります。アプリの設定変更・再デプロイは不要です。
マルチ AZ 構成の構築手順
1. VPCサブネットグループの作成
ElastiCacheを本番環境で使う場合、インターネットから直接アクセスできないプライベートサブネットに配置するのが鉄則です。プライベートサブネットを2つのAZに用意し、サブネットグループを作成します。# プライベートサブネットのIDを確認(ap-northeast-1a / 1c の2AZ分) aws ec2 describe-subnets \ --filters "Name=tag:Name,Values=private-*" \ --query 'Subnets[].{SubnetId:SubnetId,AZ:AvailabilityZone,CIDR:CidrBlock}' \ --output table # 出力例(2つのサブネットが必要) # ---------------------------------------------------------- # | DescribeSubnets | # +---------------------+---------------+------------------+ # | AZ | CIDR | SubnetId | # +---------------------+---------------+------------------+ # | ap-northeast-1a | 10.0.1.0/24 | subnet-0abc1234 | # | ap-northeast-1c | 10.0.2.0/24 | subnet-0def5678 | # +---------------------+---------------+------------------+ # ElastiCache用サブネットグループを作成 aws elasticache create-cache-subnet-group \ --cache-subnet-group-name redis-prod-subnet-group \ --cache-subnet-group-description "Redis Production Multi-AZ" \ --subnet-ids subnet-0abc1234 subnet-0def5678 # 出力例(作成成功時) # { # "CacheSubnetGroup": { # "CacheSubnetGroupName": "redis-prod-subnet-group", # "VpcId": "vpc-0123456789abcdef0", # "Subnets": [ { "SubnetAvailabilityZone": { "Name": "ap-northeast-1a" }, ...} ] # } # }
2. セキュリティグループの設定
ElastiCacheはデフォルトでポート6379を使います。アクセスを許可するのはWebサーバー(EC2)のセキュリティグループからのみに絞ります。ポート6379のオープン範囲を狭めることがセキュリティ設計の基本です。Linuxサーバーでのポート疎通確認方法は Linux ポート確認の全コマンド も参考にしてください。
# ElastiCache用セキュリティグループを作成 aws ec2 create-security-group \ --group-name redis-prod-sg \ --description "ElastiCache Redis Production SG" \ --vpc-id vpc-0123456789abcdef0 # 出力例 # { "GroupId": "sg-0redis1234abcdef" } # WebサーバーのSG(sg-0web1234xxxxx)からのみポート6379を許可 aws ec2 authorize-security-group-ingress \ --group-id sg-0redis1234abcdef \ --protocol tcp \ --port 6379 \ --source-group sg-0web1234xxxxx # ルール確認(インバウンドルールの一覧) aws ec2 describe-security-groups \ --group-ids sg-0redis1234abcdef \ --query 'SecurityGroups[0].IpPermissions[*].{Port:FromPort,Source:UserIdGroupPairs[0].GroupId}' # 出力例(Webサーバー SGからの6379のみ許可されていればOK) # [ { "Port": 6379, "Source": "sg-0web1234xxxxx" } ]
3. レプリケーショングループの作成(マルチ AZ 有効化)
レプリケーショングループを作成するときに--automatic-failover-enabled と --multi-az-enabled を指定します。ノード数は2(プライマリ1台+レプリカ1台)から始めるのが基本構成です。# レプリケーショングループを作成(マルチAZ・自動フェイルオーバー有効) aws elasticache create-replication-group \ --replication-group-id redis-prod \ --replication-group-description "Production Redis Multi-AZ" \ --cache-node-type cache.t3.micro \ --engine redis \ --engine-version 7.1 \ --num-cache-clusters 2 \ --cache-subnet-group-name redis-prod-subnet-group \ --security-group-ids sg-0redis1234abcdef \ --automatic-failover-enabled \ --multi-az-enabled \ --at-rest-encryption-enabled \ --transit-encryption-enabled # 作成状況の確認(Status が "available" になるまで待つ。通常5~10分) aws elasticache describe-replication-groups \ --replication-group-id redis-prod \ --query 'ReplicationGroups[0].{Status:Status,MultiAZ:MultiAZ,AutoFailover:AutomaticFailover}' # 出力例(available になれば構築完了) # { # "Status": "available", # "MultiAZ": "enabled", # "AutoFailover": "enabled" # }
# プライマリエンドポイントとリーダーエンドポイントを確認 aws elasticache describe-replication-groups \ --replication-group-id redis-prod \ --query 'ReplicationGroups[0].NodeGroups[0].{Primary:PrimaryEndpoint,Reader:ReaderEndpoint}' # 出力例 # { # "Primary": { # "Address": "redis-prod.xxxxxx.ng.0001.apne1.cache.amazonaws.com", # "Port": 6379 # }, # "Reader": { # "Address": "redis-prod-ro.xxxxxx.ng.0001.apne1.cache.amazonaws.com", # "Port": 6379 # } # }
自動フェイルオーバーの動作確認
本番運用前に、フェイルオーバーが正しく動作するかテストしておきます。AWS CLIのtest-failover コマンドで擬似的なプライマリ障害を発生させられます。テスト前の確認(現在のプライマリノードのAZを記録)
# 各ノードのAZとロールを確認 aws elasticache describe-replication-groups \ --replication-group-id redis-prod \ --query 'ReplicationGroups[0].NodeGroups[0].NodeGroupMembers[*].{ID:CacheClusterId,Role:CurrentRole,AZ:PreferredAvailabilityZone}' # 出力例(フェイルオーバー前) # [ # { "ID": "redis-prod-001", "Role": "primary", "AZ": "ap-northeast-1a" }, # { "ID": "redis-prod-002", "Role": "replica", "AZ": "ap-northeast-1c" } # ] # フェイルオーバーテストを実行(プライマリを意図的に切り替え) aws elasticache test-failover \ --replication-group-id redis-prod \ --node-group-id 0001 # 1~2分後に再確認(RoleがスワップされていればOK) aws elasticache describe-replication-groups \ --replication-group-id redis-prod \ --query 'ReplicationGroups[0].NodeGroups[0].NodeGroupMembers[*].{ID:CacheClusterId,Role:CurrentRole,AZ:PreferredAvailabilityZone}' # 出力例(フェイルオーバー後) # [ # { "ID": "redis-prod-001", "Role": "replica", "AZ": "ap-northeast-1a" }, # { "ID": "redis-prod-002", "Role": "primary", "AZ": "ap-northeast-1c" } # ]
読み取り負荷の分散|リーダーエンドポイントの活用
マルチAZ構成では「プライマリエンドポイント(書き込み専用)」と「リーダーエンドポイント(読み取り専用)」の2種類のエンドポイントが提供されます。アプリで両エンドポイントを使い分けることで、読み取り負荷をレプリカに分散できます。・プライマリエンドポイント: SET・INCR・EXPIRE など書き込み系コマンドはこちら
・リーダーエンドポイント: GET・LRANGE・ZRANGE など読み取り系コマンドはこちら。レプリカが複数台になるとラウンドロビンで負荷分散
Redisクライアントの設定例(Python / redis-py):
# Python(redis-py)での接続例 import redis # 書き込み用(プライマリエンドポイント) redis_write = redis.Redis( host='redis-prod.xxxxxx.ng.0001.apne1.cache.amazonaws.com', port=6379, ssl=True, # transit-encryption-enabled の場合は必須 decode_responses=True ) # 読み取り用(リーダーエンドポイント) redis_read = redis.Redis( host='redis-prod-ro.xxxxxx.ng.0001.apne1.cache.amazonaws.com', port=6379, ssl=True, decode_responses=True ) # 使い分け例 redis_write.set('user:1001:name', '山田太郎', ex=3600) # 書き込み name = redis_read.get('user:1001:name') # 読み取り print(name) # 山田太郎
セキュリティ設計|VPC・暗号化・認証
本番環境のElastiCacheでは「VPC内プライベート配置+通信暗号化+認証」の3点セットを必ず設定します。・VPC内プライベートサブネット配置: インターネットからElastiCacheへの直接アクセスを遮断。セキュリティグループでWebサーバーSGからの6379のみ許可
・保存時暗号化(at-rest):
--at-rest-encryption-enabled で有効化。スナップショットがKMSで暗号化される・転送時暗号化(TLS):
--transit-encryption-enabled で有効化。アプリ~Redis間の通信がTLS暗号化される。redis-cliでの接続は --tls オプションが必要・AUTH(パスワード認証):
--auth-token で設定。接続時にAUTHコマンドによるパスワード検証が必須になる# AUTHトークン付きでレプリケーショングループを作成 aws elasticache create-replication-group \ --replication-group-id redis-prod-secure \ --replication-group-description "Secure Redis Multi-AZ" \ --cache-node-type cache.t3.micro \ --engine redis \ --engine-version 7.1 \ --num-cache-clusters 2 \ --cache-subnet-group-name redis-prod-subnet-group \ --security-group-ids sg-0redis1234abcdef \ --automatic-failover-enabled \ --multi-az-enabled \ --at-rest-encryption-enabled \ --transit-encryption-enabled \ --auth-token "YourStrongPassword123!" # TLS+AUTHでのredis-cli接続テスト(EC2インスタンスから実行) redis-cli \ -h redis-prod.xxxxxx.ng.0001.apne1.cache.amazonaws.com \ -p 6379 \ --tls \ -a "YourStrongPassword123!" \ ping # 出力例(接続成功) # PONG
トラブルシュート|接続できない・レプリカラグが大きい
「Connection refused」が出る場合の対処
ElastiCacheへ接続できない場合の原因の9割はセキュリティグループです。以下の順番で確認します。・EC2インスタンスのSG-IDがElastiCacheのSGのインバウンドルールに登録されているか
・EC2インスタンスとElastiCacheが同じVPC内に存在するか
・ElastiCacheがプライベートサブネットに配置されているか(ElastiCacheはパブリックIPが付かないため、公開サブネットに置いても外部からはアクセスできない)
・
transit-encryption-enabled の場合、redis-cliに --tls オプションが付いているか# ElastiCacheのSGのインバウンドルールを確認 aws ec2 describe-security-groups \ --group-ids sg-0redis1234abcdef \ --query 'SecurityGroups[0].IpPermissions[*].{Port:FromPort,Source:UserIdGroupPairs[0].GroupId}' # 出力例(WebサーバーSGからの6379が許可されていればOK) # [ { "Port": 6379, "Source": "sg-0web1234xxxxx" } ] # EC2からtelnetで疎通確認(redis-cliが未インストールの場合) telnet redis-prod.xxxxxx.ng.0001.apne1.cache.amazonaws.com 6379 # dnfでredis-cliのみインストール(Amazon Linux 2023) sudo dnf install redis6 -y redis-cli --version # redis-cli 6.2.x
レプリカラグが大きい場合の対処
レプリカへのレプリケーション遅延(ReplicationLag)はCloudWatchメトリクスで監視できます。通常は0秒台ですが、大量書き込みが続くと数秒に達することがあります。# レプリカノードのReplicationLagを確認(直近5分間の平均) aws cloudwatch get-metric-statistics \ --namespace AWS/ElastiCache \ --metric-name ReplicationLag \ --dimensions Name=CacheClusterId,Value=redis-prod-002 \ --start-time $(date -u -d "5 minutes ago" +%Y-%m-%dT%H:%M:%S) \ --end-time $(date -u +%Y-%m-%dT%H:%M:%S) \ --period 60 \ --statistics Average \ --query 'Datapoints[*].{Time:Timestamp,LagSec:Average}' \ --output table # ラグが継続して大きい場合の対処 # (1) ノードタイプをより高性能なものに変更(scale up) # (2) write-heavyなワークロードを見直す(過剰なキャッシュ更新を削減) # (3) レプリカノードを追加してリーダー負荷を分散(scale out) aws elasticache increase-replica-count \ --replication-group-id redis-prod \ --new-replica-count 2 \ --apply-immediately
本記事のまとめ
| やりたいこと | コマンド / 設定 |
|---|---|
| サブネットグループを作成する | aws elasticache create-cache-subnet-group --subnet-ids ... |
| マルチAZ有効でReplication Groupを作成する | aws elasticache create-replication-group --automatic-failover-enabled --multi-az-enabled |
| 作成状況(Status)を確認する | aws elasticache describe-replication-groups --replication-group-id ... |
| フェイルオーバーテストを実行する | aws elasticache test-failover --replication-group-id ... --node-group-id 0001 |
| レプリカラグをモニタリングする | aws cloudwatch get-metric-statistics --metric-name ReplicationLag ... |
| TLS有効時にredis-cliで接続する | redis-cli -h <エンドポイント> -p 6379 --tls -a <パスワード> |
| レプリカノードを追加してスケールアウトする | aws elasticache increase-replica-count --new-replica-count 2 |
--automatic-failover-enabled --multi-az-enabled の2オプションを付けるだけで設定できます。プライマリ障害時の自動フェイルオーバー(約1~2分)により、サービス継続性を大幅に高められます。設計の3原則は「プライベートサブネット配置」「書き込みにプライマリエンドポイント・読み取りにリーダーエンドポイント」「TLS+AUTHで通信を保護」です。スケールが必要になったときはレプリカノードを追加するだけで読み取りスループットを線形に伸ばせます。
AWSでLinuxサーバーを構築する実践的なロードマップについては、AWSをLinuxエンジニアが学ぶためのロードマップもご覧ください。
AWSのインフラ冗長設計を「実務の型」として身につけませんか?
ElastiCacheの設定手順は調べれば分かります。でも「どのノードタイプを選ぶか」「キャッシュ戦略をどう設計するか」を説明できますか?
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。
「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
登録10秒/合わなければ解除3秒 / 詳細はこちら
- 前のページへ:AWS CloudWatchでLinuxサーバーを監視する方法|CloudWatch Agentの設定からメトリクス収集・アラート通知まで
- この記事の属するカテゴリ:AWS(Amazon Linux)へ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。
登録無料・いつでも解除できます