本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
自动扩缩模板代码段
以下示例演示了要包含在模板中的不同代码段,以便与 Amazon EC2 Auto Scaling 或 Application Auto Scaling 一起使用。
Amazon EC2 Auto Scaling 使您能够通过扩展策略或计划扩展自动伸缩 Amazon EC2 实例。自动扩缩组是 Amazon EC2 实例的集合,这些实例支持自动伸缩和实例集管理功能,例如运行状况检查以及与 Elastic Load Balancing 的集成。
Application Auto Scaling 通过扩展策略或计划扩展,可以自动扩展 Amazon EC2 以外的其他资源。
目录
声明包含用户数据和 IAM 角色的启动模板
此代码显示了包含 AutoS AWS::EC2::LaunchTemplatecaling 组的实例配置信息的 Auto Scaling 组的实例配置信息。您可以为 ImageId
、InstanceType
、SecurityGroups
、UserData
和 TagSpecifications
属性指定值。SecurityGroups
属性指定了现有的 EC2 安全组和新的安全组。Ref 函数获取在堆栈模板其他地方myNewEC2SecurityGroup
声明的AWS::EC2::SecurityGroup资源的 ID。
启动模板包括自定义用户数据的部分。在本节中,您可以传入实例启动时运行的配置任务和脚本。在此示例中,用户数据安装 Amazon Systems Manager 代理并启动该代理。
启动模板还包含一个 IAM 角色,该角色允许在自动扩缩组中实例上运行的应用程序代表您执行操作。此示例显示了启动模板的AWS::IAM::Role资源,显示了使用IamInstanceProfile
属性指定 IAM 角色。Ref 函数获取AWS::IAM::InstanceProfile资源的名称myInstanceProfile
。要配置 IAM 角色的权限,请指定 ManagedPolicyArns
属性的值。
JSON
{ "Resources":{ "myLaunchTemplate":{ "Type":"AWS::EC2::LaunchTemplate", "Properties":{ "LaunchTemplateName":{ "Fn::Sub": "${AWS::StackName}-launch-template" }, "LaunchTemplateData":{ "ImageId":"
ami-02354e95b3example
", "InstanceType":"t3.micro
", "IamInstanceProfile":{ "Name":{ "Ref":"myInstanceProfile" } }, "SecurityGroupIds":[ { "Ref":"myNewEC2SecurityGroup
" }, "sg-083cd3bfb8example
" ], "UserData":{ "Fn::Base64":{ "Fn::Join": [ "", [ "#!/bin/bash\n
", "cd /tmp\n
", "sudo yum install -y https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/linux_amd64/amazon-ssm-agent.rpm\n
", "sudo systemctl enable amazon-ssm-agent\n
", "sudo systemctl start amazon-ssm-agent\n
" ] ] } }, "TagSpecifications":[ { "ResourceType":"instance", "Tags":[ { "Key":"environment
", "Value":"development
" } ] }, { "ResourceType":"volume", "Tags":[ { "Key":"environment
", "Value":"development
" } ] } ] } } }, "myInstanceRole":{ "Type":"AWS::IAM::Role", "Properties":{ "RoleName":"InstanceRole", "AssumeRolePolicyDocument":{ "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Principal":{ "Service":[ "ec2.amazonaws.com" ] }, "Action":[ "sts:AssumeRole" ] } ] }, "ManagedPolicyArns":[ "arn:aws:iam::aws:policy/myCustomerManagedPolicy
" ] } }, "myInstanceProfile":{ "Type":"AWS::IAM::InstanceProfile", "Properties":{ "Path":"/", "Roles":[ { "Ref":"myInstanceRole" } ] } } } }
YAML
--- Resources: myLaunchTemplate: Type: AWS::EC2::LaunchTemplate Properties: LaunchTemplateName: !Sub ${AWS::StackName}-launch-template LaunchTemplateData: ImageId:
ami-02354e95b3example
InstanceType:t3.micro
IamInstanceProfile: Name: !Ref myInstanceProfile SecurityGroupIds: - !RefmyNewEC2SecurityGroup
-sg-083cd3bfb8example
UserData: Fn::Base64:!Sub |#!/bin/bash cd /tmp sudo yum install -y https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/linux_amd64/amazon-ssm-agent.rpm sudo systemctl enable amazon-ssm-agent sudo systemctl start amazon-ssm-agent
TagSpecifications: - ResourceType: instance Tags: - Key:environment
Value:development
- ResourceType: volume Tags: - Key:environment
Value:development
myInstanceRole: Type: AWS::IAM::Role Properties: RoleName: InstanceRole AssumeRolePolicyDocument: Version: '2012-10-17' Statement: - Effect: 'Allow' Principal: Service: - 'ec2.amazonaws.com' Action: - 'sts:AssumeRole' ManagedPolicyArns: - 'arn:aws:iam::aws:policy/myCustomerManagedPolicy
' myInstanceProfile: Type: AWS::IAM::InstanceProfile Properties: Path: '/' Roles: - !Ref myInstanceRole
另请参阅
有关启动模板的更多示例,请参阅 AWS::EC2::LaunchTemplate
资源中的示例的部分和 AWS::AutoScaling::AutoScalingGroup
资源中的示例部分。
声明单实例自动扩缩组
此示例显示了具有单个实例的AWS::AutoScaling::AutoScaling组资源,以帮助您开始操作。自动扩缩组的 VPCZoneIdentifier
属性指定三个不同可用区中的一系列现有子网。在创建堆栈之前,必须先从您的账户指定适用的子网 ID。LaunchTemplate
属性引用具有在模板中的其他位置定义的逻辑名称myLaunchTemplate
的逻辑名称的AWS::EC2::LaunchTemplate资源。
JSON
"myASG" : { "Type" : "AWS::AutoScaling::AutoScalingGroup", "Properties" : { "VPCZoneIdentifier" : [ "
subnetIdAz1
", "subnetIdAz2
", "subnetIdAz3
" ], "LaunchTemplate" : { "LaunchTemplateId" : { "Ref" : "myLaunchTemplate
" }, "Version" : { "Fn::GetAtt" : [ "myLaunchTemplate
", "LatestVersionNumber" ] } }, "MaxSize" : "1", "MinSize" : "0", "DesiredCapacity" : "1" } }
YAML
myASG: Type: AWS::AutoScaling::AutoScalingGroup Properties: VPCZoneIdentifier: -
subnetIdAz1
-subnetIdAz2
-subnetIdAz3
LaunchTemplate: LaunchTemplateId: !RefmyLaunchTemplate
Version: !GetAttmyLaunchTemplate
.LatestVersionNumber MaxSize: '1' MinSize: '0' DesiredCapacity: '1'
声明具有附加负载均衡器的自动扩缩组
此示例显示了用于在多个服务器之间实现负载均衡衡的AWS::AutoScaling::AutoScaling组资源。它指定在同一模板中的其他位置声明的 Amazon 资源的逻辑名称。
-
VPCZoneIdentifier
属性指定将在其中创建 AAuto Scaling 组的 EC2 实例的两个AWS::EC2::Subnet资源的逻辑名称:myPublicSubnet1
和myPublicSubnet2
。 -
该
LaunchTemplate
属性使用逻辑名称指定AWS::EC2::LaunchTemplate资源myLaunchTemplate
。 -
TargetGroupARNs
属性列出用于将流量路由到自动扩缩组的应用程序负载均衡器或网络负载均衡器的目标组。在此示例中,指定了一个目标组,即具有逻辑名称的AWS::ElasticLoadBalancingV2::TargetGroup资源myTargetGroup
。
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
另请参阅
有关根据 ALBRequestCountPerTarget
预定义指标为应用程序负载均衡器创建具有目标跟踪扩展策略的自动扩缩组的详细示例,请参阅 AWS::AutoScaling::ScalingPolicy
资源中的示例部分。
声明具有通知的自动扩缩组
此示例显示了在指定事件发生时发送 Amazon SNS 通知的AWS::AutoScaling::AutoScaling组资源。NotificationConfigurations
属性指定 Amazon CloudFormation 在其中发送通知的 SNS 主题和将导致 Amazon CloudFormation 发送通知的事件。当 NotificationTypes
指定的事件发生时,Amazon CloudFormation 会发送一条通知至 TopicARN
指定的 SNS 主题中。启动堆栈时,Amazon CloudFormation会创建AWS::SNS::Subscription在同一模板中声明的 reations (snsTopicForAutoScalingGroup
)。
自动扩缩组的 VPCZoneIdentifier
属性指定三个不同可用区中的一系列现有子网。在创建堆栈之前,必须先从您的账户指定适用的子网 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
使用 CreationAuto Scaling 组 CreationPolicy 和 UpdatePolicy
以下示例显示如何向AWS::AutoScaling::AutoScaling组资源添加CreationPolicy 属性和UpdatePolicy属性。
示例创建策略会阻止自动扩缩组达到 CREATE_COMPLETE
状态,直到 Amazon CloudFormation 在该组准备就绪后收到 Count
个成功信号。要发出自动扩缩组已就绪的信号,在实例上运行添加到启动模板用户数据(未显示)的 cfn-signal 帮助程序脚本。如果实例未在指定Timeout
实例内发送信号,则 CloudFormation 假设未创建实例,资源创建失败并回 CloudFormation 滚堆栈。
示例更新策略指示 CloudFormation 使用使用使用AutoScalingRollingUpdate
属性执行滚动更新。滚动更新根据 MaxBatchSize
和基于 PauseTime
的更新批次之间的暂停时间以小批量的方式更改自动扩缩组(在本示例中,为逐个实例更改)。MinInstancesInService
属性指定在 CloudFormation更新旧实例时,AAuto Scaling 组内必须处于服务状态的实例的最小数量。
WaitOnResourceSignals
属性设置为 true
。在继续更新之前, CloudFormation 必须在指定的 PauseTime
内收到来自每个新实例的信号。在执行堆栈更新时,以下 EC2 Auto Scaling 进程会暂停:HealthCheck
、ReplaceUnhealthy
、AZRebalance
、AlarmNotification
和 ScheduledActions
。注意:不要暂停 Launch
、Terminate
或 AddToLoadBalancer
(如果自动扩缩组正在与 Elastic Load Balancing 一起使用)进程类型,因为这样做会使滚动更新无法正常工作。
自动扩缩组的 VPCZoneIdentifier
属性指定三个不同可用区中的一系列现有子网。在创建堆栈之前,必须先从您的账户指定适用的子网 ID。LaunchTemplate
属性引用在同一模板中的其他位置声明的的的AWS::EC2::LaunchTemplate资源的逻辑名称。
JSON
{ "Resources":{ "myASG":{ "CreationPolicy":{ "ResourceSignal":{ "Count":"3", "Timeout":"PT15M" } }, "UpdatePolicy":{ "AutoScalingRollingUpdate":{ "MinInstancesInService":"1", "MaxBatchSize":"1", "PauseTime":"PT12M5S", "WaitOnResourceSignals":"true", "SuspendProcesses":[ "HealthCheck", "ReplaceUnhealthy", "AZRebalance", "AlarmNotification", "ScheduledActions" ] } }, "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: '1' MaxBatchSize: '1' PauseTime: PT12M5S WaitOnResourceSignals: true SuspendProcesses: - HealthCheck - ReplaceUnhealthy - AZRebalance - AlarmNotification - ScheduledActions Type: AWS::AutoScaling::AutoScalingGroup Properties: VPCZoneIdentifier: -
subnetIdAz1
-subnetIdAz2
-subnetIdAz3
LaunchTemplate: LaunchTemplateId: !ReflogicalName
Version: !GetAttlogicalName
.LatestVersionNumber MaxSize: '5' MinSize: '3'
使用具有自动扩缩策略扩展策略 CloudWatch
此示例显示了AWS::AutoScaling::ScalingPolicy使用分步扩展策略横向扩展自动扩缩策略。AdjustmentType
属性指定 ChangeInCapacity
,这表示 ScalingAdjustment
代表待添加(如果 ScalingAdjustment
为正值)或待删除(如果它为负值)实例的数量。在此示例中,ScalingAdjustment
为 1;因此,当超出警报阈值时,策略会将组中 EC2 实例的数量增加 1。
AWS::CloudWatch::Alarm资源CPUAlarmHigh
指定自动扩缩策略ASGScalingPolicyHigh
,当警报处于 Creation状态时要运行的操作(AlarmActions
)。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
资源中的示例部分。
混合实例组示例
声明使用混合实例策略和基于属性的实例类型选择的自动扩缩组
此示例显示了AWS::AutoScaling::AutoScaling使用基于属性的实例类型选择启动混合实例组的 Group 资源。您指定了 VCpuCount
属性的最小值和最大值,以及 MemoryMiB
属性的最小值。自动扩缩组使用的所有实例类型都必须与您所需实例的属性匹配。
自动扩缩组的 VPCZoneIdentifier
属性指定三个不同可用区中的一系列现有子网。在创建堆栈之前,必须先从您的账户指定适用的子网 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", "DesiredCapacity":"3" } } } }
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' DesiredCapacity: '3'
启动配置示例
声明启动配置
此示例显示了 Auto Scaling 组的AWS::AutoScaling::LaunchConfiguration资源,您可以在其中指定ImageId
InstanceType
、和SecurityGroups
属性的值。SecurityGroups
属性指定在模板中其他位置指定的 EC AWS::EC2::SecurityGroup2 安全组的逻辑名称,以及名为的现有 EC2 安全组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
声明使用启动配置的自动扩缩组
此示例显示了具有单个实例的AWS::AutoScaling::AutoScaling组资源。自动扩缩组的 VPCZoneIdentifier
属性指定三个不同可用区中的一系列现有子网。在创建堆栈之前,必须先从您的账户指定适用的子网 ID。LaunchConfigurationName
属性引用具有在模板中定义的逻辑名称mySimpleConfig
的AWS::AutoScaling::LaunchConfiguration资源。
JSON
"myASG" : { "Type" : "AWS::AutoScaling::AutoScalingGroup", "Properties" : { "VPCZoneIdentifier" : [ "
subnetIdAz1
", "subnetIdAz2
", "subnetIdAz3
" ], "LaunchConfigurationName" : { "Ref" : "mySimpleConfig
" }, "MaxSize" : "1", "MinSize" : "0", "DesiredCapacity" : "1" } }
YAML
myASG: Type: AWS::AutoScaling::AutoScalingGroup Properties: VPCZoneIdentifier: -
subnetIdAz1
-subnetIdAz2
-subnetIdAz3
LaunchConfigurationName: !RefmySimpleConfig
MaxSize: '1' MinSize: '0' DesiredCapacity: '1'
Application Auto Scaling 模板示例
本节为不同 Amazon 资源的 Application Auto Scaling 扩展策略和计划操作提供了 Amazon CloudFormation 模板示例。
目录
重要
当模板中包含 ApplicationAuto Scaling 代码说明使用使用在使用模板创建的特定可扩展资源的依赖DependsOn关系。这将覆盖默认并行度,并指示 Amazon CloudFormation 按指定的顺序对资源进行操作。否则,可能会在完全设置资源之前应用扩展配置。
使用:扩展 AppStream 策略
此代码说明如何创建策略并将其应用于使用于使用于使用于使用于使用于使用于使用于使用于使用于使用于使用于使用于使用于AWS::ApplicationAutoScaling::ScalingPolicy使用于使用 AWS::AppStream::Fleet AWS::ApplicationAutoScaling::ScalableTarget资源声明具有应用于此策略的可扩展目标。Application Auto Scaling 可以扩展队列实例数,最少为 1 个实例,最多为 20 个实例。该策略将实例集的平均容量利用率保持在 75%,横向扩展和横向缩减冷却时间为 300 秒(5 分钟)。
此示例利用 Fn::Join 和 Ref 内部函数,使用在同一模板中指定的 AWS::AppStream::Fleet
资源的逻辑名称来构建 ResourceId
属性。
JSON
{ "Resources" : { "ScalableTarget" : { "Type" : "AWS::ApplicationAutoScaling::ScalableTarget", "Properties" : { "MaxCapacity" : 20, "MinCapacity" : 1, "RoleARN" : { "Fn::Sub" : "arn:aws:iam::${AWS::AccountId}:role/aws-service-role/appstream.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_AppStreamFleet" }, "ServiceNamespace" : "appstream", "ScalableDimension" : "appstream:fleet:DesiredCapacity", "ResourceId" : { "Fn::Join" : [ "/", [ "fleet", { "Ref" : "
logicalName
" } ] ] } } }, "ScalingPolicyAppStreamFleet" : { "Type" : "AWS::ApplicationAutoScaling::ScalingPolicy", "Properties" : { "PolicyName" : { "Fn::Sub" : "${AWS::StackName}-target-tracking-cpu75" }, "PolicyType" : "TargetTrackingScaling", "ServiceNamespace" : "appstream", "ScalableDimension" : "appstream:fleet:DesiredCapacity", "ResourceId" : { "Fn::Join" : [ "/", [ "fleet", { "Ref" : "logicalName
" } ] ] }, "TargetTrackingScalingPolicyConfiguration" : { "TargetValue" : 75, "PredefinedMetricSpecification" : { "PredefinedMetricType" : "AppStreamAverageCapacityUtilization" }, "ScaleInCooldown" : 300, "ScaleOutCooldown" : 300 } } } } }
YAML
--- Resources: ScalableTarget: Type: AWS::ApplicationAutoScaling::ScalableTarget Properties: MaxCapacity: 20 MinCapacity: 1 RoleARN: Fn::Sub: 'arn:aws:iam::${AWS::AccountId}:role/aws-service-role/appstream.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_AppStreamFleet' ServiceNamespace: appstream ScalableDimension: appstream:fleet:DesiredCapacity ResourceId: !Join - / - - fleet - !Ref
logicalName
ScalingPolicyAppStreamFleet: Type: AWS::ApplicationAutoScaling::ScalingPolicy Properties: PolicyName: !Sub ${AWS::StackName}-target-tracking-cpu75 PolicyType: TargetTrackingScaling ServiceNamespace: appstream ScalableDimension: appstream:fleet:DesiredCapacity ResourceId: !Join - / - - fleet - !ReflogicalName
TargetTrackingScalingPolicyConfiguration: TargetValue: 75 PredefinedMetricSpecification: PredefinedMetricType: AppStreamAverageCapacityUtilization ScaleInCooldown: 300 ScaleOutCooldown: 300
声明 Aurora 数据库集群的扩展策略
在此代码段中,您将注册一个 AWS::RDS::DBCluster 资源。AWS::ApplicationAutoScaling::ScalableTarget资源指示应动态扩展数据库集群,使其具有一到八个 Aurora 副本。您还可以使用目标跟踪扩展策略应用于使用于使用于使用于使用于使用于使用于使用于使用于使用于使用AWS::ApplicationAutoScaling::ScalingPolicy于使用于
在此配置中,RDSReaderAverageCPUUtilization
预定义指标用于根据 Aurora 数据库集群中所有 Aurora 副本上 40% 的平均 CPU 利用率来调整该 Aurora 数据库集群。该配置将缩减冷却时间指定为 10 分钟,并将扩展冷却时间指定为 5 分钟。
此示例利用 Fn::Sub 内部函数,使用在同一模板中指定的 AWS::RDS::DBCluster
资源的逻辑名称来构建 ResourceId
属性。
JSON
{ "Resources" : { "ScalableTarget" : { "Type" : "AWS::ApplicationAutoScaling::ScalableTarget", "Properties" : { "MaxCapacity" : 8, "MinCapacity" : 1, "RoleARN" : { "Fn::Sub" : "arn:aws:iam::${AWS::AccountId}:role/aws-service-role/rds.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_RDSCluster" }, "ServiceNamespace" : "rds", "ScalableDimension" : "rds:cluster:ReadReplicaCount", "ResourceId" : { "Fn::Sub" : "cluster:${
logicalName
}" } } }, "ScalingPolicyDBCluster" : { "Type" : "AWS::ApplicationAutoScaling::ScalingPolicy", "Properties" : { "PolicyName" : { "Fn::Sub" : "${AWS::StackName}-target-tracking-cpu40" }, "PolicyType" : "TargetTrackingScaling", "ServiceNamespace" : "rds", "ScalableDimension" : "rds:cluster:ReadReplicaCount", "ResourceId" : { "Fn::Sub" : "cluster:${logicalName
}" }, "TargetTrackingScalingPolicyConfiguration" : { "TargetValue" : 40, "PredefinedMetricSpecification" : { "PredefinedMetricType" : "RDSReaderAverageCPUUtilization" }, "ScaleInCooldown" : 600, "ScaleOutCooldown" : 300 } } } } }
YAML
--- Resources: ScalableTarget: Type: AWS::ApplicationAutoScaling::ScalableTarget Properties: MaxCapacity: 8 MinCapacity: 1 RoleARN: Fn::Sub: 'arn:aws:iam::${AWS::AccountId}:role/aws-service-role/rds.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_RDSCluster' ServiceNamespace: rds ScalableDimension: rds:cluster:ReadReplicaCount ResourceId: !Sub cluster:${
logicalName
} ScalingPolicyDBCluster: Type: AWS::ApplicationAutoScaling::ScalingPolicy Properties: PolicyName: !Sub ${AWS::StackName}-target-tracking-cpu40 PolicyType: TargetTrackingScaling ServiceNamespace: rds ScalableDimension: rds:cluster:ReadReplicaCount ResourceId: !Sub cluster:${logicalName
} TargetTrackingScalingPolicyConfiguration: TargetValue: 40 PredefinedMetricSpecification: PredefinedMetricType: RDSReaderAverageCPUUtilization ScaleInCooldown: 600 ScaleOutCooldown: 300
声明 DynamoDB 表的扩展策略
此代码说明如何使用策略创建策略并将其应用于使用于使用于使用于使用于使用于使用于使用于使用于使用于使用于使用于使用于使用于使用于使用于使用于AWS::ApplicationAutoScaling::ScalingPolicy使用于使用TargetTrackingScaling
AWS::DynamoDB::Table AWS::ApplicationAutoScaling::ScalableTarget资源声明具有应用此策略的可扩展目标,其最小写入容量单位为 5,最大写入容量单位为 15。扩展策略会扩展表的写入容量吞吐量,以 DynamoDBWriteCapacityUtilization
预定义指标将目标利用率维持在 50%。
此示例利用 Fn::Join 和 Ref 内部函数,使用在同一模板中指定的 AWS::DynamoDB::Table
资源的逻辑名称来构建 ResourceId
属性。
注意
有关如何为 DynamoDB 资源创建 Amazon CloudFormation 模板的更多信息,请参阅 Amazon 数据库博客上的博客文章如何使用 Amazon CloudFormation 配置 Amazon DynamoDB 表和索引的自动伸缩
JSON
{ "Resources" : { "WriteCapacityScalableTarget" : { "Type" : "AWS::ApplicationAutoScaling::ScalableTarget", "Properties" : { "MaxCapacity" : 15, "MinCapacity" : 5, "RoleARN" : { "Fn::Sub" : "arn:aws:iam::${AWS::AccountId}:role/aws-service-role/dynamodb.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_DynamoDBTable" }, "ServiceNamespace" : "dynamodb", "ScalableDimension" : "dynamodb:table:WriteCapacityUnits", "ResourceId" : { "Fn::Join" : [ "/", [ "table", { "Ref" : "
logicalName
" } ] ] } } }, "WriteScalingPolicy" : { "Type" : "AWS::ApplicationAutoScaling::ScalingPolicy", "Properties" : { "PolicyName" : "WriteScalingPolicy", "PolicyType" : "TargetTrackingScaling", "ScalingTargetId" : { "Ref" : "WriteCapacityScalableTarget" }, "TargetTrackingScalingPolicyConfiguration" : { "TargetValue" : 50.0, "ScaleInCooldown" : 60, "ScaleOutCooldown" : 60, "PredefinedMetricSpecification" : { "PredefinedMetricType" : "DynamoDBWriteCapacityUtilization" } } } } } }
YAML
--- Resources: WriteCapacityScalableTarget: Type: AWS::ApplicationAutoScaling::ScalableTarget Properties: MaxCapacity: 15 MinCapacity: 5 RoleARN: Fn::Sub: 'arn:aws:iam::${AWS::AccountId}:role/aws-service-role/dynamodb.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_DynamoDBTable' ServiceNamespace: dynamodb ScalableDimension: dynamodb:table:WriteCapacityUnits ResourceId: !Join - / - - table - !Ref
logicalName
WriteScalingPolicy: Type: AWS::ApplicationAutoScaling::ScalingPolicy Properties: PolicyName: WriteScalingPolicy PolicyType: TargetTrackingScaling ScalingTargetId: !Ref WriteCapacityScalableTarget TargetTrackingScalingPolicyConfiguration: TargetValue: 50.0 ScaleInCooldown: 60 ScaleOutCooldown: 60 PredefinedMetricSpecification: PredefinedMetricType: DynamoDBWriteCapacityUtilization
声明 Amazon ECS 服务的扩展策略(指标:平均 CPU 和内存)
此代码说明如何创建策略并将其应用于使用于使用于使用于使用于使用于使用于使用于使用于使用于使用于使用于使用于使用于AWS::ApplicationAutoScaling::ScalingPolicy使用于使用 AWS::ECS::Service AWS::ApplicationAutoScaling::ScalableTarget资源声明具有应用于此策略的可扩展目标。Application Auto Scaling 可扩展任务的数量,最少 1 个任务,最多 6 个任务。
此示例创建两个 TargetTrackingScaling
策略类型的扩展策略。这些策略用于根据服务的平均 CPU 和内存使用率扩展 ECS 服务。此示例利用 Fn::Join 和 Ref 内部函数,使用在同一模板中指定的 AWS::ECS::Cluster
(myContainerCluster
)和 AWS::ECS::Service
(myService
)资源的逻辑名称来构建 ResourceId
属性。
JSON
{ "Resources" : { "ECSScalableTarget" : { "Type" : "AWS::ApplicationAutoScaling::ScalableTarget", "Properties" : { "MaxCapacity" : "6", "MinCapacity" : "1", "RoleARN" : { "Fn::Sub" : "arn:aws:iam::${AWS::AccountId}:role/aws-service-role/ecs.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_ECSService" }, "ServiceNamespace" : "ecs", "ScalableDimension" : "ecs:service:DesiredCount", "ResourceId" : { "Fn::Join" : [ "/", [ "service", { "Ref" : "
myContainerCluster
" }, { "Fn::GetAtt" : [ "myService
", "Name" ] } ] ] } } }, "ServiceScalingPolicyCPU" : { "Type" : "AWS::ApplicationAutoScaling::ScalingPolicy", "Properties" : { "PolicyName" : { "Fn::Sub" : "${AWS::StackName}-target-tracking-cpu70" }, "PolicyType" : "TargetTrackingScaling", "ScalingTargetId" : { "Ref" : "ECSScalableTarget" }, "TargetTrackingScalingPolicyConfiguration" : { "TargetValue" : 70.0, "ScaleInCooldown" : 180, "ScaleOutCooldown" : 60, "PredefinedMetricSpecification" : { "PredefinedMetricType" : "ECSServiceAverageCPUUtilization" } } } }, "ServiceScalingPolicyMem" : { "Type" : "AWS::ApplicationAutoScaling::ScalingPolicy", "Properties" : { "PolicyName" : { "Fn::Sub" : "${AWS::StackName}-target-tracking-mem90" }, "PolicyType" : "TargetTrackingScaling", "ScalingTargetId" : { "Ref" : "ECSScalableTarget" }, "TargetTrackingScalingPolicyConfiguration" : { "TargetValue" : 90.0, "ScaleInCooldown" : 180, "ScaleOutCooldown" : 60, "PredefinedMetricSpecification" : { "PredefinedMetricType" : "ECSServiceAverageMemoryUtilization" } } } } } }
YAML
--- Resources: ECSScalableTarget: Type: AWS::ApplicationAutoScaling::ScalableTarget Properties: MaxCapacity: 6 MinCapacity: 1 RoleARN: Fn::Sub: 'arn:aws:iam::${AWS::AccountId}:role/aws-service-role/ecs.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_ECSService' ServiceNamespace: ecs ScalableDimension: 'ecs:service:DesiredCount' ResourceId: !Join - / - - service - !Ref
myContainerCluster
- !GetAttmyService
.Name ServiceScalingPolicyCPU: Type: AWS::ApplicationAutoScaling::ScalingPolicy Properties: PolicyName: !Sub ${AWS::StackName}-target-tracking-cpu70 PolicyType: TargetTrackingScaling ScalingTargetId: !Ref ECSScalableTarget TargetTrackingScalingPolicyConfiguration: TargetValue: 70.0 ScaleInCooldown: 180 ScaleOutCooldown: 60 PredefinedMetricSpecification: PredefinedMetricType: ECSServiceAverageCPUUtilization ServiceScalingPolicyMem: Type: AWS::ApplicationAutoScaling::ScalingPolicy Properties: PolicyName: !Sub ${AWS::StackName}-target-tracking-mem90 PolicyType: TargetTrackingScaling ScalingTargetId: !Ref ECSScalableTarget TargetTrackingScalingPolicyConfiguration: TargetValue: 90.0 ScaleInCooldown: 180 ScaleOutCooldown: 60 PredefinedMetricSpecification: PredefinedMetricType: ECSServiceAverageMemoryUtilization
声明 Amazon ECS 服务的扩展策略(指标:每个目标的平均请求数)
以下示例将具有 ALBRequestCountPerTarget
预定义指标的目标跟踪扩展策略应用到 ECS 服务。该策略用于在每个目标的请求计数(每分钟)超过目标值时向 ECS 服务添加容量。由于 DisableScaleIn
的值设置为 true
,因此,目标跟踪策略不会从可扩展目标中删除容量。
此示例利用 Fn: Join 和 Fn::::: Join 和 Fn::::::GetAtt 内部函数,使用在同一模板中指定的AWS::ElasticLoadBalancingV2::LoadBalancer
AWS::ElasticLoadBalancingV2::TargetGroup
(myLoadBalancer
myTargetGroup
) 和 () 资源的逻辑名称来构建ResourceLabel
属性。
可扩展目标的 MaxCapacity
和 MinCapacity
属性以及扩展策略的 TargetValue
属性引用您在创建或更新堆栈时传递给模板的参数值。
JSON
{ "Resources" : { "ECSScalableTarget" : { "Type" : "AWS::ApplicationAutoScaling::ScalableTarget", "Properties" : { "MaxCapacity" : { "Ref" : "MaxCount" }, "MinCapacity" : { "Ref" : "MinCount" }, "RoleARN" : { "Fn::Sub" : "arn:aws:iam::${AWS::AccountId}:role/aws-service-role/ecs.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_ECSService" }, "ServiceNamespace" : "ecs", "ScalableDimension" : "ecs:service:DesiredCount", "ResourceId" : { "Fn::Join" : [ "/", [ "service", { "Ref" : "
myContainerCluster
" }, { "Fn::GetAtt" : [ "myService
", "Name" ] } ] ] } } }, "ServiceScalingPolicyALB" : { "Type" : "AWS::ApplicationAutoScaling::ScalingPolicy", "Properties" : { "PolicyName" : "alb-requests-per-target-per-minute", "PolicyType" : "TargetTrackingScaling", "ScalingTargetId" : { "Ref" : "ECSScalableTarget" }, "TargetTrackingScalingPolicyConfiguration" : { "TargetValue" : { "Ref" : "ALBPolicyTargetValue" }, "ScaleInCooldown" : 180, "ScaleOutCooldown" : 30, "DisableScaleIn" : true, "PredefinedMetricSpecification" : { "PredefinedMetricType" : "ALBRequestCountPerTarget", "ResourceLabel" : { "Fn::Join" : [ "/", [ { "Fn::GetAtt" : [ "myLoadBalancer
", "LoadBalancerFullName" ] }, { "Fn::GetAtt" : [ "myTargetGroup
", "TargetGroupFullName" ] } ] ] } } } } } } }
YAML
--- Resources: ECSScalableTarget: Type: AWS::ApplicationAutoScaling::ScalableTarget Properties: MaxCapacity: !Ref MaxCount MinCapacity: !Ref MinCount RoleARN: Fn::Sub: 'arn:aws:iam::${AWS::AccountId}:role/aws-service-role/ecs.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_ECSService' ServiceNamespace: ecs ScalableDimension: 'ecs:service:DesiredCount' ResourceId: !Join - / - - service - !Ref
myContainerCluster
- !GetAttmyService
.Name ServiceScalingPolicyALB: Type: AWS::ApplicationAutoScaling::ScalingPolicy Properties: PolicyName: alb-requests-per-target-per-minute PolicyType: TargetTrackingScaling ScalingTargetId: !Ref ECSScalableTarget TargetTrackingScalingPolicyConfiguration: TargetValue: !Ref ALBPolicyTargetValue ScaleInCooldown: 180 ScaleOutCooldown: 30 DisableScaleIn: true PredefinedMetricSpecification: PredefinedMetricType: ALBRequestCountPerTarget ResourceLabel: !Join - '/' - - !GetAttmyLoadBalancer
.LoadBalancerFullName - !GetAttmyTargetGroup
.TargetGroupFullName
使用 Lambda 函数的 cron 表达式声明计划操作
此代码说明使用使用于使用于使用于使用于使用于使用于使用于使用于使用于使用于使用于使用于使用于BLUE
使用于使用于使用于使用于AWS::ApplicationAutoScaling::ScalableTarget使用于使用 AWS::Lambda::Alias 它还使用 cron 表达式创建具有重复计划的计划操作。定期计划的时区为 UTC。
它在 RoleARN
属性中使用 Fn::Join 和 Ref 内部函数以指定服务相关角色的 ARN。此示例利用 Fn::Sub 内部函数,使用在同一模板中指定的 AWS::Lambda::Function
或 AWS::Serverless::Function
资源的逻辑名称来构建 ResourceId
属性。
注意
您无法在指向未发布版本 ($LATEST) 的别名上分配预置并发。
有关如何为 Lambda 资源创建 Amazon CloudFormation 模板的更多信息,请参阅 Amazon 计算博客上的博客文章计划 Amazon Lambda 预置并发性以实现重复使用峰值
JSON
{ "ScalableTarget" : { "Type" : "AWS::ApplicationAutoScaling::ScalableTarget", "Properties" : { "MaxCapacity" : 250, "MinCapacity" : 0, "RoleARN" : { "Fn::Join" : [ ":", [ "arn:aws:iam:", { "Ref" : "AWS::AccountId" }, "role/aws-service-role/lambda.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_LambdaConcurrency" ] ] }, "ServiceNamespace" : "lambda", "ScalableDimension" : "lambda:function:ProvisionedConcurrency", "ResourceId" : { "Fn::Sub" : "function:${
logicalName
}:BLUE" }, "ScheduledActions" : [ { "ScalableTargetAction" : { "MinCapacity" : "250" }, "ScheduledActionName" : "my-scale-out-scheduled-action", "Schedule" : "cron(0 18 * * ? *)", "EndTime" : "2022-12-31T12:00:00.000Z" } ] } } }
YAML
ScalableTarget: Type: AWS::ApplicationAutoScaling::ScalableTarget Properties: MaxCapacity: 250 MinCapacity: 0 RoleARN: !Join - ':' - - 'arn:aws:iam:' - !Ref 'AWS::AccountId' - role/aws-service-role/lambda.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_LambdaConcurrency ServiceNamespace: lambda ScalableDimension: lambda:function:ProvisionedConcurrency ResourceId: !Sub function:${
logicalName
}:BLUE ScheduledActions: - ScalableTargetAction: MinCapacity: 250 ScheduledActionName: my-scale-out-scheduled-action Schedule: 'cron(0 18 * * ? *)' EndTime: '2022-12-31T12:00:00.000Z'
使用竞价型实例集的 at
表达式声明计划操作
此代码说明如何使用于使用于使用于使用于使用于使用于使用于使用于使用于使用于使用于使用于使用于使用于使用于使用于使用于使用于AWS::ApplicationAutoScaling::ScalableTarget使用于使用 AWS::EC2::SpotFleet 每个一次性计划操作的时区均为 UTC。
此示例利用 Fn::Join 和 Ref 内置函数,使用在同一模板中指定的 AWS::EC2::SpotFleet
资源的逻辑名称来构建 ResourceId
属性。
注意
竞价型实例集请求必须使用 maintain
作为请求类型。一次性请求或 Spot 型限制不支持自动扩展。
JSON
{ "Resources" : { "SpotFleetScalableTarget" : { "Type" : "AWS::ApplicationAutoScaling::ScalableTarget", "Properties" : { "MaxCapacity" : 0, "MinCapacity" : 0, "RoleARN" : { "Fn::Sub" : "arn:aws:iam::${AWS::AccountId}:role/aws-service-role/ec2.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_EC2SpotFleetRequest" }, "ServiceNamespace" : "ec2", "ScalableDimension" : "ec2:spot-fleet-request:TargetCapacity", "ResourceId" : { "Fn::Join" : [ "/", [ "spot-fleet-request", { "Ref" : "
logicalName
" } ] ] }, "ScheduledActions" : [ { "ScalableTargetAction" : { "MaxCapacity" : "10", "MinCapacity" : "10" }, "ScheduledActionName" : "my-scale-out-scheduled-action", "Schedule" : "at(2022-05-20T13:00:00)" }, { "ScalableTargetAction" : { "MaxCapacity" : "0", "MinCapacity" : "0" }, "ScheduledActionName" : "my-scale-in-scheduled-action", "Schedule" : "at(2022-05-20T21:00:00)" } ] } } } }
YAML
--- Resources: SpotFleetScalableTarget: Type: AWS::ApplicationAutoScaling::ScalableTarget Properties: MaxCapacity: 0 MinCapacity: 0 RoleARN: Fn::Sub: 'arn:aws:iam::${AWS::AccountId}:role/aws-service-role/ec2.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_EC2SpotFleetRequest' ServiceNamespace: ec2 ScalableDimension: 'ec2:spot-fleet-request:TargetCapacity' ResourceId: !Join - / - - spot-fleet-request - !Ref
logicalName
ScheduledActions: - ScalableTargetAction: MaxCapacity: 10 MinCapacity: 10 ScheduledActionName: my-scale-out-scheduled-action Schedule: 'at(2022-05-20T13:00:00)' - ScalableTargetAction: MaxCapacity: 0 MinCapacity: 0 ScheduledActionName: my-scale-in-scheduled-action Schedule: 'at(2022-05-20T21:00:00)'