Configure Amazon EC2 Auto Scaling resources with AWS CloudFormation
The following examples show different snippets to include in templates for use with Amazon EC2 Auto Scaling.
Create a single instance Auto Scaling group
This example shows an AWS::AutoScaling::AutoScalingGroup
resource with a single instance to help you get started. The VPCZoneIdentifier
property of the Auto Scaling group specifies a list of existing subnets in three different Availability Zones. You must specify the applicable subnet IDs from your account before you create your stack. The LaunchTemplate
property references an AWS::EC2::LaunchTemplate
resource with the logical name myLaunchTemplate
that is defined elsewhere in your template.
Note
For examples of launch templates, see Create launch templates with CloudFormation in the Amazon EC2 snippets section and the Examples section in the AWS::EC2::LaunchTemplate
resource.
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'
Create an Auto Scaling group with an attached load balancer
This example shows an AWS::AutoScaling::AutoScalingGroup
resource for load balancing over multiple servers. It specifies the logical names of AWS resources declared elsewhere in the same template.
-
The
VPCZoneIdentifier
property specifies the logical names of twoAWS::EC2::Subnet
resources where the Auto Scaling group's EC2 instances will be created:myPublicSubnet1
andmyPublicSubnet2
. -
The
LaunchTemplate
property specifies anAWS::EC2::LaunchTemplate
resource with the logical namemyLaunchTemplate
. -
The
TargetGroupARNs
property lists the target groups for an Application Load Balancer or Network Load Balancer used to route traffic to the Auto Scaling group. In this example, one target group is specified, anAWS::ElasticLoadBalancingV2::TargetGroup
resource with the logical namemyTargetGroup
.
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
See also
For a detailed example that creates an Auto Scaling group with a target tracking scaling policy based on the ALBRequestCountPerTarget
predefined metric for your Application Load Balancer, see the Examples section in the AWS::AutoScaling::ScalingPolicy
resource.
Create an Auto Scaling group with notifications
This example shows an AWS::AutoScaling::AutoScalingGroup
resource that sends Amazon SNS notifications when the specified events take place. The NotificationConfigurations
property specifies the SNS topic where AWS CloudFormation sends a notification and the events that will cause AWS CloudFormation to send notifications. When the events specified by NotificationTypes
occur, AWS CloudFormation will send a notification to the SNS topic specified by TopicARN
. When you launch the stack, AWS CloudFormation creates an AWS::SNS::Subscription
resource (snsTopicForAutoScalingGroup
) that's declared within the same template.
The VPCZoneIdentifier
property of the Auto Scaling group specifies a list of existing subnets in three different Availability Zones. You must specify the applicable subnet IDs from your account before you create your stack. The LaunchTemplate
property references the logical name of an AWS::EC2::LaunchTemplate
resource declared elsewhere in the same template.
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
Create an Auto Scaling group that uses a CreationPolicy
and an UpdatePolicy
The following example shows how to add CreationPolicy
and UpdatePolicy
attributes to an AWS::AutoScaling::AutoScalingGroup
resource.
The sample creation policy prevents the Auto Scaling group from reaching CREATE_COMPLETE
status until AWS CloudFormation receives Count
number of success signals when the group is ready. To signal that the Auto Scaling group is ready, a cfn-signal
helper script added to the launch template's user data (not shown) is run on the instances. If the instances don't send a signal within the specified Timeout
, CloudFormation assumes that the instances were not created, the resource creation fails, and CloudFormation rolls the stack back.
The sample update policy instructs CloudFormation to perform a rolling update using the AutoScalingRollingUpdate
property. The rolling update makes changes to the Auto Scaling group in small batches (for this example, instance by instance) based on the MaxBatchSize
and a pause time between batches of updates based on the PauseTime
. The MinInstancesInService
attribute specifies the minimum number of instances that must be in service within the Auto Scaling group while CloudFormation updates old instances.
The WaitOnResourceSignals
attribute is set to true
. CloudFormation must receive a signal from each new instance within the specified PauseTime
before continuing the update. While the stack update is in progress, the following EC2 Auto Scaling processes are suspended: HealthCheck
, ReplaceUnhealthy
, AZRebalance
, AlarmNotification
, and ScheduledActions
. Note: Don't suspend the Launch
, Terminate
, or AddToLoadBalancer
(if the Auto Scaling group is being used with Elastic Load Balancing) process types because doing so can prevent the rolling update from functioning properly.
The VPCZoneIdentifier
property of the Auto Scaling group specifies a list of existing subnets in three different Availability Zones. You must specify the applicable subnet IDs from your account before you create your stack. The LaunchTemplate
property references the logical name of an AWS::EC2::LaunchTemplate
resource declared elsewhere in the same template.
For more information about the CreationPolicy
and UpdatePolicy
attributes, see Resource attribute reference.
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'
Create a step scaling policy
This example shows an AWS::AutoScaling::ScalingPolicy
resource that scales out the Auto Scaling group using a step scaling policy. The AdjustmentType
property specifies ChangeInCapacity
, which means that the ScalingAdjustment
represents the number of instances to add (if ScalingAdjustment
is positive) or delete (if it is negative). In this example, ScalingAdjustment
is 1; therefore, the policy increments the number of EC2 instances in the group by 1 when the alarm threshold is breached.
The AWS::CloudWatch::Alarm
resource CPUAlarmHigh
specifies the scaling policy ASGScalingPolicyHigh
as the action to run when the alarm is in an ALARM state (AlarmActions
). The Dimensions
property references the logical name of an AWS::AutoScaling::AutoScalingGroup
resource declared elsewhere in the same template.
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
See also
For more example templates for scaling policies, see the Examples section in the AWS::AutoScaling::ScalingPolicy
resource.
Mixed instances group examples
Create an Auto Scaling group using attribute-based instance type selection
This example shows an AWS::AutoScaling::AutoScalingGroup
resource that contains the information to launch a mixed instances group using attribute-based instance type selection. You specify the minimum and maximum values for the VCpuCount
property and the minimum value for the MemoryMiB
property. Any instance types used by the Auto Scaling group must match your required instance attributes.
The VPCZoneIdentifier
property of the Auto Scaling group specifies a list of existing subnets in three different Availability Zones. You must specify the applicable subnet IDs from your account before you create your stack. The LaunchTemplate
property references the logical name of an AWS::EC2::LaunchTemplate
resource declared elsewhere in the same template.
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'
Launch configuration examples
Create a launch configuration
This example shows an AWS::AutoScaling::LaunchConfiguration
resource for an Auto Scaling group where you specify values for the ImageId
, InstanceType
, and SecurityGroups
properties. The SecurityGroups
property specifies both the logical name of an AWS::EC2::SecurityGroup
resource that's specified elsewhere in the template, and an existing EC2 security group named myExistingEC2SecurityGroup
.
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
Create an Auto Scaling group that uses a launch configuration
This example shows an AWS::AutoScaling::AutoScalingGroup
resource with a single instance. The VPCZoneIdentifier
property of the Auto Scaling group specifies a list of existing subnets in three different Availability Zones. You must specify the applicable subnet IDs from your account before you create your stack. The LaunchConfigurationName
property references an AWS::AutoScaling::LaunchConfiguration
resource with the logical name mySimpleConfig
that is defined in your template.
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'