Amazon EC2 自动缩放构建库
AWS CDK v1在2023-06-01上达到了支持结束. 此软件包不再更新,用户应该迁移到 AWS CDK v2.
关于如何移徙的更多信息,请参见: 移动到 AWS CDK v2 指南。 。 。 .
这个模块是 AWS 云开发套件 项目.
自动缩放组
一个 AutoScalingGroup 代表您运行代码的若干实例。 你个
选择机队大小,实例类型和OS图像 :
declare const vpc: ec2.Vpc;
new autoscaling.AutoScalingGroup(this, 'ASG', {
vpc,
instanceType: ec2.InstanceType.of(ec2.InstanceClass.BURSTABLE2, ec2.InstanceSize.MICRO),
machineImage: new ec2.AmazonLinuxImage() // get the latest Amazon Linux image
});
注:自动缩放 组有一个财产叫 allowAllOutbound (允许实例与
互联网) true 默认。 一定要把这个设置到 false 如果你不想的话
您可以启动任意连接的示例。 或者,您可以指定一个已有的安全
组以附加于启动的实例,而不是由该组创建新的实例.
declare const vpc: ec2.Vpc;
const mySecurityGroup = new ec2.SecurityGroup(this, 'SecurityGroup', { vpc });
new autoscaling.AutoScalingGroup(this, 'ASG', {
vpc,
instanceType: ec2.InstanceType.of(ec2.InstanceClass.BURSTABLE2, ec2.InstanceSize.MICRO),
machineImage: new ec2.AmazonLinuxImage(),
securityGroup: mySecurityGroup,
});
或者您可以创建 AutoScalingGroup 从a LaunchTemplate数字 :
declare const vpc: ec2.Vpc;
declare const launchTemplate: ec2.LaunchTemplate;
new autoscaling.AutoScalingGroup(this, 'ASG', {
vpc,
launchTemplate: launchTemplate
});
要推出Spot和按需实例的组合和/或多种实例类型,可以创建 AutoScalingGroup 混合供资政策:
declare const vpc: ec2.Vpc;
declare const launchTemplate1: ec2.LaunchTemplate;
declare const launchTemplate2: ec2.LaunchTemplate;
new autoscaling.AutoScalingGroup(this, 'ASG', {
vpc,
mixedInstancesPolicy: {
instancesDistribution: {
onDemandPercentageAboveBaseCapacity: 50, // Mix Spot and On-Demand instances
},
launchTemplate: launchTemplate1,
launchTemplateOverrides: [ // Mix multiple instance types
{ instanceType: new ec2.InstanceType('t3.micro') },
{ instanceType: new ec2.InstanceType('t3a.micro') },
{ instanceType: new ec2.InstanceType('t4g.micro'), launchTemplate: launchTemplate2 },
],
}
});
机器图像( AMIs)
AMIs 控制您启动 EC2 实例时启动的操作系统 。 欧共体2 库中包含用于选择您要使用的 AMI 的构造 .
根据AMI的种类,你选择不同的方式.
Amazon Linux 和 Microsoft Windows 图像的最新版本是 可通过即时选择其中一类:
注意: 选中的 Amazon Linux 图像将缓存于您
cdk.json,这样你的 自动缩放 组合不会自动改变 与你无关 变化。 要更新最新版本的 Amazon Linux, 请删除缓存项context区域cdk.json。 。 。 .我们将增加命令行选项,使这个步骤在未来更容易.
自动缩放实例计数
自动缩放 团体可以提高和减少团体中的案件数量, 由于工作量的变化(或是在工作量变化之前).
创建自动缩放组时,指定一个 minCapacity (单位:千美元)
maxCapacity. 适应度量衡的自动升级政策永远不会更高
或低于所示能力(但预定规模行动可能见
页:1.
有三种方法可以扩大你的能力:
- 针对一个衡量标准 (也称为步缩;例如: 如果整个集群的 CPU 使用量开始上升, 可能想要扩大范围, 当它再次降下的时候.
- 试图在某个值周围保持一定的度量 (又称: 目标跟踪缩放);您可能想要自动缩放到 cPU使用率保持在50%左右.
- 按计划; 您可能想要在交通中组织您的缩放 通过在上午缩小和在 边.
自动缩放的一般模式将像这样:
declare const vpc: ec2.Vpc;
declare const instanceType: ec2.InstanceType;
declare const machineImage: ec2.IMachineImage;
const autoScalingGroup = new autoscaling.AutoScalingGroup(this, 'ASG', {
vpc,
instanceType,
machineImage,
minCapacity: 5,
maxCapacity: 100
// ...
});
// Then call one of the scaling methods (explained below)
//
// autoScalingGroup.scaleOnMetric(...);
//
// autoScalingGroup.scaleOnCpuUtilization(...);
// autoScalingGroup.scaleOnIncomingBytes(...);
// autoScalingGroup.scaleOnOutgoingBytes(...);
// autoScalingGroup.scaleOnRequestCount(...);
// autoScalingGroup.scaleToTrackMetric(...);
//
// autoScalingGroup.scaleOnSchedule(...);
步骤缩放
在决定步骤中,这类缩放缩放 配置,以响应度量值。 例如,您的缩放策略 缩放,以响应代表您平均员工总数使用的计量标准 也许是这样的:
Scaling -1 (no change) +1 +3
│ │ │ │ │
├────────┼───────────────────────┼────────┼────────┤
│ │ │ │ │
Worker use 0% 10% 50% 70% 100%
(注意,这不一定是一个推荐的缩放战略,而是 一个可能的。 您必须确定哪些阈值适合您).
请注意,为了制定这一规模化战略,你必须发出一个 代表您从实例中的工人使用量。 在那之后,我们.., 您可以配置这样的缩放 :
declare const autoScalingGroup: autoscaling.AutoScalingGroup;
const workerUtilizationMetric = new cloudwatch.Metric({
namespace: 'MyService',
metricName: 'WorkerUtilization'
});
autoScalingGroup.scaleOnMetric('ScaleToCPU', {
metric: workerUtilizationMetric,
scalingSteps: [
{ upper: 10, change: -1 },
{ lower: 50, change: +1 },
{ lower: 70, change: +3 },
],
// Change this to AdjustmentType.PERCENT_CHANGE_IN_CAPACITY to interpret the
// 'change' numbers before as percentages instead of capacity counts.
adjustmentType: autoscaling.AdjustmentType.CHANGE_IN_CAPACITY,
});
自动缩放构建库将创建所需的 Cloud Watch 提醒和 自动缩放您的策略 .
目标跟踪
此类缩放尺度的出入取出,以保持一个数值左右的度量衡 你更喜欢 预定义的衡量标准有四种类型,可以跟踪,也可以 选择跟踪自定义度量衡。 如果你选择跟踪一个自定义的度量衡, 注意衡量标准必须在某种程度上代表实例的利用 (如果衡量标准高于目标,自动缩放将缩小范围,并缩小范围) 如果衡量标准低于目标.
如果您配置了多个目标跟踪策略, AutoScaling 将使用 它能产生最高的能力.
以下示例缩放以保持您实例的 CPU 使用量 50%的利用率:
declare const autoScalingGroup: autoscaling.AutoScalingGroup;
autoScalingGroup.scaleOnCpuUtilization('KeepSpareCPU', {
targetUtilizationPercent: 50
});
要在您的情况中以平均网络流量为单位:
declare const autoScalingGroup: autoscaling.AutoScalingGroup;
autoScalingGroup.scaleOnIncomingBytes('LimitIngressPerInstance', {
targetBytesPerSecond: 10 * 1024 * 1024 // 10 MB/s
});
autoScalingGroup.scaleOnOutgoingBytes('LimitEgressPerInstance', {
targetBytesPerSecond: 10 * 1024 * 1024 // 10 MB/s
});
以每个实例的平均请求数缩放( 自动缩放 已附加到应用程序加载的组 余额:
declare const autoScalingGroup: autoscaling.AutoScalingGroup;
autoScalingGroup.scaleOnRequestCount('LimitRPS', {
targetRequestsPerSecond: 1000
});
预定缩放
这种类型的缩放被用于根据时间改变能力. 它的作用由
变化 minCapacity, (中文(简体) ), maxCapacity 财务报告和审定财务报表 desiredCapacity 会 议 日 程 和 议 程
自动缩放组,因此可用于两个目的:
- 通过设置列表缩放
minCapacity高点或 页:1maxCapacity低点. - 仍允许常规规模行动履行职责,但限制
它们可以缩小的范围(通过设置两者)
minCapacity财务报告和审定财务报表maxCapacity但随着时间推移而改变范围.
时间表以克龙语表示。 这个 Schedule 类有一个 cron 用于帮助构建 cron 表达式的方法.
下面的例子显示 舰队在早上出海 回到自然 夜间缩放( 必要时, 一直缩放到1个实例) :
declare const autoScalingGroup: autoscaling.AutoScalingGroup;
autoScalingGroup.scaleOnSchedule('PrescaleInTheMorning', {
schedule: autoscaling.Schedule.cron({ hour: '8', minute: '0' }),
minCapacity: 20,
});
autoScalingGroup.scaleOnSchedule('AllowDownscalingAtNight', {
schedule: autoscaling.Schedule.cron({ hour: '20', minute: '0' }),
minCapacity: 1
});
使用 CloudFormation Init 配置实例
可以使用 CloudFormation 输入机制来配置
自动缩放组中的实例。 你可以写文件给它,运行命令,
启动服务等。 见文件
AWS:: CloudFormation:: init (英语)
cDK的文档 aws-ec2 用于获取更多信息的图书馆.
当您为自动缩放组指定 CloudFormation Init 配置时 :
- 你们 必须 另具体说明
signals配置云长 应当等待实例成功配置自己. - 你们 应 还指定一个
updatePolicy来配置实例 当自动缩放组更新(例如, 当AMI更新时. 如果您未指定更新策略, a 滚动 更新 默认选择.
以下是使用 CloudFormation Init 编写文件到 启动时实例主机 :
declare const vpc: ec2.Vpc;
declare const instanceType: ec2.InstanceType;
declare const machineImage: ec2.IMachineImage;
new autoscaling.AutoScalingGroup(this, 'ASG', {
vpc,
instanceType,
machineImage,
// ...
init: ec2.CloudFormationInit.fromElements(
ec2.InitFile.fromString('/etc/my_instance', 'This got written during instance startup'),
),
signals: autoscaling.Signals.waitForAll({
timeout: Duration.minutes(10),
}),
});
信号
在正常操作中, CloudFormation 将发送创建或更新命令到 一个自动缩放组, 无需等待即可继续部署 联 合 国 自动缩放组中的实例。 。 。 .
配置 signals 告诉 CloudFormation 等待特定数量
自动缩放组中已启动( 或未启动) 实例
在继续前进之前 一个实例应该执行
cfn-signal
程序作为其启动的一部分,以表示是否已启动
成功与否.
如果使用 CloudFormation 输入支持(在上一节描述),
适当呼吁 cfn-signal 自动添加到
自动缩放组的用户数据 。 如果你没有使用 signals 直接说,你是
负责给自己加上这样的称呼.
以下类型 Signals 备有:
Signals.waitForAll([options]): 等待所有时间desiredCapacity实例数量 开始(建议).Signals.waitForMinCapacity([options]): 等待一个minCapacity实例数量 开始(如果等待所有事件的时间太长而你高兴的话) 和最少数的健康宿主.Signals.waitForCount(count, [options]):等待特定数量的示例 开始 .
有两个 options 您可以配置 :
timeout:允许一个主机启动的最大时间. 如果主机不报告 在这段时间内,成功被视为失败。 默认为5分钟.minSuccessPercentage: 需要保持健康以便 更新以成功。 如果您设定此值低于 100, 一定百分比的主机可能 报告失败,但仍认为部署成功。 默认为100%.
更新策略
这个 更新策略 描述定义运行时会发生什么情况 中,将修改自动缩放组。 例如,如果向用户数据添加命令 在自动缩放组中,是否将已有实例替换为新实例 已执行新用户数据 ? 还是"老"事件继续发生?
建议始终使用更新政策,否则您目前的状况 实例还取决于您以前的情况,而不仅仅是您 源代码. 这降低了你的部署的可复制性.
现提供下列最新政策:
UpdatePolicy.none(): 撇开现有实例(不建议).UpdatePolicy.rollingUpdate([options]):逐步取代现有的 实例,以小批次出现。 无论何时, 案件总数大致相同。 如果部署 需要回滚,新的例将被替换为"旧" 再次配置 .UpdatePolicy.replacingUpdate([options]): 建立一个全新的副本 中。 一次自动缩放组 已成功创建( 如果signals实值 在自动缩放组上配置的旧自动缩放组被删除 . 如果需要回滚部署, 新的自动缩放组是 删除,旧的则保持不变.
允许连接
见文件 @aws-cdk/aws-ec2 需要更多信息的软件包
关于允许由实例支持的资源之间的连接.
最大实例寿命
要启用最大实例寿命支持, 请指定 maxInstanceLifetime 属性
联 合 国 AutoscalingGroup 资源。 数值必须是7至365天(含).
要清除先前设定的值, 请未定义此属性 .
实例监测
要禁用详细实例监测, 请指定 instanceMonitoring 属性
联 合 国 AutoscalingGroup 资源为 Monitoring.BASIC. 否则详细监测
将启用.
监测组
组度量衡用于监视组级属性;它们描述组而不是其任何实例(如GroupMaxSize,组最大大小). 为了能够对组指标进行监测,使用 groupMetrics 属性.
所有组的度量衡均以1分的颗粒性报告,无需再加电.
见 EC2 文档 用于列出所有可用的组指标.
能够使用 groupMetrics 属性 :
declare const vpc: ec2.Vpc;
declare const instanceType: ec2.InstanceType;
declare const machineImage: ec2.IMachineImage;
// Enable monitoring of all group metrics
new autoscaling.AutoScalingGroup(this, 'ASG', {
vpc,
instanceType,
machineImage,
// ...
groupMetrics: [autoscaling.GroupMetrics.all()],
});
// Enable monitoring for a subset of group metrics
new autoscaling.AutoScalingGroup(this, 'ASG', {
vpc,
instanceType,
machineImage,
// ...
groupMetrics: [new autoscaling.GroupMetrics(autoscaling.GroupMetric.MIN_SIZE, autoscaling.GroupMetric.MAX_SIZE)],
});
终止政策
自动缩放用途 终止保险
用于确定在规模化事件期间首先终止哪些实例。 你个
可指定一种或多种终止保险政策 terminationPolicies
属性 :
declare const vpc: ec2.Vpc;
declare const instanceType: ec2.InstanceType;
declare const machineImage: ec2.IMachineImage;
new autoscaling.AutoScalingGroup(this, 'ASG', {
vpc,
instanceType,
machineImage,
// ...
terminationPolicies: [
autoscaling.TerminationPolicy.OLDEST_INSTANCE,
autoscaling.TerminationPolicy.DEFAULT,
],
});
保护新事件不被大规模终止
默认情况下, Auto 缩放可以在发射后的任何时候终止实例 在自动缩放组中缩放,但以组为条件 终止 政策。 。 。 .
不过,您不妨保护新启动的个案不会在
如果它们要运行关键应用程序,但不应过早
终止。 EC2 亚马逊ECS能力供应商要求这个属性是:
设置为 true。 。 。 .
declare const vpc: ec2.Vpc;
declare const instanceType: ec2.InstanceType;
declare const machineImage: ec2.IMachineImage;
new autoscaling.AutoScalingGroup(this, 'ASG', {
vpc,
instanceType,
machineImage,
// ...
newInstancesProtectedFromScaleIn: true,
});
配置实例元数据服务
正在准备 IMDSv1
您可以配置 EC2 实例元数据服务 选项 允许IMDSv1和IMDSv2在与IMDS互动时同时执行IMDSv2.
为了一个人 AutoScalingGroup设置 requireImdsv2 属性.
下面的例子显示, IMDSv2 需要单曲 AutoScalingGroup数字 :
declare const vpc: ec2.Vpc;
declare const instanceType: ec2.InstanceType;
declare const machineImage: ec2.IMachineImage;
new autoscaling.AutoScalingGroup(this, 'ASG', {
vpc,
instanceType,
machineImage,
// ...
requireImdsv2: true,
});
您还可以使用 AutoScalingGroupRequireImdsv2Aspect 以应用到多个自动缩放组.
下面的例子说明: AutoScalingGroupRequireImdsv2Aspect 用于对堆栈中的所有自动缩放组要求 IMDSv2 :
const aspect = new autoscaling.AutoScalingGroupRequireImdsv2Aspect();
Aspects.of(this).add(aspect);
温暖池
自动缩放提议 温水池 能够减少申请延迟时间,因为申请的启动时间特别长。 您可以创建一个带有以下默认参数的温池:
declare const autoScalingGroup: autoscaling.AutoScalingGroup;
autoScalingGroup.addWarmPool();
您也可以通过配置参数自定义取暖池 :
declare const autoScalingGroup: autoscaling.AutoScalingGroup;
autoScalingGroup.addWarmPool({
minSize: 1,
reuseOnScaleIn: true,
});
今后的工作
- Cloud Watch Evolutions( 无法作为自动缩放组 ARN 添加) 为制定此规则所必需, 无法从 CloudFormation 访问此规则 .