Build1 distinct publisher3 min readUpdated
Scaling policies on ECS, ASG, VMSS and MIG are separate API objects with last-writer-wins semantics. That is why inherited scaling behavior stays wrong, and why nobody gets told when it changes.
The Engineer · Build desk
Compiled by The EngineerSomething wrong?How this is made
A writeup on dev.to about adopting autoscaling config you did not write names the mechanism more precisely than most drift discussions manage: across ECS, ASG, VMSS and MIG, the scaling policy is its own object, with multiple possible writers and last-writer-wins semantics [1]. Nothing merges and nothing warns, which means the real scaling behavior of production can change with no deploy, no PR and no alert [1][5].
The specifics differ by platform only in blast radius. On AWS, ASG scaling policies and the Application Auto Scaling targets and policies behind ECS services are separate API objects; if Terraform or CloudFormation declares them, the next apply silently reverts every console tweak made since, including the incident-era threshold that turned out to be load-bearing [3]. The inverse is equally common: a policy created by hand in the console is invisible to the code, survives right up until someone cleans up drift, and then disappears [4]. Azure VMSS autoscale is a single autoscaleSettings resource containing profiles and rules, so portal edits modify it in place and the next ARM, Bicep or Terraform deployment that also defines it replaces the whole object; you do not lose one rule, you lose the entire tuned profile set at once [6]. On GCP, the MIG autoscaler is likewise its own attached object, gcloud edits and Terraform definitions overwrite each other whole, and a MIG that gets deleted and recreated comes back with whatever the code says rather than what the console said [7].
The ordering advice in the piece is the part worth stealing. Inventory from the API rather than from the repo, using describe-policies and describe-scaling-policies on AWS, az monitor autoscale list, and gcloud compute instance-groups managed list [8]. Then freeze before fixing: pick one source of truth, almost always the IaC, import the live policy objects verbatim including the warts, and diff until plan shows zero changes, so the first apply after adoption is a no-op [9]. Tuning while two writers still exist is the mistake that produces the next inherited mess.
Only once there is one honest copy do the smells become checkable, and the source lists six that inherited policies reliably contain: cooldowns under 120 seconds, which make the group oscillate on its own noise [10]; targets above 90 percent, where new capacity arrives after the damage and the policy functions as a post-incident notification system [11]; targets below 30 percent, which is permanent over-provisioning in an autoscaling costume [12]; min equal to max, which is a fixed fleet with extra steps [13]; no policy at all on a group everyone assumed had one [14]; and step policies stacked on target tracking against the same metric, two controllers on one wheel [15]. The usable target band implied by those two thresholds is 60 percentage points wide, which is a lot of room to be wrong inside [19].
Enforcement is the cheap half. CloudTrail records PutScalingPolicy and PutAutoScalingPolicy, Azure activity logs and GCP audit logs record their equivalents, so an alert on policy-write events whose principal is not the deploy pipeline converts the next silent overwrite into a loud one [16]. Incident-time tuning still works; it just arrives with a follow-up task to codify or revert instead of becoming un-owned state [17].
Watch two signals. The first plan after import should show zero changes, and if it does not, the import is not finished [9]. After that, watch for policy writes attributed to a human principal [16], and treat any tuning that changes target, cooldown and max in one apply as a lost experiment rather than a fix [18].
Follow any of these and your For You feed starts watching them — no settings page required.
Ranked by verification strength, evidence, and original report placement.
Teams inherit autoscaling config they did not write: the author left, the Terraform was half-applied, someone tuned a threshold in the console during an incident two years ago, and production scaling behavior is now an unknowable merge of code, clicks and defaults that everyone is afraid to touch.
Freeze before fixing: the worst adoption mistake is tuning while two writers still exist. Decide the single source of truth (almost always the IaC), export the live state into it verbatim including warts, import the live policy objects with terraform import or the ARM/gcloud equivalent, and diff until plan shows zero changes so the first apply after adoption is a no-op.
CloudTrail records PutScalingPolicy and PutAutoScalingPolicy, and Azure activity logs and GCP audit logs record policy writes; an alert on policy-write events that did not come from the deploy pipeline's principal turns the next silent overwrite into a loud one.
Across ECS, ASG, VMSS and MIG the pattern is identical: the autoscaling policy is a separate object with multiple possible writers and last-writer-wins semantics. Nothing merges. Nothing warns.
AWS ASG scaling policies and the Application Auto Scaling targets and policies used by ECS live as their own API objects; if Terraform or CloudFormation defines them, the next apply silently reverts every console tweak made since, including a load-bearing incident-era threshold change.
Policies created by hand in the AWS console are invisible to the code, survive until someone cleans up drift, and then vanish.
Evidence-backed comparisons of source perspectives and observed adoption signals. Read the methodology
Which Builder, Operator, and Investor concerns the observed source mix emphasized—not a truth score.
Evidence, demonstrated adoption, hype gap, incentives, and confidence are assessed independently, each on its own current evidence. How these are measured.
Verifiable mechanics, single unaudited source
The platform mechanics are stated precisely enough to be checked by a reader (named resource types, named CloudTrail events, four exact CLI commands, terraform import to a zero-change plan), which raises evidentiary quality above pure opinion. But the entire cluster is one practitioner blog post with no vendor documentation citations, no postmortems, no telemetry and no second publisher, and the quantitative prescriptions are asserted rather than measured.
No adoption signal in supplied sources
The cluster contains no release, deployment, benchmark, pricing, licensing, usage-disclosure or incident record. The source describes a recommended practice and does not report that any organization has adopted it, nor how widespread the described drift actually is. Nothing in the supplied material supports an adoption score.
Mild overclaim on the numbers, not the mechanism
The mechanism claims are proportionate and undersold rather than hyped: standalone policy objects with last-writer-wins semantics are described without vendor-bashing or product pitching. The overreach is narrower and numeric. Universal-sounding thresholds (cooldowns under about two minutes, targets outside 30-90 percent, 40-70 percent as where 'most services live') and the assertion that batch tuning 'teaches nothing' carry more confidence than the zero supporting data justifies, and there is no adoption evidence behind the prescribed runbook.
Low commercial pressure, low distortion
Higher values mean stronger incentive to distort. The sole source is an individual-authored dev.to post that recommends no vendor product, no paid tool and no service, and closes on an organizational fix (policies in code, owned by the paged team). The only visible incentive is practitioner reputation and engagement from a confident, prescriptive runbook, which plausibly explains the crisp unsourced thresholds but not any directional commercial bias.
Moderate on mechanism, weak overall
Confidence is limited primarily by cluster shape: one publisher, one item, no corroboration and no adoption evidence, so nothing can be triangulated. Within that limit the mechanism claims are internally consistent, cross-platform and independently checkable, and the ledger contains no contested items, which keeps confidence from falling further. The prescriptive numbers should be treated as one practitioner's heuristics.
build
Databricks quietly switched on dormant MANAGE grants. Check who just became an admin.1 distinct publisher
build
The three AWS defaults on your bill that nobody actually chose1 distinct publisher
build
Send kills, not scores: the leaderboard fix that turns anti-cheat into a schema decision1 distinct publisher
build
An agent built and deleted a prod stack. The alert fired on time and changed nothing1 distinct publisher
Distinct publishers with included, body-backed reporting in this cluster.
dev.to
1 article · August 21, 2026