EC2 Auto Scalingのスケジュールされたアクション

EC2 Auto Scaling スケジュールされたスケーリング

スケーリングするタイミングをスケジュールされたEC2 Auto Scaling構成

AWS SAAの出題範囲の1つでもある、高性能アーキテクチャの設計に関する内容です。
予測される高トラフィックに対応するために、Auto Scalingのアクションをスケジュールすることで、システムの安定運用につながります。

以下のページで、CPU使用率に応じてスケーリングするAuto Scaling構成をご紹介しました。

あわせて読みたい
EC2 Auto Scaling – CPU使用率に基づいてターゲット追跡スケーリング 【EC2 Auto Scaling - CPU使用率に基づいてターゲット追跡スケーリング】 以下のページでEC2 Auto Scalingの基本事項を取り上げました。 https://awstut.com/2022/10/08...

これはターゲット追跡スケーリングポリシーと呼ばれるタイプです。

今回は特定のメトリクスに応じてスケーリングするのではなく、スケジュールされたアクションを設定し、特定の期間に自動的にスケーリングする構成を作成します。

構築する環境

Diagram of EC2 Auto Scaling Scheduled 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スタックを作成します。
スタックの作成および各スタックの確認方法については、以下のページをご確認ください。

あわせて読みたい
CloudFormationのネストされたスタックで環境を構築する 【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グループを確認します。

Auto Scaling group has been successfully created.

デフォルトの状態では、インスタンスが1つ起動されるように設定されています。

Auto Scalingのスケジュールされたアクションを確認します。

Two schedules are set up in the Auto Scaling group.

2つのアクションがスケジュールされていることがわかります。スケールアウト用とスケールイン用です。

Auto Scalingアクションの履歴を確認します。

One instance is created in the Auto Scaling group.

指定通り、インスタンスが1台作成されています。

実際に作成されたインスタンスの状況を確認します。

One instance is created in the Auto Scaling group.

履歴の通り、1台のインスタンスが作成されていることがわかります。

ALBにアクセス1

準備が整いましたので、ALBにアクセスします。

Access to Instance 1.

作成されたインスタンスから応答がありました。
正常にALBにAuto Scalingグループがアタッチされていることがわかります。

スケールアウト時の挙動

次にスケールアウト時の挙動を確認します。
スケールアウトが開始する7:45を待ってから確認を行います。
まずAuto Scalingグループのアクション履歴を確認します。

Scheduled actions initiated scale-out.

スケジュール通りに7:45にアクションが開始され、2台目のインスタンスが作成されました。

改めてAuto Scalingグループ内のインスタンスを確認します。

The number of instances increased to two.

2台目のインスタンスが作成されていることがわかります。
確かにスケジュールされたアクションで、インスタンス数をスケールアウトすることができました。

ALBにアクセス2

改めてALBにアクセスします。

Access to Instance 2.

2台目のインスタンスからも応答が返ってくるようになりました。

スケールイン時の挙動

最後にスケールイン時の挙動を確認します。
スケールインが開始する7:50を待ってから確認を行います。
まずAuto Scalingグループのアクション履歴を確認します。

Scheduled actions initiated scale-in.

スケジュール通りに7:50にアクションが開始され、2台あったインスタンスの内、1台が終了しました。

改めてAuto Scalingグループ内のインスタンスを確認します。

The number of instances returned to one.

Auto Scalingグループ内には、1台のインスタンスだけ配置されていることがわかります。
確かにスケジュールされたアクションで、インスタンス数をスケールインすることができました。

まとめ

Auto Scalingグループにスケジュールされたアクションを設定し、特定の期間に自動的にスケーリングする構成を確認しました。