```const runnerAutoScalingTarget = new aws.appauto...
# getting-started
i
Copy code
const runnerAutoScalingTarget = new aws.appautoscaling.Target(
  `${solutionName}-autoscaling`,
  {
    minCapacity: autoScaleMinCapacity,
    maxCapacity: autoScaleMaxCapacity,
    resourceId: pulumi.interpolate`service/${solutionService.cluster.cluster.name}/${solutionService.service.name}`,
    scalableDimension: "ecs:service:DesiredCount",
    serviceNamespace: "ecs",
  }
);

const runnerScaleUpPolicy = new aws.appautoscaling.Policy(
  `${solutionName}-scaleup`,
  {
    policyType: "StepScaling",
    resourceId: runnerAutoScalingTarget.id,
    scalableDimension: runnerAutoScalingTarget.scalableDimension,
    serviceNamespace: "ecs",
    stepScalingPolicyConfiguration: {
      adjustmentType: "ChangeInCapacity",
      cooldown: 60,
      metricAggregationType: "Maximum",
      stepAdjustments: [
        {
          scalingAdjustment:2,
          metricIntervalUpperBound:"0",
        },
      ],
    },
  }
);

const runnerScaleDownPolicy = new aws.appautoscaling.Policy(
  `${solutionName}-scaledown`,
  {
    policyType: "StepScaling",
    resourceId: runnerAutoScalingTarget.id,
    scalableDimension: runnerAutoScalingTarget.scalableDimension,
    serviceNamespace: "ecs",
    stepScalingPolicyConfiguration: {
      adjustmentType: "ChangeInCapacity",
      cooldown: 60,
      metricAggregationType: "Maximum",
      stepAdjustments: [
        {
          scalingAdjustment: -1,
          metricIntervalUpperBound: "0",
        },
      ],
    },
  }
);

new aws.cloudwatch.MetricAlarm(
  `${solutionName}-high-metric`,
  {
    comparisonOperator: "GreaterThanOrEqualToThreshold",
    evaluationPeriods: 2,
    metricName: "CPUUtilization",
    namespace: "AWS/ECS",
    period: 60,
    statistic: "Maximum",
    threshold:40,
    dimensions: {
      ClusterName: apiCluster.cluster.name,
      ServiceName: solutionService.service.name,
    },
    alarmDescription: "Monitors CPU utilization",
    alarmActions: [runnerScaleUpPolicy.arn],
  }
);

new aws.cloudwatch.MetricAlarm(
  `${solutionName}-low-metric`,
  {
    comparisonOperator: "LessThanOrEqualToThreshold",
    evaluationPeriods: 2,
    metricName: "CPUUtilization",
    namespace: "AWS/ECS",
    period: 60,
    statistic: "Maximum",
    threshold: 25,
    dimensions: {
      ClusterName: apiCluster.cluster.name,
      ServiceName: solutionService.service.name,
    },
    alarmDescription: "Monitors CPU utilization",
    alarmActions: [runnerScaleDownPolicy.arn],
  }
);