障害から学ぶAWS
CRMのEC2が高負荷になり、営業画面が遅くなったら
Level 1:AWSへの初期移行を終えたNortia CRMのCRMは、単一EC2+RDS(Single-AZ)で稼働していました。ある日、営業担当から「CRMの画面が重い」という報告が相次ぎます。
今回の企業・業務状況
CRM利用者80人(営業・管理者)が、平日8時〜20時に集中してアクセスします。月初の商談登録が集中するタイミングで、この問題が発生しました。
現在のアーキテクチャ(発生時点)
Route 53 → ALB → EC2(1台) → RDS(Single-AZ)。Level 1で構築した最小構成のままです。
発生した課題
- 営業担当の画面操作が数秒〜十数秒単位で遅くなる
- 一部のリクエストがタイムアウトする
- 月初・月末など、特定のタイミングで繰り返し発生する
CloudWatchで確認する項目
まず、次のメトリクスをCloudWatchで確認します。
- EC2 CPU使用率:95%前後まで上昇し、高止まりしている
- EC2ネットワークI/O:CPU使用率ほど逼迫していない
- ALBのレスポンスタイム:CPU使用率の上昇と同時に悪化している
- RDSのCPU使用率・接続数:EC2ほど逼迫していないが、接続数がじわじわ増えている
この結果から、ボトルネックはRDSではなくEC2のCPUであると判断できます。
新しい要件
- 高負荷時でも営業担当の操作が遅延しない
- 特定のタイミング(月初・月末)に合わせて自動的にスケールする
- 恒久対応までの間、暫定対応で影響を抑えられる
設計候補(対応方針)
| 候補 | 概要 | 採否 |
|---|---|---|
| スケールアップ(暫定) | EC2のインスタンスタイプを大きくする | 暫定対応として採用 |
| スケールアウト(恒久) | Auto Scalingで複数EC2に分散する | 恒久対応として採用 |
| RDSのスケールアップ | RDSインスタンスタイプを大きくする | 見送り(RDSはボトルネックでないため) |
採用した改善策
暫定対応:スケールアップ
まず、EC2のインスタンスタイプを一段階大きくし、CPU使用率を下げてサービスを安定させます。ただし、これは根本解決ではなく、次に同じ規模の負荷が来れば再発します。
恒久対応:スケールアウト(Auto Scaling)
Level 2:高可用化・安定運用で導入したAuto Scaling Groupにより、CPU使用率に応じてEC2台数を自動的に増減させます。ALBが複数EC2へリクエストを振り分けるため、1台あたりの負荷が下がります。
なぜその対応を選んだか
スケールアップだけでは、次に利用が増えたときに再び同じ問題が発生します。一方でスケールアウトは、負荷の増減に自動で追従できるため、月初・月末のような周期的な負荷変動に強い構成です。
採用しなかった選択肢
RDSのスケールアップも検討しましたが、CloudWatchの確認結果からRDSはボトルネックではないと判断したため見送りました。原因を切り分けずに全体をスケールアップすると、コストだけが増えて根本解決にならない典型的な失敗パターンです。
セッション管理
Auto Scalingで複数EC2構成にする際、EC2内にセッション情報を保持していると、リクエストが別のEC2に振られたときにログイン状態が失われます。セッション情報をEC2の外(RDSまたはキャッシュ)へ外部化することで、この問題を回避します。
RDS側のボトルネック
今回はRDSがボトルネックではありませんでしたが、接続数がじわじわ増えていた点は将来的な懸念点です。EC2台数が増えるとRDSへの同時接続数も増えるため、コネクションプーリングの設定や、必要に応じたRDSのスケールアップも合わせて監視します。
改善後の構成
Route 53
↓
ALB
↓
Auto Scaling Group
├─ EC2 / AZ-a
└─ EC2 / AZ-c
↓
RDS Multi-AZ
Level 2で導入したAuto Scaling+RDS Multi-AZ構成そのものが、この障害への恒久対応にもなっています。
関連するLevel
この障害の恒久対応は、Level 2:高可用化・安定運用で導入した構成と同じです。単一EC2からの移行を検討している場合は、あわせて確認してください。