前回の記事では、ELB(Elastic Load Balancing)による負荷分散について解説しました。本記事では、EC2 Auto Scalingを使用した自動スケーリングについて解説します。Auto Scalingグループの概念、起動テンプレートの設定、各種スケーリングポリシーの使い分けを理解し、負荷に応じて自動的にスケールする高可用性なシステムを構築できるようになりましょう。
Amazon EC2 Auto Scalingとは
Amazon EC2 Auto Scalingは、EC2インスタンスの数を自動的に増減させるサービスです。トラフィックの変動やシステム負荷に応じて適切な数のインスタンスを維持し、可用性の向上とコスト最適化を両立します。
Auto Scalingの主な特徴
Auto Scalingには以下の特徴があります。
| 特徴 | 説明 |
|---|---|
| 自動スケーリング | 需要に応じてインスタンスを自動的に増減 |
| 高可用性 | インスタンス障害時に自動的に新しいインスタンスを起動 |
| コスト最適化 | 必要な分だけのインスタンスを維持し、無駄を削減 |
| ELB連携 | ロードバランサーと連携してトラフィックを自動分散 |
| 複数AZ対応 | 複数のアベイラビリティゾーンに分散配置 |
なぜAuto Scalingが必要か
Webアプリケーションのトラフィックは時間帯や曜日、イベントによって大きく変動します。
graph TB
subgraph "固定台数構成の問題"
direction TB
Fixed[EC2 3台固定]
Fixed --> Problem1[ピーク時に<br/>処理しきれない]
Fixed --> Problem2[閑散時に<br/>リソースの無駄]
endgraph TB
subgraph "Auto Scaling構成のメリット"
direction TB
ASG[Auto Scaling<br/>グループ]
ASG --> Peak[ピーク時<br/>5台に自動増加]
ASG --> Normal[通常時<br/>3台を維持]
ASG --> Offpeak[閑散時<br/>2台に自動削減]
endAuto Scalingを導入することで、以下のメリットが得られます。
- 可用性の向上: 負荷増大時に自動でスケールアウトし、サービスを安定稼働
- 耐障害性: インスタンス障害時に自動で代替インスタンスを起動
- コスト削減: 閑散時にスケールインし、不要なリソースコストを削減
- 運用負荷軽減: 手動でのインスタンス増減作業が不要
Auto Scalingの構成要素
Auto Scalingは、以下の3つの主要コンポーネントで構成されます。
graph TB
subgraph "Auto Scalingの構成要素"
LT[起動テンプレート<br/>Launch Template] --> ASG[Auto Scalingグループ<br/>ASG]
ASG --> Policy[スケーリングポリシー]
LT --> |インスタンスの設定<br/>AMI、インスタンスタイプ等| ASG
ASG --> |インスタンスの管理<br/>最小/最大/希望容量| EC2[EC2インスタンス群]
Policy --> |スケーリングの条件<br/>いつ増減するか| ASG
end起動テンプレート(Launch Template)
起動テンプレートは、Auto Scalingグループが新しいインスタンスを起動する際の設定を定義します。
| 設定項目 | 説明 |
|---|---|
| AMI | 起動するインスタンスのベースイメージ |
| インスタンスタイプ | CPU、メモリなどのスペック |
| キーペア | SSH接続用のキーペア |
| セキュリティグループ | ネットワークアクセス制御 |
| IAMインスタンスプロファイル | インスタンスに付与するIAMロール |
| ユーザーデータ | 起動時に実行するスクリプト |
| EBSボリューム | ストレージの設定 |
| ネットワーク設定 | サブネット、パブリックIP等 |
Auto Scalingグループ(ASG)
Auto Scalingグループは、インスタンスの集合を管理する論理的なグループです。
| 設定項目 | 説明 |
|---|---|
| 最小容量(Minimum) | 常に維持するインスタンスの最小数 |
| 最大容量(Maximum) | スケールアウト時の上限数 |
| 希望容量(Desired) | 現在維持したいインスタンス数 |
| アベイラビリティゾーン | インスタンスを配置するAZ |
| ターゲットグループ | 連携するELBのターゲットグループ |
| ヘルスチェック | インスタンスの正常性確認方法 |
スケーリングポリシー
スケーリングポリシーは、いつ、どのようにインスタンス数を変更するかを定義します。
| ポリシータイプ | 説明 | ユースケース |
|---|---|---|
| ターゲット追跡 | メトリクスを目標値に維持 | CPU使用率を50%に維持 |
| ステップスケーリング | メトリクスに応じた段階的な増減 | 負荷に応じて段階的に対応 |
| シンプルスケーリング | アラームに基づく単純な増減 | 基本的なスケーリング |
| スケジュールスケーリング | 時間に基づく増減 | 予測可能な負荷変動 |
| 予測スケーリング | 機械学習による予測に基づく増減 | 過去のパターンから予測 |
起動テンプレートの作成
起動テンプレートは、Auto Scalingグループでインスタンスを起動する際の設計図となります。
起動テンプレートと起動設定の違い
以前は「起動設定(Launch Configuration)」も使用されていましたが、現在は起動テンプレートの使用が推奨されています。
| 項目 | 起動テンプレート | 起動設定 |
|---|---|---|
| バージョン管理 | 対応 | 非対応 |
| 変更 | 新バージョンの作成で変更可能 | 変更不可(新規作成が必要) |
| 複数インスタンスタイプ | 対応 | 非対応 |
| スポットインスタンス設定 | 詳細な設定が可能 | 基本的な設定のみ |
| T2/T3 Unlimited | 対応 | 非対応 |
| 推奨度 | 推奨 | 非推奨(既存のみ) |
起動テンプレートの作成手順
EC2コンソールから「起動テンプレート」→「起動テンプレートを作成」を選択します。
| 設定項目 | 説明 | 設定例 |
|---|---|---|
| 名前 | テンプレートの識別名 | web-server-template |
| 説明 | テンプレートの説明 | Web server for production |
| AMI | ベースイメージ | Amazon Linux 2023 |
| インスタンスタイプ | スペック | t3.medium |
| キーペア | SSH用キー | my-keypair |
| セキュリティグループ | ネットワーク制御 | web-server-sg |
| IAMプロファイル | IAMロール | WebServerRole |
ユーザーデータの設定例
ユーザーデータを使用して、インスタンス起動時に自動的にWebサーバーをセットアップできます。
|
|
起動テンプレートのバージョン管理
起動テンプレートはバージョン管理が可能です。設定変更時は新しいバージョンを作成します。
| バージョン | 変更内容 | 状態 |
|---|---|---|
| v1 | 初期作成 | 使用可能 |
| v2 | インスタンスタイプをt3.largeに変更 | 使用可能 |
| v3 | AMIを最新版に更新 | デフォルト |
Auto Scalingグループでは、使用するバージョンを以下のように指定できます。
- Latest: 常に最新バージョンを使用
- Default: デフォルトに設定されたバージョンを使用
- 特定のバージョン番号: 明示的にバージョンを指定
Auto Scalingグループの作成
Auto Scalingグループは、EC2インスタンスの集合を管理する中心的なコンポーネントです。
Auto Scalingグループの作成手順
EC2コンソールから「Auto Scalingグループ」→「Auto Scalingグループの作成」を選択します。
ステップ1: 起動テンプレートの選択
| 設定項目 | 説明 | 設定例 |
|---|---|---|
| 名前 | ASGの識別名 | web-server-asg |
| 起動テンプレート | 使用するテンプレート | web-server-template |
| バージョン | テンプレートのバージョン | Latest |
ステップ2: インスタンス起動オプション
| 設定項目 | 説明 | 設定例 |
|---|---|---|
| VPC | インスタンスを配置するVPC | my-vpc |
| サブネット | 配置するサブネット | プライベートサブネット(複数AZ) |
| インスタンスタイプ | 使用するインスタンスタイプ | テンプレートの設定または複数指定 |
複数のサブネット(AZ)を選択することで、高可用性を実現できます。
graph TB
subgraph "マルチAZ構成"
ASG[Auto Scaling<br/>グループ]
subgraph "AZ-a"
EC2A[EC2-A1]
EC2B[EC2-A2]
end
subgraph "AZ-c"
EC2C[EC2-C1]
EC2D[EC2-C2]
end
ASG --> EC2A
ASG --> EC2B
ASG --> EC2C
ASG --> EC2D
endステップ3: ロードバランサーの連携
| 設定項目 | 説明 | 設定例 |
|---|---|---|
| ロードバランサー | 連携するELB | 既存のALBを選択 |
| ターゲットグループ | トラフィック転送先 | web-target-group |
| ヘルスチェックタイプ | 正常性確認方法 | ELB |
ELBと連携することで、新しく起動したインスタンスが自動的にターゲットグループに登録されます。
ステップ4: グループサイズとスケーリング
| 設定項目 | 説明 | 設定例 |
|---|---|---|
| 希望容量 | 通常時のインスタンス数 | 2 |
| 最小容量 | インスタンスの下限 | 2 |
| 最大容量 | インスタンスの上限 | 10 |
graph LR
subgraph "容量設定の考え方"
Min[最小容量: 2] --> Desired[希望容量: 4] --> Max[最大容量: 10]
endヘルスチェックの設定
Auto Scalingグループは、インスタンスの正常性を監視し、異常なインスタンスを自動的に置き換えます。
| ヘルスチェックタイプ | 説明 | 推奨ケース |
|---|---|---|
| EC2 | EC2インスタンスのステータスチェック | ELBを使用しない場合 |
| ELB | ELBのヘルスチェック結果 | ELBと連携する場合(推奨) |
| 設定項目 | 説明 | 推奨値 |
|---|---|---|
| ヘルスチェックの猶予期間 | 起動後ヘルスチェックを開始するまでの待機時間 | 300秒(アプリ起動時間を考慮) |
猶予期間が短すぎると、アプリケーションの起動が完了する前にインスタンスが異常と判定され、無限ループに陥る可能性があります。
インスタンス配分戦略
Auto Scalingグループは、AZへのインスタンス配分を自動的に行います。
| 配分戦略 | 説明 |
|---|---|
| デフォルト | 各AZにインスタンスを均等に配分 |
| スポット配分 | スポットインスタンスを最適なプールから取得 |
graph TB
subgraph "AZ間の均等配分"
ASG2[ASG<br/>希望容量: 4]
ASG2 --> AZa[AZ-a: 2台]
ASG2 --> AZc[AZ-c: 2台]
end1つのAZに障害が発生した場合、残りのAZでインスタンスを起動し、希望容量を維持します。
スケーリングポリシー
スケーリングポリシーは、Auto Scalingグループがいつ、どのようにスケールするかを定義します。
ターゲット追跡スケーリングポリシー
ターゲット追跡スケーリングは、指定したメトリクスを目標値に維持するようにインスタンス数を調整します。最も推奨されるスケーリング方式です。
graph TB
subgraph "ターゲット追跡の動作"
CW[CloudWatch<br/>CPU使用率] --> Check{CPU > 50%?}
Check -->|はい| ScaleOut[スケールアウト]
Check -->|いいえ| Check2{CPU < 50%?}
Check2 -->|はい| ScaleIn[スケールイン]
Check2 -->|いいえ| Keep[現状維持]
end| 事前定義メトリクス | 説明 | 一般的な目標値 |
|---|---|---|
| ASGAverageCPUUtilization | 平均CPU使用率 | 50-70% |
| ASGAverageNetworkIn | 平均受信バイト数 | ワークロードによる |
| ASGAverageNetworkOut | 平均送信バイト数 | ワークロードによる |
| ALBRequestCountPerTarget | ターゲットあたりのリクエスト数 | 1000リクエスト/分など |
ターゲット追跡スケーリングポリシーの設定例を示します。
| 設定項目 | 値 |
|---|---|
| メトリクスタイプ | ASGAverageCPUUtilization |
| ターゲット値 | 50 |
| ウォームアップ時間 | 300秒 |
| スケールインの無効化 | 無効(スケールインを許可) |
ターゲット追跡の特徴
- CloudWatchアラームを自動的に作成・管理
- スケールアウトとスケールインの両方を自動で実行
- 複数のターゲット追跡ポリシーを組み合わせ可能
ステップスケーリングポリシー
ステップスケーリングは、メトリクスの値に応じて段階的にインスタンス数を調整します。
graph TB
subgraph "ステップスケーリングの動作"
CW2[CloudWatch<br/>CPU使用率] --> Step1{40-60%}
Step1 -->|該当| Action1[変更なし]
CW2 --> Step2{60-80%}
Step2 -->|該当| Action2[+2台追加]
CW2 --> Step3{80%以上}
Step3 -->|該当| Action3[+4台追加]
endステップスケーリングの設定例(スケールアウト)を示します。
| CPU使用率 | 調整タイプ | 調整値 |
|---|---|---|
| 60% ≤ CPU < 75% | 容量を追加 | +1 |
| 75% ≤ CPU < 85% | 容量を追加 | +2 |
| 85% ≤ CPU | 容量を追加 | +4 |
ステップスケーリングの設定例(スケールイン)を示します。
| CPU使用率 | 調整タイプ | 調整値 |
|---|---|---|
| CPU < 30% | 容量を削除 | -1 |
| CPU < 20% | 容量を削除 | -2 |
ステップスケーリングの特徴
- 細かい制御が可能
- CloudWatchアラームを手動で作成する必要がある
- スケールアウトとスケールインを別々に定義
シンプルスケーリングポリシー
シンプルスケーリングは、CloudWatchアラームに基づいて単一のスケーリングアクションを実行します。
| 設定項目 | 説明 |
|---|---|
| CloudWatchアラーム | スケーリングのトリガー |
| 調整タイプ | 変更方法(容量変更、パーセント変更、固定値設定) |
| クールダウン | 次のスケーリングまでの待機時間 |
シンプルスケーリングの制限
シンプルスケーリングには「クールダウン期間」があり、スケーリングアクション実行後は次のスケーリングまで待機が必要です。そのため、急激な負荷変動への対応が遅れる可能性があります。
graph LR
subgraph "シンプルスケーリングのクールダウン"
Scale1[スケールアウト] --> Cool[クールダウン<br/>300秒] --> Next[次の評価]
end新規の構成では、シンプルスケーリングよりもターゲット追跡スケーリングを推奨します。
スケーリングポリシーの比較
| 項目 | ターゲット追跡 | ステップ | シンプル |
|---|---|---|---|
| 設定の容易さ | 簡単 | 中程度 | 簡単 |
| 柔軟性 | 中程度 | 高い | 低い |
| 推奨度 | 推奨 | 特殊要件時 | 非推奨 |
| アラーム管理 | 自動 | 手動 | 手動 |
| クールダウン | 不要 | 不要 | 必要 |
スケジュールされたスケーリング
スケジュールされたスケーリングは、予測可能な負荷変動に対応するために、特定の時間にインスタンス数を変更します。
ユースケース
graph TB
subgraph "日次パターンの例"
Morning[朝 9時<br/>スケールアウト<br/>最小: 4台]
Evening[夜 21時<br/>スケールイン<br/>最小: 2台]
Morning --> Daytime[日中は高負荷]
Evening --> Nighttime[夜間は低負荷]
endスケジュールされたスケーリングが有効なシナリオを示します。
- 日次パターン: 業務時間帯は高負荷、夜間は低負荷
- 週次パターン: 平日は高負荷、週末は低負荷
- イベント対応: 計画されたキャンペーンやセール期間
- バッチ処理: 定期的なバッチ処理の実行時間帯
スケジュールの設定
| 設定項目 | 説明 | 設定例 |
|---|---|---|
| 名前 | スケジュールの識別名 | scale-out-morning |
| 希望容量 | 変更後の希望インスタンス数 | 4 |
| 最小容量 | 変更後の最小インスタンス数 | 4 |
| 最大容量 | 変更後の最大インスタンス数 | 10 |
| 繰り返し | Cron式または1回限り | 0 9 * * 1-5(平日9時) |
| タイムゾーン | スケジュールのタイムゾーン | Asia/Tokyo |
Cron式の書式は以下のとおりです。
分 時 日 月 曜日
| 例 | 説明 |
|---|---|
| 0 9 * * 1-5 | 平日の9:00 |
| 0 21 * * 1-5 | 平日の21:00 |
| 0 0 * * 6,0 | 土日の0:00 |
| 0 8 1 * * | 毎月1日の8:00 |
スケジュールスケーリングとポリシーの組み合わせ
スケジュールスケーリングと動的スケーリングポリシーを組み合わせることで、より効果的なスケーリングが実現できます。
graph TB
subgraph "組み合わせ戦略"
Schedule[スケジュールスケーリング<br/>9時: 最小4台に変更]
Target[ターゲット追跡ポリシー<br/>CPU 50%を維持]
Schedule --> Base[ベースラインを確保]
Target --> Dynamic[負荷に応じて調整]
Base --> Combined[効果的なスケーリング]
Dynamic --> Combined
endこの組み合わせにより、以下のメリットが得られます。
- 予測可能な負荷増加に事前対応(スケジュール)
- 予測外の負荷変動にも自動対応(ターゲット追跡)
予測スケーリング
予測スケーリングは、過去のトラフィックパターンを機械学習で分析し、将来の負荷を予測してスケーリングを行います。
予測スケーリングの仕組み
graph LR
subgraph "予測スケーリングの流れ"
History[過去14日間の<br/>メトリクス] --> ML[機械学習<br/>モデル]
ML --> Forecast[48時間先の<br/>負荷予測]
Forecast --> Action[事前に<br/>スケールアウト]
end| 設定項目 | 説明 |
|---|---|
| メトリクス | 予測に使用するメトリクス(CPU、リクエスト数など) |
| ターゲット使用率 | 維持したい使用率 |
| 予測のみモード | 予測結果の確認のみ(スケーリングは実行しない) |
| スケーリングモード | 予測と動的スケーリングの組み合わせ |
予測スケーリングの利点
- 先回りのスケーリング: 負荷増加前にインスタンスを準備
- ウォームアップ時間の考慮: インスタンスの起動時間を考慮した事前対応
- 定期的なパターンへの対応: 日次・週次の負荷パターンを自動学習
予測スケーリングを有効にするには、少なくとも1日分の履歴データが必要です。より正確な予測には、2週間以上の履歴データが推奨されます。
インスタンスのウォームアップとクールダウン
スケーリング時のインスタンスの準備期間について理解することが重要です。
ウォームアップ期間
ウォームアップ期間は、新しく起動したインスタンスがメトリクスに含まれるまでの待機時間です。
graph LR
subgraph "ウォームアップの必要性"
Launch[インスタンス起動] --> Boot[OS起動<br/>30秒]
Boot --> App[アプリ起動<br/>60秒]
App --> Ready[サービス開始<br/>30秒]
Ready --> Metrics[メトリクス安定<br/>60秒]
end| 設定項目 | 説明 | 推奨値 |
|---|---|---|
| デフォルトのウォームアップ | ASG全体のデフォルト値 | 300秒 |
| ポリシー別のウォームアップ | ポリシーごとの設定 | アプリの起動時間 + バッファ |
ウォームアップ期間中のインスタンスは、スケーリングの判断に使用されるメトリクスから除外されます。これにより、起動直後の不安定な状態がスケーリング判断に影響を与えることを防ぎます。
クールダウン期間(シンプルスケーリング)
クールダウン期間は、シンプルスケーリングポリシーにおいて、スケーリングアクション後に次のスケーリングを待機する時間です。
| 設定項目 | 説明 | デフォルト値 |
|---|---|---|
| デフォルトクールダウン | ASGのデフォルト値 | 300秒 |
| スケールアウトクールダウン | スケールアウト後の待機時間 | デフォルト値を使用 |
| スケールインクールダウン | スケールイン後の待機時間 | デフォルト値を使用 |
ターゲット追跡スケーリングとステップスケーリングでは、クールダウンの代わりにウォームアップ期間が使用されます。
インスタンスの終了ポリシー
スケールイン時に、どのインスタンスを終了するかを決定するポリシーです。
終了ポリシーの種類
| ポリシー | 説明 |
|---|---|
| Default | デフォルトの終了ポリシー(下記の順序で適用) |
| OldestInstance | 最も古いインスタンスを終了 |
| NewestInstance | 最も新しいインスタンスを終了 |
| OldestLaunchConfiguration | 最も古い起動設定のインスタンスを終了 |
| OldestLaunchTemplate | 最も古い起動テンプレートのインスタンスを終了 |
| ClosestToNextInstanceHour | 次の課金時間に最も近いインスタンスを終了 |
| AllocationStrategy | スポットインスタンスの配分戦略に基づく |
デフォルト終了ポリシーの順序
デフォルトの終了ポリシーは、以下の順序で適用されます。
graph TB
subgraph "デフォルト終了ポリシーの順序"
Step1[1. AZのバランスを確認<br/>インスタンスが多いAZを選択]
Step2[2. 古い起動設定/テンプレートを選択]
Step3[3. 次の課金時間に近いインスタンスを選択]
Step4[4. ランダムに選択]
Step1 --> Step2 --> Step3 --> Step4
endスケールイン保護
特定のインスタンスをスケールインから保護することができます。
| 保護レベル | 説明 |
|---|---|
| インスタンスレベル | 特定のインスタンスを保護 |
| ASGレベル | 新規インスタンスにデフォルトで保護を適用 |
保護されたインスタンスは、以下の場合でも終了されません。
- スケールインアクション
- 最大インスタンス数の削減
- インスタンスの更新
ただし、以下の場合は終了されます。
- 手動終了
- ヘルスチェック失敗
- スポットインスタンスの中断
ライフサイクルフック
ライフサイクルフックは、インスタンスの起動または終了時にカスタムアクションを実行するための仕組みです。
ライフサイクルフックの用途
graph TB
subgraph "起動時のライフサイクルフック"
Launch2[インスタンス起動] --> Pending[Pending:Wait]
Pending --> Custom[カスタムアクション<br/>- 設定ファイル取得<br/>- ヘルスチェック確認<br/>- アプリ起動確認]
Custom --> Complete[CONTINUE]
Complete --> InService[InService]
endgraph TB
subgraph "終了時のライフサイクルフック"
Term[終了開始] --> TermWait[Terminating:Wait]
TermWait --> Custom2[カスタムアクション<br/>- ログの退避<br/>- セッションの移行<br/>- 登録解除処理]
Custom2 --> Complete2[CONTINUE]
Complete2 --> Terminated[Terminated]
endライフサイクルフックの設定
| 設定項目 | 説明 |
|---|---|
| 名前 | フックの識別名 |
| ライフサイクルの移行 | 起動時(launch)または終了時(terminate) |
| ハートビートタイムアウト | アクション完了までの待機時間 |
| デフォルトの結果 | タイムアウト時の動作(CONTINUE/ABANDON) |
| 通知ターゲット | SNSトピックまたはSQSキュー |
ライフサイクルフックとの連携サービス
| サービス | 用途 |
|---|---|
| Lambda | カスタムスクリプトの実行 |
| SNS | 通知の送信 |
| SQS | メッセージキューイング |
| Systems Manager | Run Commandの実行 |
| EventBridge | イベント駆動の処理 |
インスタンスの更新
Auto Scalingグループ内のインスタンスを新しい設定で更新する方法を説明します。
インスタンスの更新方法
| 方法 | 説明 | ユースケース |
|---|---|---|
| インスタンスの更新 | ローリングアップデート | 通常のアプリケーション更新 |
| 手動での入れ替え | 手動でインスタンスを終了 | 段階的な更新 |
| 最大インスタンス寿命 | 指定期間後に自動置き換え | AMIの定期更新 |
インスタンスの更新(ローリングアップデート)
インスタンスの更新機能を使用すると、ダウンタイムを最小限に抑えながらインスタンスを更新できます。
| 設定項目 | 説明 | 推奨値 |
|---|---|---|
| 最小ヘルシー割合 | 更新中に維持する正常インスタンスの割合 | 90% |
| インスタンスウォームアップ | 新インスタンスの準備時間 | 300秒 |
| チェックポイント | 更新を一時停止する割合 | なし(連続更新)または50% |
| スキップマッチング | 既に最新のインスタンスをスキップ | 有効 |
graph LR
subgraph "ローリングアップデートの流れ"
Start[更新開始] --> New1[新インスタンス1起動]
New1 --> Health1[ヘルスチェック]
Health1 --> Old1[旧インスタンス1終了]
Old1 --> New2[新インスタンス2起動]
New2 --> Repeat[繰り返し...]
Repeat --> Complete3[完了]
endAuto ScalingとELBの連携設定
Auto ScalingとELBを連携させることで、トラフィックの自動分散と自動スケーリングを実現します。
連携の仕組み
graph TB
subgraph "Auto Scaling + ELB連携"
Internet[インターネット] --> ALB[ALB]
ALB --> TG[ターゲットグループ]
TG --> ASG3[Auto Scalingグループ]
ASG3 -->|新規起動| New[新インスタンス]
New -->|自動登録| TG
ASG3 -->|終了| Old[終了インスタンス]
Old -->|自動登録解除| TG
CloudWatch2[CloudWatch] -->|スケーリング判断| ASG3
end連携時の設定ポイント
| 設定項目 | 説明 | 推奨設定 |
|---|---|---|
| ヘルスチェックタイプ | インスタンスの正常性確認 | ELB |
| ヘルスチェック猶予期間 | 起動後の待機時間 | アプリ起動時間 + バッファ |
| 登録解除の遅延 | 終了前の待機時間 | 300秒 |
| ターゲットグループ | トラフィック転送先 | ALBのターゲットグループ |
Connection Draining
インスタンスの終了時、既存の接続を適切に処理するためにConnection Draining(登録解除の遅延)を設定します。
graph LR
subgraph "Connection Drainingの流れ"
Terminate[スケールイン開始] --> Draining[Draining状態<br/>新規リクエスト停止]
Draining --> Wait[既存接続の完了待ち<br/>最大300秒]
Wait --> Complete4[インスタンス終了]
endAuto Scalingのベストプラクティス
Auto Scalingを効果的に活用するためのベストプラクティスを紹介します。
容量設計
| 項目 | 推奨事項 |
|---|---|
| 最小容量 | 1台のAZ障害でもサービス継続できる台数 |
| 最大容量 | コスト上限を考慮した上限設定 |
| 希望容量 | 通常負荷を処理できる台数 |
スケーリングポリシー
| 項目 | 推奨事項 |
|---|---|
| ポリシータイプ | ターゲット追跡スケーリングを優先 |
| メトリクス | CPU使用率50-70%、またはリクエスト数ベース |
| 複数ポリシー | スケールアウトは積極的に、スケールインは慎重に |
| ウォームアップ | アプリケーションの起動時間を考慮 |
高可用性
graph TB
subgraph "高可用性構成の推奨"
ASG4[Auto Scalingグループ]
ASG4 --> AZ1[AZ-a: 2台以上]
ASG4 --> AZ2[AZ-c: 2台以上]
ASG4 --> AZ3[AZ-d: 2台以上]
end| 項目 | 推奨事項 |
|---|---|
| AZ数 | 3つ以上のAZを使用 |
| 最小容量 | AZ数 × 各AZの最低必要台数 |
| ELB連携 | 必ずELBと連携してヘルスチェックを実施 |
コスト最適化
| 項目 | 推奨事項 |
|---|---|
| 購入オプション | オンデマンドとスポットの混合フリートを活用 |
| スケジュールスケーリング | 予測可能な負荷パターンには事前にスケール |
| 適切なインスタンスタイプ | ワークロードに適したタイプを選択 |
| モニタリング | CloudWatchで実際の使用状況を監視 |
まとめ
本記事では、Amazon EC2 Auto Scalingの基本概念から、起動テンプレート、Auto Scalingグループ、各種スケーリングポリシーまでを解説しました。
重要なポイントをまとめます。
- Auto Scalingの目的: 可用性向上、コスト最適化、運用負荷軽減を実現
- 起動テンプレート: インスタンス設定の設計図、バージョン管理が可能
- Auto Scalingグループ: 最小/最大/希望容量でインスタンス数を制御
- ターゲット追跡スケーリング: 最も推奨されるスケーリング方式
- スケジュールスケーリング: 予測可能な負荷変動に事前対応
- ELB連携: ヘルスチェックと自動登録/登録解除で高可用性を実現
Auto ScalingとELBを組み合わせることで、負荷に応じて自動的にスケールする高可用性なシステムを構築できます。次回の記事では、CloudWatchによるAWSリソースの監視について解説します。