packages/aws-cdk-lib/aws-autoscaling/lib/step-scaling-action.ts (57 lines of code) (raw):
import { Construct } from 'constructs';
import { IAutoScalingGroup } from './auto-scaling-group';
import { CfnScalingPolicy } from './autoscaling.generated';
import { Annotations, Duration, Lazy, ValidationError } from '../../core';
/**
* Properties for a scaling policy
*/
export interface StepScalingActionProps {
/**
* The auto scaling group
*/
readonly autoScalingGroup: IAutoScalingGroup;
/**
* Period after a scaling completes before another scaling activity can start.
*
* @default The default cooldown configured on the AutoScalingGroup
* @deprecated cooldown is not valid with step scaling action
*/
readonly cooldown?: Duration;
/**
* Estimated time until a newly launched instance can send metrics to CloudWatch.
*
* @default Same as the cooldown
*/
readonly estimatedInstanceWarmup?: Duration;
/**
* How the adjustment numbers are interpreted
*
* @default ChangeInCapacity
*/
readonly adjustmentType?: AdjustmentType;
/**
* Minimum absolute number to adjust capacity with as result of percentage scaling.
*
* Only when using AdjustmentType = PercentChangeInCapacity, this number controls
* the minimum absolute effect size.
*
* @default No minimum scaling effect
*/
readonly minAdjustmentMagnitude?: number;
/**
* The aggregation type for the CloudWatch metrics.
*
* @default Average
*/
readonly metricAggregationType?: MetricAggregationType;
}
/**
* Define a step scaling action
*
* This kind of scaling policy adjusts the target capacity in configurable
* steps. The size of the step is configurable based on the metric's distance
* to its alarm threshold.
*
* This Action must be used as the target of a CloudWatch alarm to take effect.
*/
export class StepScalingAction extends Construct {
/**
* ARN of the scaling policy
*/
public readonly scalingPolicyArn: string;
private readonly adjustments = new Array<CfnScalingPolicy.StepAdjustmentProperty>();
constructor(scope: Construct, id: string, props: StepScalingActionProps) {
super(scope, id);
// Specify cooldown property in StepScaling policy type is ineffective and may cause deployment failure
// in certain regions. We can't simply remove the property since it break existing users. Since setting
// this value is ineffective, we can safely ignore the value of this property with a warning.
if (props.cooldown) {
Annotations.of(this).addWarningV2('@aws-cdk/aws-autoscaling:cooldownOnStepScaling', '\'Cooldown\' is valid only if the policy type is SimpleScaling. Default to ignore the values set.');
}
const resource = new CfnScalingPolicy(this, 'Resource', {
policyType: 'StepScaling',
autoScalingGroupName: props.autoScalingGroup.autoScalingGroupName,
estimatedInstanceWarmup: props.estimatedInstanceWarmup && props.estimatedInstanceWarmup.toSeconds(),
adjustmentType: props.adjustmentType,
minAdjustmentMagnitude: props.minAdjustmentMagnitude,
metricAggregationType: props.metricAggregationType,
stepAdjustments: Lazy.any({ produce: () => this.adjustments }),
});
this.scalingPolicyArn = resource.ref;
}
/**
* Add an adjusment interval to the ScalingAction
*/
public addAdjustment(adjustment: AdjustmentTier) {
if (adjustment.lowerBound === undefined && adjustment.upperBound === undefined) {
throw new ValidationError('At least one of lowerBound or upperBound is required', this);
}
this.adjustments.push({
metricIntervalLowerBound: adjustment.lowerBound,
metricIntervalUpperBound: adjustment.upperBound,
scalingAdjustment: adjustment.adjustment,
});
}
}
/**
* How adjustment numbers are interpreted
*/
export enum AdjustmentType {
/**
* Add the adjustment number to the current capacity.
*
* A positive number increases capacity, a negative number decreases capacity.
*/
CHANGE_IN_CAPACITY = 'ChangeInCapacity',
/**
* Add this percentage of the current capacity to itself.
*
* The number must be between -100 and 100; a positive number increases
* capacity and a negative number decreases it.
*/
PERCENT_CHANGE_IN_CAPACITY = 'PercentChangeInCapacity',
/**
* Make the capacity equal to the exact number given.
*/
EXACT_CAPACITY = 'ExactCapacity',
}
/**
* How the scaling metric is going to be aggregated
*/
export enum MetricAggregationType {
/**
* Average
*/
AVERAGE = 'Average',
/**
* Minimum
*/
MINIMUM = 'Minimum',
/**
* Maximum
*/
MAXIMUM = 'Maximum',
}
/**
* An adjustment
*/
export interface AdjustmentTier {
/**
* What number to adjust the capacity with
*
* The number is interpeted as an added capacity, a new fixed capacity or an
* added percentage depending on the AdjustmentType value of the
* StepScalingPolicy.
*
* Can be positive or negative.
*/
readonly adjustment: number;
/**
* Lower bound where this scaling tier applies.
*
* The scaling tier applies if the difference between the metric
* value and its alarm threshold is higher than this value.
*
* @default -Infinity if this is the first tier, otherwise the upperBound of the previous tier
*/
readonly lowerBound?: number;
/**
* Upper bound where this scaling tier applies
*
* The scaling tier applies if the difference between the metric
* value and its alarm threshold is lower than this value.
*
* @default +Infinity
*/
readonly upperBound?: number;
}