autoscaling

A zero-dependency, in-process fake of AWS Auto Scaling (EC2 Auto Scaling groups, launch configurations, and launch templates). Speaks the AWS Query (XML) wire protocol (API version 2011-01-01, member-style lists), so the real @aws-sdk/client-auto-scaling works against it unchanged.

Port4706
ProtocolAWS Query / XML (API version 2011-01-01, member-style lists)
HealthGET /_parlel/health
ResetPOST /_parlel/reset

Default connection

AWS_ENDPOINT_URL=http://127.0.0.1:4706
AWS_ACCESS_KEY_ID=parlel
AWS_SECRET_ACCESS_KEY=parlel
AWS_REGION=us-east-1

Any SigV4 credentials are accepted (auth is not verified).

Implemented operations

CategoryOperations
Auto Scaling groupsCreateAutoScalingGroup, DescribeAutoScalingGroups, UpdateAutoScalingGroup, DeleteAutoScalingGroup, SetDesiredCapacity
Launch configurationsCreateLaunchConfiguration, DescribeLaunchConfigurations
Launch templatesCreateLaunchTemplate (technically an EC2-API operation, included here for convenience)

Setting/updating DesiredCapacity synthesizes or removes placeholder instances (i-…) so describes reflect the requested capacity.

SDK usage example

import { AutoScalingClient, CreateAutoScalingGroupCommand, SetDesiredCapacityCommand } from "@aws-sdk/client-auto-scaling";

const asg = new AutoScalingClient({
  endpoint: "http://127.0.0.1:4706",
  region: "us-east-1",
  credentials: { accessKeyId: "parlel", secretAccessKey: "parlel" },
});

await asg.send(new CreateAutoScalingGroupCommand({
  AutoScalingGroupName: "web-asg",
  LaunchConfigurationName: "web-lc",
  MinSize: 1, MaxSize: 5, DesiredCapacity: 2,
  AvailabilityZones: ["us-east-1a"],
}));
await asg.send(new SetDesiredCapacityCommand({ AutoScalingGroupName: "web-asg", DesiredCapacity: 4 }));

Access via MCP / preview URL

When running inside a Daytona sandbox, this HTTP service is exposed at an automatically-provisioned preview URL. Point the SDK endpoint at that URL and add the x-daytona-preview-token header on requests.

Surface coverage

This emulator faithfully replicates the API surface most application code and agents exercise. Anything below the supported lines is either an intentional design choice for a fast, zero-cost local emulator (✓ By design) or a candidate for a future release (⟳ Roadmap) — never a silent inaccuracy.

Legend: ✅ fully supported · ◐ accepted (stored, not strictly enforced) · ✓ by design · ⟳ on the roadmap.

AreaStatusNotes
CreateAutoScalingGroupFull request parsing, required-field validation, duplicate name detection.
DescribeAutoScalingGroupsFilter by name, all response fields including empty elements for optional fields.
UpdateAutoScalingGroupPartial update of min/max/desired/cooldown/health check/AZs.
DeleteAutoScalingGroupResourceInUse guard, ForceDelete support.
SetDesiredCapacityScales synthetic instances up/down to match desired capacity.
CreateLaunchConfigurationFull field set: ImageId, InstanceType, KeyName, SecurityGroups, UserData, EbsOptimized, InstanceMonitoring, etc.
DescribeLaunchConfigurationsFilter by name, all response fields.
CreateLaunchTemplateMinimal single-version template; returns LaunchTemplateId (lt-…).
Error envelopeMatches real AWS XML error shape: ErrorResponse > Error > Type/Code/Message + RequestId. Status codes match real API.
Response XML namespacehttps://autoscaling.amazonaws.com/doc/2011-01-01/ (matches real API).
Empty element handlingOptional empty fields rendered as self-closing <tag/> (matches real API).
Instances✓ by designSynthetic placeholders (i-…); nothing launched in the EC2 emulator.
Scaling policies⟳ roadmapTarget tracking / step scaling policies & CloudWatch alarms are not implemented.
Lifecycle hooks⟳ roadmapLifecycle hooks, warm pools, and instance refresh are not modeled.
Health checksHealthCheckType is recorded but no health evaluation happens.
Launch templatesA minimal single-version template only; CreateLaunchTemplateVersion is not implemented.
MixedInstancesPolicy⟳ roadmapNot yet parsed or stored.
Auth✓ by designSigV4 is accepted but never validated.
Persistence✓ by designIn-memory; lost on restart/reset.

Error codes & shapes

Errors follow the real AWS Auto Scaling XML error envelope:

<ErrorResponse xmlns="https://autoscaling.amazonaws.com/doc/2011-01-01/">
  <Error>
    <Type>Sender</Type>
    <Code>ValidationError</Code>
    <Message>Human-readable error message</Message>
  </Error>
  <RequestId>…</RequestId>
</ErrorResponse>
CodeHTTP StatusWhen
ValidationError400Missing required field, invalid action, invalid parameter.
AlreadyExists400Duplicate ASG or launch configuration name.
InvalidParameterValue400Reserved for future validation.
InvalidParameterCombination400Reserved for future validation.
MissingParameter400Reserved for future validation.
ResourceInUse400DeleteAutoScalingGroup with instances and no ForceDelete.
InternalFailure500Unhandled server error.

The <Type> element is Sender for 4xx errors and Receiver for 5xx errors, matching the real AWS behavior.

Manifest

{
  "name": "autoscaling",
  "version": "0.1",
  "port": 4706,
  "protocol": "http",
  "healthcheck": "/_parlel/health"
}
<!-- parlel:testenv:start -->

Configuration — test.env

Copy these into your test.env (used by the bridge sidecar flow). Tokens are Parlel's seeded test credentials — any non-empty value is accepted by the emulator, so you rarely need to change them. Swap in real credentials only when pointing at the live service in prod.env.

AWS_ACCESS_KEY_ID=parlel
AWS_SECRET_ACCESS_KEY=parlel
AWS_REGION=us-east-1
AWS_ENDPOINT_URL=http://parlel-bridge:4706
<!-- parlel:testenv:end -->