ScalingFactory.java
package com.cloudforgeci.api.scaling;
import com.cloudforgeci.api.core.annotation.BaseFactory;
import com.cloudforge.core.annotation.DeploymentContext;
import software.amazon.awscdk.Duration;
import software.amazon.awscdk.services.applicationautoscaling.EnableScalingProps;
import software.amazon.awscdk.services.autoscaling.AutoScalingGroup;
import software.amazon.awscdk.services.ecs.*;
import software.amazon.awscdk.services.ecs.CpuUtilizationScalingProps;
import software.constructs.Construct;
public class ScalingFactory extends BaseFactory {
@DeploymentContext("minInstanceCapacity")
private Integer minInstanceCapacity;
@DeploymentContext("maxInstanceCapacity")
private Integer maxInstanceCapacity;
@DeploymentContext("cpuTargetUtilization")
private Integer cpuTargetUtilization;
@DeploymentContext("enableAutoScaling")
private Boolean enableAutoScaling;
public ScalingFactory(Construct scope, String id) {
super(scope, id);
}
@Override
public void create() {
// ScalingFactory doesn't create infrastructure directly
// It provides scaling methods for other factories to use
// The create() method is required by BaseFactory but not used for this factory
}
public void scale(final FargateService service) {
// Check if auto-scaling is explicitly disabled
if (Boolean.FALSE.equals(enableAutoScaling)) {
return; // Auto-scaling explicitly disabled
}
// Only enable scaling if maxInstanceCapacity > 1
// Use injected DeploymentContext values via annotations
if (maxInstanceCapacity == null || maxInstanceCapacity <= 1) {
return; // No scaling configuration
}
// Use injected values or defaults
int minCapacity = minInstanceCapacity != null ? minInstanceCapacity : 1;
int maxCapacity = maxInstanceCapacity;
int targetUtilization = cpuTargetUtilization != null ? cpuTargetUtilization : 60;
ScalableTaskCount scalable = service.autoScaleTaskCount(
EnableScalingProps.builder()
.minCapacity(minCapacity)
.maxCapacity(maxCapacity)
.build());
scalable.scaleOnCpuUtilization("CpuScaleSvc",
CpuUtilizationScalingProps.builder()
.targetUtilizationPercent(targetUtilization)
.scaleInCooldown(Duration.minutes(2))
.scaleOutCooldown(Duration.minutes(2))
.build());
}
public void scale(final AutoScalingGroup asg) {
// Check if auto-scaling is explicitly disabled
if (Boolean.FALSE.equals(enableAutoScaling)) {
return; // Auto-scaling explicitly disabled
}
// Use injected cpuTargetUtilization or default to 60%
int targetUtilization = cpuTargetUtilization != null ? cpuTargetUtilization : 60;
asg.scaleOnCpuUtilization("CpuScaleAsg",
software.amazon.awscdk.services.autoscaling.CpuUtilizationScalingProps.builder()
.targetUtilizationPercent(targetUtilization)
.cooldown(Duration.minutes(2))
.build());
}
}