createScalingPolicy()

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),      
    }); 
  }