自动扩缩模板代码段
以下示例演示了要包含在模板中的不同代码段,以便与 Amazon EC2 Auto Scaling 或 Application Auto Scaling 一起使用。
Amazon EC2 Auto Scaling 使您能够通过扩展策略或计划扩展自动伸缩 Amazon EC2 实例。自动扩缩组是 Amazon EC2 实例的集合,这些实例支持自动伸缩和实例集管理功能,例如运行状况检查以及与 Elastic Load Balancing 的集成。
Application Auto Scaling 通过扩展策略或计划扩展,可以自动扩展 Amazon EC2 以外的其他资源。
目录
声明包含用户数据和 IAM 角色的启动模板
此代码段显示 AWS::EC2::LaunchTemplate 资源,其中包含自动扩缩组的实例配置信息。您可以为 ImageId、InstanceType、SecurityGroups、UserData 和 TagSpecifications 属性指定值。SecurityGroups 属性指定一个名为 myExistingEC2SecurityGroup 的现有 EC2 安全组和一个新安全组。Ref 函数获取在堆栈模板中其他位置声明的 AWS::EC2::SecurityGroup 资源 myNewEC2SecurityGroup 的名称。
启动模板包括自定义用户数据的部分。在本节中,您可以传入实例启动时运行的配置任务和脚本。在此示例中,用户数据安装 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" } }, "SecurityGroups":[ { "Ref":"myNewEC2SecurityGroup" }, "myExistingEC2SecurityGroup" ], "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-02354e95b3exampleInstanceType:t3.microIamInstanceProfile: Name: !Ref myInstanceProfile SecurityGroups: - Ref!myNewEC2SecurityGroup-myExistingEC2SecurityGroupUserData: 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-agentTagSpecifications: - ResourceType: instance Tags: - Key:environmentValue:development- ResourceType: volume Tags: - Key:environmentValue:developmentmyInstanceRole: 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::AutoScalingGroup 资源,以帮助您开始操作。自动扩缩组的 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-subnetIdAz3LaunchTemplate: LaunchTemplateId: !RefmyLaunchTemplateVersion: !GetAttmyLaunchTemplate.LatestVersionNumber MaxSize: '1' MinSize: '0' DesiredCapacity: '1'
声明具有附加负载均衡器的自动扩缩组
此示例显示了用于在多个服务器之间实现负载均衡的 AWS::AutoScaling::AutoScalingGroup 资源。它指定在同一模板中的其他位置声明的 Amazon 资源的逻辑名称。
-
VPCZoneIdentifier属性指定将在其中创建自动扩缩组的 EC2 实例的两个 AWS::EC2::Subnet 资源的逻辑名称:myPublicSubnet1和myPublicSubnet2。 -
LaunchTemplate属性指定具有逻辑名称myLaunchTemplate的 AWS::EC2::LaunchTemplate 资源。 -
TargetGroupARNs属性列出用于将流量路由到自动扩缩组的应用程序负载均衡器或网络负载均衡器的目标组。在此示例中,指定了一个目标组,即具有逻辑名称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: - !RefmyPublicSubnet1- !RefmyPublicSubnet2LaunchTemplate: LaunchTemplateId: !RefmyLaunchTemplateVersion: !GetAttmyLaunchTemplate.LatestVersionNumber MaxSize: '5' MinSize: '1' TargetGroupARNs: - !RefmyTargetGroup
另请参阅
有关根据 ALBRequestCountPerTarget 预定义指标为应用程序负载均衡器创建具有目标跟踪扩展策略的自动扩缩组的详细示例,请参阅 AWS::AutoScaling::ScalingPolicy 资源中的示例部分。
声明具有通知的自动扩缩组
此示例显示的是在指定事件发生时发送 Amazon SNS 通知的 AWS::AutoScaling::AutoScalingGroup 资源。NotificationConfigurations 属性指定 Amazon CloudFormation 在其中发送通知的 SNS 主题和将导致 Amazon CloudFormation 发送通知的事件。当 NotificationTypes 指定的事件发生时,Amazon CloudFormation 会发送一条通知至 TopicARN 指定的 SNS 主题中。启动堆栈时,Amazon CloudFormation 会创建在同一模板中声明的 AWS::SNS::Subscription 资源(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-subnetIdAz3LaunchTemplate: LaunchTemplateId: !ReflogicalNameVersion: !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 声明自动扩缩组
以下示例演示如何将 CreationPolicy 和 UpdatePolicy 属性添加到 AWS::AutoScaling::AutoScalingGroup 资源。
示例创建策略会阻止自动扩缩组达到 CREATE_COMPLETE 状态,直到 Amazon CloudFormation 在该组准备就绪后收到 Count 个成功信号。要发出自动扩缩组已就绪的信号,在实例上运行添加到启动模板用户数据(未显示)的 cfn-signal 帮助程序脚本。如果实例未在规定的 Timeout 内发送信号,则 CloudFormation 假设未创建实例、资源创建失败和 CloudFormation 回滚堆栈。
示例更新策略指示 CloudFormation 使用 AutoScalingRollingUpdate 属性执行滚动更新。滚动更新根据 MaxBatchSize 和基于 PauseTime 的更新批次之间的暂停时间以小批量的方式更改自动扩缩组(在本示例中,为逐个实例更改)。MinInstancesInService 属性指定当 CloudFormation 更新旧实例时,自动扩缩组内必须处于服务状态的实例的最小数量。
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-subnetIdAz3LaunchTemplate: LaunchTemplateId: !ReflogicalNameVersion: !GetAttlogicalName.LatestVersionNumber MaxSize: '5' MinSize: '3'
使用 CloudWatch 警报声明分步扩展策略
此示例显示了使用分步扩展策略横向扩展自动扩缩组的 AWS::AutoScaling::ScalingPolicy 资源。AdjustmentType 属性指定 ChangeInCapacity,这表示 ScalingAdjustment 代表待添加(如果 ScalingAdjustment 为正值)或待删除(如果它为负值)实例的数量。在此示例中,ScalingAdjustment 为 1;因此,当超出警报阈值时,策略会将组中 EC2 实例的数量增加 1。
AWS::CloudWatch::Alarm 资源 CPUAlarmHigh 指定扩展策略 ASGScalingPolicyHigh 作为警报处于 ALARM 状态时要运行的操作(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: !ReflogicalNamePolicyType: 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!logicalNameComparisonOperator: GreaterThanThreshold MetricName: CPUUtilization
另请参阅
有关扩展策略的更多示例模板,请参阅 AWS::AutoScaling::ScalingPolicy 资源中的示例部分。
混合实例组示例
声明使用混合实例策略和基于属性的实例类型选择的自动扩缩组
此示例显示了 AWS::AutoScaling::AutoScalingGroup 资源,其中包含使用基于属性的实例类型选择启动混合实例组的信息。您指定了 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-subnetIdAz3MixedInstancesPolicy: LaunchTemplate: LaunchTemplateSpecification: LaunchTemplateId: !ReflogicalNameVersion: !GetAttlogicalName.LatestVersionNumber Overrides: - InstanceRequirements: VCpuCount: Min:2Max:4MemoryMiB: Min:2048MaxSize: '5' MinSize: '1' DesiredCapacity: '3'
启动配置示例
声明启动配置
此示例显示了自动扩缩组的 AWS::AutoScaling::LaunchConfiguration 资源,您可以在其中指定 ImageId、InstanceType 和 SecurityGroups 属性的值。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-02354e95b3exampleInstanceType:t3.microSecurityGroups: - Ref!logicalName-myExistingEC2SecurityGroup
声明使用启动配置的自动扩缩组
此示例显示具有单个实例的 AWS::AutoScaling::AutoScalingGroup 资源。自动扩缩组的 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-subnetIdAz3LaunchConfigurationName: !RefmySimpleConfigMaxSize: '1' MinSize: '0' DesiredCapacity: '1'
Application Auto Scaling 模板示例
本节为不同 Amazon 资源的 Application Auto Scaling 扩展策略和计划操作提供了 Amazon CloudFormation 模板示例。
目录
重要
当模板中包含 Application Auto 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 - !ReflogicalNameScalingPolicyAppStreamFleet: Type: AWS::ApplicationAutoScaling::ScalingPolicy Properties: PolicyName: !Sub ${AWS::StackName}-target-tracking-cpu75 PolicyType: TargetTrackingScaling ServiceNamespace: appstream ScalableDimension: appstream:fleet:DesiredCapacity ResourceId: !Join - / - - fleet - !ReflogicalNameTargetTrackingScalingPolicyConfiguration: 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 - !ReflogicalNameWriteScalingPolicy: 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 - !RefmyContainerCluster- !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::GetAtt 内部函数,使用在同一模板中指定的 AWS::ElasticLoadBalancingV2::LoadBalancer(myLoadBalancer)和 AWS::ElasticLoadBalancingV2::TargetGroup(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 - !RefmyContainerCluster- !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 表达式声明计划操作
此代码段使用 AWS::ApplicationAutoScaling::ScalableTarget 资源,为名为 BLUE 的函数别名(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 - !ReflogicalNameScheduledActions: - 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)'