in src/index.ts [267:306]
createScalingPolicy(options: IScalingPolicyDefinitionProps) {
const serviceName = options.serviceName;
const clusterName = options.clusterName;
const identifier = options.identifier;
const stack = options.stack;
// Scaling set on ECS service level
const target = new applicationautoscaling.ScalableTarget(stack, 'selenium-scalableTarget-'+identifier, {
serviceNamespace: applicationautoscaling.ServiceNamespace.ECS,
maxCapacity: options.maxInstances,
minCapacity: options.minInstances,
resourceId: 'service/'+clusterName+'/'+serviceName,
scalableDimension: 'ecs:service:DesiredCount',
});
// Metrics to listen
const workerUtilizationMetric = new cloudwatch.Metric({
namespace: 'AWS/ECS',
metricName: 'CPUUtilization',
statistic: 'max',
period: cdk.Duration.minutes(1),
dimensions: {
ClusterName: clusterName,
ServiceName: serviceName,
},
});
// Define Scaling policies (scale-in and scale-out)
// Remove one instance if CPUUtilization is less than 30%,
// Add three instance if the CPUUtilization is greater than 70%
target.scaleOnMetric('step-metric-scaling-'+identifier, {
metric: workerUtilizationMetric,
adjustmentType: applicationautoscaling.AdjustmentType.CHANGE_IN_CAPACITY,
scalingSteps: [
{ upper: 30, change: -1 },
{ lower: 80, change: +3 },
],
cooldown: cdk.Duration.seconds(180),
});
}