AWS 自动缩放构建库
AWS CDK v1在2023-06-01上达到了支持结束. 此软件包不再更新,用户应该迁移到 AWS CDK v2.
关于如何移徙的更多信息,请参见: 移动到 AWS CDK v2 指南。 。 。 .
应用程序自动缩放 用于配置全部自动缩放 除缩放EC2实例以外的服务。 例如,您会用它来 缩放ECS任务, DynamoDB 容量, Spot Fleets 大小, Conprehend文件分类端点, Lambda 函数提供通量等.
作为 CDK 用户, 您可能不需要与此库交互 直接;相反,它将被其他构造库用于 为自己的构造提供自动缩放功能.
该文件将描述一般自动缩放特性和概念; 您的特定服务只能提供其中的一部分.
自动缩放基础
资源可以提供一个或多个 属性 自动缩放,一般 代表基础服务的某些能力层面。 譬如说, a 迪纳摩DB 表格提供读写功能的自动缩放 表正本及其全球二级指数,ECS服务提供 自动缩放任务计数,一个RDS Aurora集群提供其规模 复制品数等.
当您启用属性自动缩放时,您指定最小值和最小值 最大容量值。 对应度量衡的自动缩放政策 绝对不会超过或低于指示容量(但已排定) 缩放行动可能,见下文).
有三种方法可以扩大你的能力:
- 针对一个衡量标准 (也称为步缩;例如: 如果整个集群的 CPU 使用量开始上升, 可能想要扩大范围, 当它再次降下的时候.
- 试图在某个值周围保持一定的度量 (又称: 目标跟踪缩放 ; 您可能想要自动缩放一个插入到 cPU使用率保持在50%左右.
- 按计划; 您可能想要在交通中组织您的缩放 通过在上午缩小和在 边.
自动缩放的一般模式将像这样:
declare const resource: SomeScalableResource;
const capacity = resource.autoScaleCapacity({
minCapacity: 5,
maxCapacity: 100
});
// Then call a method to enable metric scaling and/or schedule scaling
// (explained below):
//
// capacity.scaleOnMetric(...);
// capacity.scaleToTrackMetric(...);
// capacity.scaleOnSchedule(...);
步骤缩放
这种在决定步骤中缩放的缩放 配置,以响应度量值。 比如你的缩放策略 以响应 CPU 使用量而缩放 :
Scaling -1 (no change) +1 +3
│ │ │ │ │
├────────┼───────────────────────┼────────┼────────┤
│ │ │ │ │
CPU usage 0% 10% 50% 70% 100%
(注意,这不一定是一个推荐的缩放战略,而是 一个可能的。 您必须确定哪些阈值适合您).
你会这样配置它:
declare const capacity: ScalableAttribute;
declare const cpuUtilization: cloudwatch.Metric;
capacity.scaleOnMetric('ScaleToCPU', {
metric: cpuUtilization,
scalingSteps: [
{ upper: 10, change: -1 },
{ lower: 50, change: +1 },
{ lower: 70, change: +3 },
],
// Change this to AdjustmentType.PercentChangeInCapacity to interpret the
// 'change' numbers before as percentages instead of capacity counts.
adjustmentType: appscaling.AdjustmentType.CHANGE_IN_CAPACITY,
});
自动缩放构建库将创建所需的 Cloud Watch 提醒和 自动缩放您的策略 .
基于多个数据点的缩放
上面的阶梯缩放配置将在单个时启动一个缩放活动
缩放测量数据点正在突破一个缩放步骤断点。 个案
在更多数据点上启动缩放行动
(为平滑度量数据中的随机性)
选项 evaluationPeriods 财务报告和审定财务报表 datapointsToAlarm 属性 :
declare const capacity: ScalableAttribute;
declare const cpuUtilization: cloudwatch.Metric;
capacity.scaleOnMetric('ScaleToCPUWithMultipleDatapoints', {
metric: cpuUtilization,
scalingSteps: [
{ upper: 10, change: -1 },
{ lower: 50, change: +1 },
{ lower: 70, change: +3 },
],
// if the cpuUtilization metric has a period of 1 minute, then data points
// in the last 10 minutes will be evaluated
evaluationPeriods: 10,
// Only trigger a scaling action when 6 datapoints out of the last 10 are
// breaching. If this is left unspecified, then ALL datapoints in the
// evaluation period must be breaching to trigger a scaling action
datapointsToAlarm: 6
});
目标跟踪
为了保持一个度量衡(通常为 在您喜欢的数值周围。 此类型的缩放是 典型的高度依赖服务 在你可以用什么度量,所以 不同的服务在这里会有不同的方法来建立目标跟踪 缩放.
以下示例配置一个 DynamoDB 表的读取能力 利用率将达到60%左右:
import * as dynamodb from '@aws-cdk/aws-dynamodb';
declare const table: dynamodb.Table;
const readCapacity = table.autoScaleReadCapacity({
minCapacity: 10,
maxCapacity: 1000
});
readCapacity.scaleOnUtilization({
targetUtilizationPercent: 60
});
预定缩放
这种类型的缩放被用于根据时间改变能力. 有用吗
通过修改 minCapacity 财务报告和审定财务报表 maxCapacity 属性,所以
可用于两个目的:
- 通过设置列表缩放
minCapacity高点或 页:1maxCapacity低点. - 仍允许常规规模行动履行职责,但限制
它们可以缩小的范围(通过设置两者)
minCapacity财务报告和审定财务报表maxCapacity但随着时间推移而改变范围.
可以使用下列调度表达式:
at(yyyy-mm-ddThh:mm:ss)-- 某一时刻的尺度rate(value unit)-- 每分/小时/天比例cron(mm hh dd mm dow)-- 任意时间表的比额表
其中克龙表达法最有用,但也最
复杂 时间表以克龙语表示。 这个 Schedule 类有一个 cron 用于帮助构建 cron 表达式的方法.
下面的例子显示 舰队在早上出海 自然而然 夜间缩放 :
declare const resource: SomeScalableResource;
const capacity = resource.autoScaleCapacity({
minCapacity: 1,
maxCapacity: 50,
});
capacity.scaleOnSchedule('PrescaleInTheMorning', {
schedule: appscaling.Schedule.cron({ hour: '8', minute: '0' }),
minCapacity: 20,
});
capacity.scaleOnSchedule('AllowDownscalingAtNight', {
schedule: appscaling.Schedule.cron({ hour: '20', minute: '0' }),
minCapacity: 1
});
实例
Lambda 提供的货币自动缩放
import * as lambda from '@aws-cdk/aws-lambda';
declare const code: lambda.Code;
const handler = new lambda.Function(this, 'MyFunction', {
runtime: lambda.Runtime.PYTHON_3_7,
handler: 'index.handler',
code,
reservedConcurrentExecutions: 2,
});
const fnVer = handler.currentVersion;
const target = new appscaling.ScalableTarget(this, 'ScalableTarget', {
serviceNamespace: appscaling.ServiceNamespace.LAMBDA,
maxCapacity: 100,
minCapacity: 10,
resourceId: `function:${handler.functionName}:${fnVer.version}`,
scalableDimension: 'lambda:function:ProvisionedConcurrency',
})
target.scaleToTrackMetric('PceTracking', {
targetValue: 0.9,
predefinedMetric: appscaling.PredefinedMetric.LAMBDA_PROVISIONED_CONCURRENCY_UTILIZATION,
})
ElastiCache Redis 有目标值的缩放
const shardsScalableTarget = new appscaling.ScalableTarget(this, 'ElastiCacheRedisShardsScalableTarget', {
serviceNamespace: appscaling.ServiceNamespace.ELASTICACHE,
scalableDimension: 'elasticache:replication-group:NodeGroups',
minCapacity: 2,
maxCapacity: 10,
resourceId: 'replication-group/main-cluster',
});
shardsScalableTarget.scaleToTrackMetric('ElastiCacheRedisShardsCPUUtilization', {
targetValue: 20,
predefinedMetric: appscaling.PredefinedMetric.ELASTICACHE_PRIMARY_ENGINE_CPU_UTILIZATION,
});