AWS CloudFormation で Amazon EC2 Auto Scaling リソースを設定する
以下の例では、Amazon EC2 Auto Scaling で使用するテンプレートに含めるさまざまなスニペットを示しています。
スニペットカテゴリ
単一インスタンスの Auto Scaling グループを作成する
この例に示すのは、作業を進める際に役立つ、単一インスタンスに関連付けられた AWS::AutoScaling::AutoScalingGroup
リソースです。Auto Scaling グループの VPCZoneIdentifier
プロパティは、3 つの異なるアベイラビリティーゾーンの既存のサブネットのリストを指定します。スタックを作成する前に、アカウントから該当するサブネット ID を指定する必要があります。LaunchTemplate
プロパティは、テンプレートの他の場所で定義されている論理名 myLaunchTemplate
の AWS::EC2::LaunchTemplate
リソースを参照します。
注記
起動テンプレートの例については、Amazon EC2 スニペットの「AWS CloudFormation を使用した起動テンプレートの作成」、および「AWS::EC2::LaunchTemplate
リソース」の「Examples」のセクションを参照してください。
JSON
"myASG" : { "Type" : "AWS::AutoScaling::AutoScalingGroup", "Properties" : { "VPCZoneIdentifier" : [ "
subnetIdAz1
", "subnetIdAz2
", "subnetIdAz3
" ], "LaunchTemplate" : { "LaunchTemplateId" : { "Ref" : "myLaunchTemplate
" }, "Version" : { "Fn::GetAtt" : [ "myLaunchTemplate
", "LatestVersionNumber" ] } }, "MaxSize" : "1", "MinSize" : "1" } }
YAML
myASG: Type: AWS::AutoScaling::AutoScalingGroup Properties: VPCZoneIdentifier: -
subnetIdAz1
-subnetIdAz2
-subnetIdAz3
LaunchTemplate: LaunchTemplateId: !RefmyLaunchTemplate
Version: !GetAttmyLaunchTemplate
.LatestVersionNumber MaxSize: '1' MinSize: '1'
ロードバランサーがアタッチされた Auto Scaling グループを作成する
この例に示すのは、複数のサーバー間で負荷を分散する AWS::AutoScaling::AutoScalingGroup
リソースです。また、同じテンプレートの他の場所で宣言された AWS リソースの論理名を指定します。
-
VPCZoneIdentifier
プロパティは、Auto Scaling グループの EC2 インスタンスが作成される 2 つのAWS::EC2::Subnet
リソースの論理名を、次のように指定します:myPublicSubnet1
、myPublicSubnet2
-
LaunchTemplate
プロパティは、論理名がmyLaunchTemplate
であるAWS::EC2::LaunchTemplate
リソースを指定します。 -
TargetGroupARNs
プロパティは、トラフィックを Auto Scaling グループにルーティングするために使用される Application Load Balancer または Network Load Balancer のターゲットグループのリストを指定します。この例では、1 つのターゲットグループとして、論理名がmyTargetGroup
であるAWS::ElasticLoadBalancingV2::TargetGroup
リソースを指定しています。
JSON
"myServerGroup" : { "Type" : "AWS::AutoScaling::AutoScalingGroup", "Properties" : { "VPCZoneIdentifier" : [ { "Ref" : "
myPublicSubnet1
" }, { "Ref" : "myPublicSubnet2
" } ], "LaunchTemplate" : { "LaunchTemplateId" : { "Ref" : "myLaunchTemplate
" }, "Version" : { "Fn::GetAtt" : [ "myLaunchTemplate
", "LatestVersionNumber" ] } }, "MaxSize" : "5", "MinSize" : "1", "TargetGroupARNs" : [ { "Ref" : "myTargetGroup
" } ] } }
YAML
myServerGroup: Type: AWS::AutoScaling::AutoScalingGroup Properties: VPCZoneIdentifier: - !Ref
myPublicSubnet1
- !RefmyPublicSubnet2
LaunchTemplate: LaunchTemplateId: !RefmyLaunchTemplate
Version: !GetAttmyLaunchTemplate
.LatestVersionNumber MaxSize: '5' MinSize: '1' TargetGroupARNs: - !RefmyTargetGroup
以下も参照してください。
Application Load Balancer の ALBRequestCountPerTarget
事前定義メトリクスに基づくターゲット追跡スケーリングポリシーを関連付けた Auto Scaling グループを作成する詳細な例については、「AWS::AutoScaling::ScalingPolicy
リソース」の「例」セクションを参照してください。
通知を使用する Auto Scaling グループを作成する
この例に示すのは、指定されたイベントが発生したときに Amazon SNS 通知を送信する AWS::AutoScaling::AutoScalingGroup
リソースです。NotificationConfigurations
プロパティは、AWS CloudFormation からの通知の送信先となる SNS トピックと、AWS CloudFormation が通知を送信するきっかけとなるイベントを指定します。NotificationTypes
で指定したイベントが発生すると、AWS CloudFormation から TopicARN
で指定した SNS トピックに通知が送信されます。スタックを起動すると、AWS CloudFormation は、同じテンプレート内で宣言された AWS::SNS::Subscription
リソース (snsTopicForAutoScalingGroup
) を作成します。
Auto Scaling グループの VPCZoneIdentifier
プロパティは、3 つの異なるアベイラビリティーゾーンの既存のサブネットのリストを指定します。スタックを作成する前に、アカウントから該当するサブネット ID を指定する必要があります。LaunchTemplate
プロパティは、同じテンプレート内の別の場所で宣言された AWS::EC2::LaunchTemplate
リソースの論理名を参照します。
JSON
"myASG" : { "Type" : "AWS::AutoScaling::AutoScalingGroup", "DependsOn": [ "snsTopicForAutoScalingGroup" ], "Properties" : { "VPCZoneIdentifier" : [ "
subnetIdAz1
", "subnetIdAz2
", "subnetIdAz3
" ], "LaunchTemplate" : { "LaunchTemplateId" : { "Ref" : "logicalName
" }, "Version" : { "Fn::GetAtt" : [ "logicalName
", "LatestVersionNumber" ] } }, "MaxSize" : "5", "MinSize" : "1", "NotificationConfigurations" : [ { "TopicARN" : { "Ref" : "snsTopicForAutoScalingGroup" }, "NotificationTypes" : [ "autoscaling:EC2_INSTANCE_LAUNCH", "autoscaling:EC2_INSTANCE_LAUNCH_ERROR", "autoscaling:EC2_INSTANCE_TERMINATE", "autoscaling:EC2_INSTANCE_TERMINATE_ERROR", "autoscaling:TEST_NOTIFICATION" ] } ] } }
YAML
myASG: Type: AWS::AutoScaling::AutoScalingGroup DependsOn: - snsTopicForAutoScalingGroup Properties: VPCZoneIdentifier: -
subnetIdAz1
-subnetIdAz2
-subnetIdAz3
LaunchTemplate: LaunchTemplateId: !ReflogicalName
Version: !GetAttlogicalName
.LatestVersionNumber MaxSize: '5' MinSize: '1' NotificationConfigurations: - TopicARN: !Ref snsTopicForAutoScalingGroup NotificationTypes: - autoscaling:EC2_INSTANCE_LAUNCH - autoscaling:EC2_INSTANCE_LAUNCH_ERROR - autoscaling:EC2_INSTANCE_TERMINATE - autoscaling:EC2_INSTANCE_TERMINATE_ERROR - autoscaling:TEST_NOTIFICATION
CreationPolicy
と UpdatePolicy
を使用する Auto Scaling グループを作成する
次の例では、AWS::AutoScaling::AutoScalingGroup
リソースに CreationPolicy 属性 と UpdatePolicy の属性を追加する方法を示しています。
サンプルの作成ポリシーは、グループの準備ができたときに AWS CloudFormation が Count
の数の成功シグナルを受信するまで、Auto Scaling グループが CREATE_COMPLETE
のステータスに到達するのを防ぎます。Auto Scaling グループの準備ができたことを通知するために、起動テンプレートのユーザーデータ (図に示されていません) に追加された cfn-signal ヘルパースクリプトが、インスタンス上で実行されます。インスタンスが指定された Timeout
範囲内でシグナルを送信しない場合では、CloudFormation はインスタンスが作成されていないと想定し、リソースの作成は失敗し、CloudFormation はスタックをロールバックします。
サンプルの更新ポリシーでは、AutoScalingRollingUpdate
プロパティを使用して、ローリング更新を実行するように CloudFormation に指示します。ローリング更新は、MaxBatchSize
に基づいて小規模なバッチ (この例ではインスタンスごと) で Auto Scaling グループを変更し、PauseTime
に基づいて更新のバッチ間の停止時間を変更します。MinInstancesInService
属性は、Auto Scaling が古いインスタンスを更新している間、CloudFormation グループ内で使用中となる必要があるインスタンスの最小数を指定します。
WaitOnResourceSignals
属性は true
に設定しています。CloudFormation が更新を続行するには、指定された PauseTime
内に新しいインスタンスからシグナルを受け取る必要があります。スタックの更新の進行中、EC2 Auto Scaling プロセス HealthCheck
、ReplaceUnhealthy
、AZRebalance
、AlarmNotification
、ScheduledActions
は一時停止されます。注: ローリング更新が適切に機能しなくなる可能性があるため、Launch
、Terminate
、または AddToLoadBalancer
(Auto Scaling グループが Elastic Load Balancing で使用されている場合) タイプのプロセスを一時停止しないでください。
Auto Scaling グループの VPCZoneIdentifier
プロパティは、3 つの異なるアベイラビリティーゾーンの既存のサブネットのリストを指定します。スタックを作成する前に、アカウントから該当するサブネット ID を指定する必要があります。LaunchTemplate
プロパティは、同じテンプレート内の別の場所で宣言された AWS::EC2::LaunchTemplate
リソースの論理名を参照します。
JSON
{ "Resources":{ "myASG":{ "CreationPolicy":{ "ResourceSignal":{ "Count":"3", "Timeout":"PT15M" } }, "UpdatePolicy":{ "AutoScalingRollingUpdate":{ "MinInstancesInService":"3", "MaxBatchSize":"1", "PauseTime":"PT12M5S", "WaitOnResourceSignals":"true", "SuspendProcesses":[ "HealthCheck", "ReplaceUnhealthy", "AZRebalance", "AlarmNotification", "ScheduledActions", "InstanceRefresh" ] } }, "Type":"AWS::AutoScaling::AutoScalingGroup", "Properties":{ "VPCZoneIdentifier":[ "
subnetIdAz1
", "subnetIdAz2
", "subnetIdAz3
" ], "LaunchTemplate":{ "LaunchTemplateId":{ "Ref":"logicalName
" }, "Version":{ "Fn::GetAtt":[ "logicalName
", "LatestVersionNumber" ] } }, "MaxSize":"5", "MinSize":"3" } } } }
YAML
--- Resources: myASG: CreationPolicy: ResourceSignal: Count: '3' Timeout: PT15M UpdatePolicy: AutoScalingRollingUpdate: MinInstancesInService: '3' MaxBatchSize: '1' PauseTime: PT12M5S WaitOnResourceSignals: true SuspendProcesses: - HealthCheck - ReplaceUnhealthy - AZRebalance - AlarmNotification - ScheduledActions - InstanceRefresh Type: AWS::AutoScaling::AutoScalingGroup Properties: VPCZoneIdentifier: -
subnetIdAz1
-subnetIdAz2
-subnetIdAz3
LaunchTemplate: LaunchTemplateId: !ReflogicalName
Version: !GetAttlogicalName
.LatestVersionNumber MaxSize: '5' MinSize: '3'
ステップスケーリングポリシーを作成する
この例に示すのは、ステップスケーリングポリシーを使用して Auto Scaling グループをスケールアウトする AWS::AutoScaling::ScalingPolicy
リソースです。AdjustmentType
プロパティには、ChangeInCapacity
が指定されています。この場合、ScalingAdjustment
は、追加 (ScalingAdjustment
が正数の場合) または削除 (負数の場合) するインスタンスの数を表します。この例では、ScalingAdjustment
は 1 です。したがって、アラームのしきい値に対して違反があると、ポリシーが実行されて、グループ内の EC2 インスタンスの数が 1 つ増やされます。
AWS::CloudWatch::Alarm
リソース CPUAlarmHigh
は、アラームが ALARM 状態 (AlarmActions
) になったときに実行するアクションとして、スケーリングポリシー ASGScalingPolicyHigh
を指定します。Dimensions
プロパティは、同じテンプレート内の別の場所で宣言された AWS::AutoScaling::AutoScalingGroup
リソースの論理名を参照します。
JSON
{ "Resources":{ "ASGScalingPolicyHigh":{ "Type":"AWS::AutoScaling::ScalingPolicy", "Properties":{ "AutoScalingGroupName":{ "Ref":"
logicalName
" }, "PolicyType":"StepScaling", "AdjustmentType":"ChangeInCapacity", "StepAdjustments":[ { "MetricIntervalLowerBound":0, "ScalingAdjustment":1 } ] } }, "CPUAlarmHigh":{ "Type":"AWS::CloudWatch::Alarm", "Properties":{ "EvaluationPeriods":"2", "Statistic":"Average", "Threshold":"90", "AlarmDescription":"Scale out if CPU > 90% for 2 minutes", "Period":"60", "AlarmActions":[ { "Ref":"ASGScalingPolicyHigh" } ], "Namespace":"AWS/EC2", "Dimensions":[ { "Name":"AutoScalingGroupName", "Value":{ "Ref":"logicalName
" } } ], "ComparisonOperator":"GreaterThanThreshold", "MetricName":"CPUUtilization" } } } }
YAML
--- Resources: ASGScalingPolicyHigh: Type: AWS::AutoScaling::ScalingPolicy Properties: AutoScalingGroupName: !Ref
logicalName
PolicyType: StepScaling AdjustmentType: ChangeInCapacity StepAdjustments: - MetricIntervalLowerBound: 0 ScalingAdjustment: 1 CPUAlarmHigh: Type: AWS::CloudWatch::Alarm Properties: EvaluationPeriods: 2 Statistic: Average Threshold: 90 AlarmDescription: 'Scale out if CPU > 90% for 2 minutes' Period: 60 AlarmActions: - !Ref ASGScalingPolicyHigh Namespace: AWS/EC2 Dimensions: - Name: AutoScalingGroupName Value: !ReflogicalName
ComparisonOperator: GreaterThanThreshold MetricName: CPUUtilization
以下も参照してください。
スケーリングポリシーのテンプレート例については、「AWS::AutoScaling::ScalingPolicy
リソース」の「例」セクションを参照してください。
混合インスタンスグループの例
属性ベースのインスタンスタイプの選択を使用して Auto Scaling グループを作成する
この例に示すのは、属性ベースのインスタンスタイプを使って混合インスタンスグループを起動するための情報を含む、AWS::AutoScaling::AutoScalingGroup
リソースです。VCpuCount
プロパティの最小値と最大値を、および MemoryMiB
プロパティの最小値を指定します。Auto Scaling グループで使用されるインスタンスタイプはいずれも、必要なインスタンス属性と一致している必要があります。
Auto Scaling グループの VPCZoneIdentifier
プロパティは、3 つの異なるアベイラビリティーゾーンの既存のサブネットのリストを指定します。スタックを作成する前に、アカウントから該当するサブネット ID を指定する必要があります。LaunchTemplate
プロパティは、同じテンプレート内の別の場所で宣言された AWS::EC2::LaunchTemplate
リソースの論理名を参照します。
JSON
{ "Resources":{ "myASG":{ "Type":"AWS::AutoScaling::AutoScalingGroup", "Properties":{ "VPCZoneIdentifier":[ "
subnetIdAz1
", "subnetIdAz2
", "subnetIdAz3
" ], "MixedInstancesPolicy":{ "LaunchTemplate":{ "LaunchTemplateSpecification":{ "LaunchTemplateId":{ "Ref":"logicalName
" }, "Version":{ "Fn::GetAtt":[ "logicalName
", "LatestVersionNumber" ] } }, "Overrides":[ { "InstanceRequirements":{ "VCpuCount":{ "Min":2
, "Max":4
}, "MemoryMiB":{ "Min":2048
} } } ] } }, "MaxSize":"5", "MinSize":"1" } } } }
YAML
--- Resources: myASG: Type: AWS::AutoScaling::AutoScalingGroup Properties: VPCZoneIdentifier: -
subnetIdAz1
-subnetIdAz2
-subnetIdAz3
MixedInstancesPolicy: LaunchTemplate: LaunchTemplateSpecification: LaunchTemplateId: !ReflogicalName
Version: !GetAttlogicalName
.LatestVersionNumber Overrides: - InstanceRequirements: VCpuCount: Min:2
Max:4
MemoryMiB: Min:2048
MaxSize: '5' MinSize: '1'
起動構成の例
「起動設定を作成する」
この例に示すのは、ImageId
、InstanceType
、SecurityGroups
プロパティの値を指定する、Auto Scaling グループの AWS::AutoScaling::LaunchConfiguration
リソースです。SecurityGroups
プロパティは、テンプレート内の他の場所で指定されている AWS::EC2::SecurityGroup
リソースの論理名と、myExistingEC2SecurityGroup
という既存の EC2 セキュリティグループの両方を指定します。
JSON
"mySimpleConfig" : { "Type" : "AWS::AutoScaling::LaunchConfiguration", "Properties" : { "ImageId" : "
ami-02354e95b3example
", "InstanceType" : "t3.micro
", "SecurityGroups" : [ { "Ref" : "logicalName
" }, "myExistingEC2SecurityGroup
" ] } }
YAML
mySimpleConfig: Type: AWS::AutoScaling::LaunchConfiguration Properties: ImageId:
ami-02354e95b3example
InstanceType:t3.micro
SecurityGroups: - !ReflogicalName
-myExistingEC2SecurityGroup
起動設定を使用して Auto Scaling グループを作成する
この例に示すのは、単一インスタンスに関連付けられた AWS::AutoScaling::AutoScalingGroup
リソースです。Auto Scaling グループの VPCZoneIdentifier
プロパティは、3 つの異なるアベイラビリティーゾーンの既存のサブネットのリストを指定します。スタックを作成する前に、アカウントから該当するサブネット ID を指定する必要があります。LaunchConfigurationName
プロパティは、論理名がテンプレート内で定義された mySimpleConfig
である、AWS::AutoScaling::LaunchConfiguration
リソースを参照します。
JSON
"myASG" : { "Type" : "AWS::AutoScaling::AutoScalingGroup", "Properties" : { "VPCZoneIdentifier" : [ "
subnetIdAz1
", "subnetIdAz2
", "subnetIdAz3
" ], "LaunchConfigurationName" : { "Ref" : "mySimpleConfig
" }, "MaxSize" : "1", "MinSize" : "1" } }
YAML
myASG: Type: AWS::AutoScaling::AutoScalingGroup Properties: VPCZoneIdentifier: -
subnetIdAz1
-subnetIdAz2
-subnetIdAz3
LaunchConfigurationName: !RefmySimpleConfig
MaxSize: '1' MinSize: '1'