スケーリングするタイミングをスケジュールされたEC2 Auto Scaling構成
AWS SAAの出題範囲の1つでもある、高性能アーキテクチャの設計に関する内容です。
予測される高トラフィックに対応するために、Auto Scalingのアクションをスケジュールすることで、システムの安定運用につながります。
以下のページで、CPU使用率に応じてスケーリングするAuto Scaling構成をご紹介しました。
これはターゲット追跡スケーリングポリシーと呼ばれるタイプです。
今回は特定のメトリクスに応じてスケーリングするのではなく、スケジュールされたアクションを設定し、特定の期間に自動的にスケーリングする構成を作成します。
構築する環境
ALBを作成し、プライベートサブネット内のAuto Scalingグループをアタッチします。
グループ内のインスタンスはAmazon Linux 2とし、Apacheをインストールして、Webサーバとして動作させます。
グループにスケーリングアクションをスケジュールします。スケジュールによって、デフォルトではインスタンス数が1のグループを一時的に2に増加させます。
CloudFormationテンプレートファイル
上記の構成をCloudFormationで構築します。
以下のURLにCloudFormationテンプレートファイルを設置しています。
https://github.com/awstut-an-r/awstut-saa/tree/main/02/004
テンプレートファイルのポイント解説
今回の構成は、ほとんど先述のページのものと同様です。
このページでは、スケジュールされたスケーリングアクションに関する内容を取り上げます。
スケーリングアクションのスケジュール
スケーリングアクションをスケーリングするためには、スケールアウト/イン時のアクションを定義する必要があります。ポイントは以下の2点を指定することです。
- アクションするタイミング
- インスタンスの数(最大数、最小数、希望数)の設定
スケールアウト用のスケジュールアクション
Resources:
ScheduledActionOut:
Type: AWS::AutoScaling::ScheduledAction
Properties:
AutoScalingGroupName: !Ref AutoScalingGroup
DesiredCapacity: !Ref MaxSize
MaxSize: !Ref MaxSize
MinSize: !Ref MaxSize
Recurrence: !Ref ScheduledActionOutRecurrence
Code language: YAML (yaml)
Recurrenceプロパティを使用すると、cron式でアクションのスケジュールができます。cron式を記載する際の注意点ですが、JSTではなくUTCで記載する必要があります。JSTはUTCよりも9時間進んでいます。そのため例えば毎日15時に処理を行いたい場合は「0 6 * * *」と表記する必要があります。今回は7:45にスケールアウトを実行するように、「45 22 * * *」と設定します。
DesiredCapacity、MaxSize、MinSizeプロパティで、インスタンス数を設定できます。今回は3プロパティに「2」を指定し、インスタンス数を、デフォルトの1から2に増加させるように設定します。
スケールイン用のスケジュールアクション
Resources:
ScheduledActionIn:
Type: AWS::AutoScaling::ScheduledAction
Properties:
AutoScalingGroupName: !Ref AutoScalingGroup
DesiredCapacity: !Ref MinSize
MaxSize: !Ref MinSize
MinSize: !Ref MinSize
Recurrence: !Ref ScheduledActionInRecurrence
Code language: YAML (yaml)
スケジュールアウト用のリソースと同じ構造です。Recurrenceプロパティに「50 22 * * *」を、DesiredCapacity、MaxSize、MinSizeプロパティに「1」を設定します。
以上の設定をまとめると、毎日7:45から7:50の間、インスタンス数を2に増加させるという挙動となります。
環境構築
CloudFormationを使用して、本環境を構築し、実際の挙動を確認します。
CloudFormationスタックを作成し、スタック内のリソースを確認する
CloudFormationスタックを作成します。
スタックの作成および各スタックの確認方法については、以下のページをご確認ください。
各スタックのリソースを確認した結果、今回作成された主要リソースの情報は以下の通りです。
- ALBのDNS名:saa-02-004-ALB-1864041057.ap-northeast-1.elb.amazonaws.com
- Auto Scalingグループ:saa-02-004-AutoScalingGroup
AWS Management Consoleからも、リソースの作成状況を確認します。
まずAuto Scalingグループを確認します。
デフォルトの状態では、インスタンスが1つ起動されるように設定されています。
Auto Scalingのスケジュールされたアクションを確認します。
2つのアクションがスケジュールされていることがわかります。スケールアウト用とスケールイン用です。
Auto Scalingアクションの履歴を確認します。
指定通り、インスタンスが1台作成されています。
実際に作成されたインスタンスの状況を確認します。
履歴の通り、1台のインスタンスが作成されていることがわかります。
ALBにアクセス1
準備が整いましたので、ALBにアクセスします。
作成されたインスタンスから応答がありました。
正常にALBにAuto Scalingグループがアタッチされていることがわかります。
スケールアウト時の挙動
次にスケールアウト時の挙動を確認します。
スケールアウトが開始する7:45を待ってから確認を行います。
まずAuto Scalingグループのアクション履歴を確認します。
スケジュール通りに7:45にアクションが開始され、2台目のインスタンスが作成されました。
改めてAuto Scalingグループ内のインスタンスを確認します。
2台目のインスタンスが作成されていることがわかります。
確かにスケジュールされたアクションで、インスタンス数をスケールアウトすることができました。
ALBにアクセス2
改めてALBにアクセスします。
2台目のインスタンスからも応答が返ってくるようになりました。
スケールイン時の挙動
最後にスケールイン時の挙動を確認します。
スケールインが開始する7:50を待ってから確認を行います。
まずAuto Scalingグループのアクション履歴を確認します。
スケジュール通りに7:50にアクションが開始され、2台あったインスタンスの内、1台が終了しました。
改めてAuto Scalingグループ内のインスタンスを確認します。
Auto Scalingグループ内には、1台のインスタンスだけ配置されていることがわかります。
確かにスケジュールされたアクションで、インスタンス数をスケールインすることができました。
まとめ
Auto Scalingグループにスケジュールされたアクションを設定し、特定の期間に自動的にスケーリングする構成を確認しました。