EC2 Auto Scaling入門 – スケーリングポリシーなし
EC2 Auto Scalingを利用することによって、任意の数のEC2インスタンスを起動し、アプリケーションの可用性を高めることができます。
今回はEC2 Auto Scaling入門ということで、スケーリングポリシーを設定せず、常に2台のEC2インスタンスが起動するように設定します。
なおシンプルスケーリングに関しては、以下のページをご確認ください。
ステップスケーリングに関しては、以下のページをご確認ください。
ターゲット追跡スケーリングに関しては、以下のページをご確認ください。
構築する環境
ALBを作成し、パブリックサブネット内のEC2 Auto Scalingをアタッチします。
Auto Scalingは以下の通りに設定します。
- 最小数:2
- 最大数:2
- 希望数:2
Auto Scalingグループ内で起動するEC2インスタンスですが、最新版のAmazon Linux 2とします。
S3上のyumリポジトリからApacheをインストールし、Webサーバとして動作するように設定します。
CloudFormationテンプレートファイル
上記の構成をCloudFormationで構築します。
以下のURLにCloudFormationテンプレートを配置しています。
https://github.com/awstut-an-r/awstut-fa/tree/main/089
テンプレートファイルのポイント解説
本ページでは、Auto Scalingの基本的な構成について取り上げます。
プライベートサブネット内のリソースをALBにアタッチする方法については、以下のページをご確認ください。
プライベートサブネット内のインスタンスでyumを実行する方法については、以下のページをご確認ください。
EC2 Auto Scaling
EC2 Auto Scalingを構築するために、以下の2つのリソースを作成します。
- 起動テンプレート( or 起動設定)
- Auto Scalingグループ
起動テンプレート
Resources:
LaunchTemplate:
Type: AWS::EC2::LaunchTemplate
Properties:
LaunchTemplateData:
IamInstanceProfile:
Arn: !GetAtt InstanceProfile.Arn
ImageId: !Ref ImageId
InstanceType: !Ref InstanceType
SecurityGroupIds:
- !Ref InstanceSecurityGroup
UserData: !Base64 |
#!/bin/bash -xe
yum update -y
yum install -y httpd
systemctl start httpd
systemctl enable httpd
ec2-metadata -i > /var/www/html/index.html
LaunchTemplateName: !Sub "${Prefix}-LaunchTemplate"
Code language: YAML (yaml)
起動テンプレートはAuto Scalingグループ内で起動するEC2インスタンスの設定情報に関するリソースです。
EC2 Auto Scalingを構成する上で、起動テンプレートまたは起動設定を作成する必要があります。
ただし現在、起動設定を使用してAuto Scalingを構成することは非推奨となっています。
起動設定を使用しないことを強くお勧めします。Amazon EC2 Auto Scaling または Amazon EC2 には完全な機能を提供していません。起動設定に関する情報は、起動設定から起動テンプレートにまだ移行していないお客様向けに提供しています。
起動設定
基本的にはEC2インスタンスと同様の設定項目です。
例えばImageIdやInstanceTypeプロパティで、起動させるインスタンスのAMIやインスタンスタイプを指定します。
UserDataプロパティでユーザデータを設定できます。
今回はApacheをインストールおよび有効化し、HTMLファイルにインスタンスIDを書き込み、Apacheのルートページに設定します。
Auto Scalingグループ
Resources:
AutoScalingGroup:
Type: AWS::AutoScaling::AutoScalingGroup
Properties:
AutoScalingGroupName: !Sub "${Prefix}-AutoScalingGroup"
DesiredCapacity: !Ref DesiredCapacity
LaunchTemplate:
LaunchTemplateId: !Ref LaunchTemplate
Version: !GetAtt LaunchTemplate.LatestVersionNumber
MaxSize: !Ref MaxSize
MinSize: !Ref MinSize
VPCZoneIdentifier:
- !Ref PrivateSubnet1
- !Ref PrivateSubnet2
TargetGroupARNs:
- !Ref ALBTargetGroup
Code language: YAML (yaml)
Auto ScalingグループはEC2 Auto Scaling内に作成されるEC2インスタンスを集めたリソースです。
Auto Scalingグループ内に、起動テンプレートから生成されたEC2インスタンスが作成されます。
LaunchTemplateプロパティで、先述の起動テンプレートのIDおよびバージョンを指定します。
公式ページを参考にして設定しました。
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-as-group.html
Auto Scalingグループ内に作成するインスタンス数は、以下のプロパティで設定できます。
今回は常時2つのインスタンスが起動するように、いずれのプロパティにも2を指定します。
- DesiredCapacity:希望数
- MaxSize:最小数
- MinSize:最大数
TargetGroupARNsプロパティで、アタッチするALBのターゲットグループのARNを指定します。
環境構築
CloudFormationを使用して、本環境を構築し、実際の挙動を確認します。
CloudFormationスタックを作成し、スタック内のリソースを確認する
CloudFormationスタックを作成します。
スタックの作成および各スタックの確認方法については、以下のページをご確認ください。
各スタックのリソースを確認した結果、今回作成された主要リソースの情報は以下の通りです。
- ALB:fa-089-ALB
- ALBのDNS名:http://fa-089-alb-762314289.ap-northeast-1.elb.amazonaws.com/
- ALBターゲットグループ:fa-089-ALBTargetGroup
- 起動テンプレート:fa-089-LaunchTemplate
- EC2 Auto Scalingグループ:fa-089-AutoScalingGroup
作成されたリソースをAWS Management Consoleから確認します。
ALBを確認します。
ALBのDNS名等が確認できます。
起動テンプレートを確認します。
起動テンプレートがバージョン1として作成されていることがわかります。
Auto Scalingグループを確認します。
希望数・最小数・最大数がいずれも2です。つまりAuto Scalingグループ内には、常に2つのインスタンスが起動することになります。
Auto Scalingグループに先述の起動テンプレートが適用されていることがわかります。
Auto Scalingグループのアクティビティ履歴を見ると、空だったグループ内に2つのインスタンスが作成されたことがわかります。
グループ内のインスタンスを確認すると、確かに2つのインスタンスが起動していることがわかります。
動作確認
リソース構築時
準備が整いましたので、ALBにアクセスします。
2つのインスタンスに交互にアクセスできました。
確かにALBにAuto Scalingグループがアタッチされており、グループ内には2つのインスタンスが生成されていることがわかります。
手動でインスタンス停止
意図的にインスタンスを1つ停止させて、Auto Scalingの挙動を確認します。
一方のインスタンスを削除しました。
Auto Scalingグループのアクティビティ履歴を確認します。
インスタンスが削除されたことと、即座に自動的に新たなインスタンスが生成されたことがわかります。
Auto Scalingグループ内のインスタンスを確認します。
2台のインスタンスが「InService」の状態です。
つまりAuto Scalingグループ内のインスタンス数が2台に維持されていることがわかります。
改めてALBにアクセスします。
新たなインスタンスにもアクセスすることができました。
このように起動テンプレートおよびAuto Scalingグループを設定することによって、EC2 Auto Scalingが構成できることがわかりました。
まとめ
EC2 Auto Scalingを構成する起動テンプレートおよびAuto Scalingグループの設定方法を確認しました。
Auto Scalingグループの希望数・最小数・最大数を統一することによって、常時、規定数のインスタンスを起動・維持できることを確認しました。