packages/aws-cdk-lib/aws-applicationautoscaling/lib/step-scaling-action.ts (58 lines of code) (raw):
import { Construct } from 'constructs';
import { CfnScalingPolicy } from './applicationautoscaling.generated';
import { IScalableTarget } from './scalable-target';
import * as cdk from '../../core';
import { ValidationError } from '../../core/lib/errors';
/**
* Properties for a scaling policy
*/
export interface StepScalingActionProps {
/**
* The scalable target
*/
readonly scalingTarget: IScalableTarget;
/**
* A name for the scaling policy
*
* @default Automatically generated name
*/
readonly policyName?: string;
/**
* How the adjustment numbers are interpreted
*
* @default ChangeInCapacity
*/
readonly adjustmentType?: AdjustmentType;
/**
* Grace period after scaling activity.
*
* For scale out policies, multiple scale outs during the cooldown period are
* squashed so that only the biggest scale out happens.
*
* For scale in policies, subsequent scale ins during the cooldown period are
* ignored.
*
* @see https://docs.aws.amazon.com/autoscaling/application/APIReference/API_StepScalingPolicyConfiguration.html
* @default No cooldown period
*/
readonly cooldown?: cdk.Duration;
/**
* 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);
// Cloudformation requires either the ResourceId, ScalableDimension, and ServiceNamespace
// properties, or the ScalingTargetId property, but not both.
// https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-applicationautoscaling-scalingpolicy.html
const resource = new CfnScalingPolicy(this, 'Resource', {
policyName: props.policyName || cdk.Names.uniqueId(this),
policyType: 'StepScaling',
scalingTargetId: props.scalingTarget.scalableTargetId,
stepScalingPolicyConfiguration: {
adjustmentType: props.adjustmentType,
cooldown: props.cooldown && props.cooldown.toSeconds(),
minAdjustmentMagnitude: props.minAdjustmentMagnitude,
metricAggregationType: props.metricAggregationType,
stepAdjustments: cdk.Lazy.any({ produce: () => this.adjustments }),
} as CfnScalingPolicy.StepScalingPolicyConfigurationProperty,
});
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;
}