Amazon EC2 Auto Scaling

出典:AWS Blackbelt

Auto Scalingサービス群の整理

  • Amazon EC2 Auto Scaling
    • EC2インスタンスの自動スケール機能を提供
  • Application Auto Scaling
    • EC2インスタンス以外のリソースにも自動スケーリング機能を提供
      • ECS、AppStream、DynamoDB、Aurora、Elasticacheなど
  • AWS Auto Scaling
    • 2種類のAutoScalingのスケーリングを設定・管理
    • 新規適用は非推奨、各サービス機能で設定・管理を行う

EC2 Auto Scaling 機能

自動スケール設定

  • ターゲット追跡スケーリング+予測スケーリングの組み合わせがおすすめ
  • スケジュールスケーリングも組み合わせられる

ターゲット追跡スケーリング

  • 1つのメトリクスに対し、単に目標値を指定するのみでよい
    • 例:CPU Utilizationを50%に維持

※ステップスケーリングポリシーより簡易で、大半のユースケースをカバー可能

予測スケーリング

  • 機械学習を利用、2週間分のメトリクスを分析し、次の2日の今後の需要を予測
    • 最短で24時間分のメトリクスデータから始められる
  • 予測データに基づいてキャパシティの増減がスケジュールされる
  • 予測値だけを表示させることも可能

組み合わせた利用方法

  1. 大まかなキャパシティ増減は予測スケーリングに任せ、前もってスケールしておく
  2. 実際の負荷に対して不足した分をターゲット追跡で補充する
  3. さらにスケジュールスケーリングを組み合わせることもできる

その他のスケーリングポリシー

  • 簡易スケーリングポリシー:互換性維持のために残されており、新規採用はしない
  • ステップスケーリング:きめ細かい設定が可能だが複雑

ライサイクルフック

  • インスタンスの起動時や終了時に何かをしたいを実現する仕組み
    • 例:ELBに登録される前にインスタンス状の様々な準備が正しく完了していることを確認したい
  • 終了時ライフサイクルフックが有効な場合
    • 例:スケールインが発生する時、アプリケーションを安全に終了させ手からインスタンス削除したい

インスタンスリフレッシュ

  • AutoScalingグループ内のインスタンスを自動的に更新する仕組み
    • AMI更新時などの場面で、手動で入れ替える必要がなくなった
  • 入れ替えは一定割合のインスタンスが稼働中(Healthy)であることを保ちながら実施される
    • デフォルトは90%

ウォームプール

  • 軌道に長い時間のかかるインスタンスを事前起動できる仕組み
    • 事前に起動されたインスタンスが「ウォームプール」にStopped状態で保持し起動時間短縮
      • 発生する費用はEBSボリュームとEIPのみ
  • スケールアウトが発生すると、ウォームプールから開始(Start)される
  • 制約
    • スポットインスタンスを含むASG、複数インスタンスタイプを指定したASGにはウォームプールを追加できない

その他の機能

ヘルスチェック

正常に動作しないインスタンスを自動的に置き換えたい

  • 特に指定がなければ、EC2ヘルスチェックが有効になっている
    • 2/2以外のステータスが続くとAutoScalingサービスを置き換える
  • ELBヘルスチェック
    • ELBからのヘルスチェックに応答しない場合の速やかな入れ替えが可能

ヘルスチェックの猶予期間

スケールイン・スケールアウトを繰り返してしまう場合に設定

  • ヘルスチェックの猶予時間:デフォルトは5分(300秒)
  • この時間より起動時間が長い場合、インスタンスの起動と削除が繰り返される問題
    • ELBヘルスチェックに、ユーザーデータなどで指示したS3からのコンテンツ配備や、DB接続などを前提としたアプリケーションパスをしている場合などに有効

インスタンスの保護

特定のインスタンスをスケールインから保護したい場合

  • ASG単位、またはインスタンス単位で設定
  • スケールインされなくなる
  • 次の条件からは保護できない点が注意
    • 手動でのインスタンス削除(Terminate)
    • ヘルスチェックによる置き換え
    • スポットインスタンの中断
  • すべてのインスタンスが終了保護された状態でスケールインイベントが発生した場合、希望容量だけが減少し、スケールイン(インスタンス削除)は行わない

スケーリングプロセスの中断

一時的にスケールインやスケールアウトを止めたい

  • 一時的にスケール動作を停止できる
  • ASG単位で設定
  • 中断するプロセスを指定する(Launch、Terminateなど)
  • 使い所
    • 機能テスト等で条件を整えたい場合
    • 動作のおかしいインスタンスの確認

スタンバイ、デタッチ

特定のインスタンスをAutoScaling Groupから外したい

  • スタンバイ(一時的なインスタンスの削除)
    • インスタンス単位で設定
    • そのインスタンスはAutoScaling Groupにいながら「スタンバイ」状態になる
      • ELBから登録解除され、ヘルスチェック対象外となり、ASGno希望容量が減少する
    • その間にインスタンスのトラブルシューティングを行う
  • デタッチ
    • インスタンス単位で設定
    • そのインスタンスはAutoScaling Groupのメンバーから外される
    • スタンバイと実質的な効果は同一
    • インスタンスはそのままRunnning状態で保持される
    • ASGとして与えられていたタグは除去される
    • 終了後、そのまま終了予定であればデタッチが適する