github ministackorg/ministack v1.3.44

5 hours ago

What's Changed

[1.3.44] — 2026-05-19

Added

  • Standard AWS ECS Docker labels on RunTask containers — every container MiniStack spawns for an ECS task now carries the five canonical com.amazonaws.ecs.* labels real ECS sets (cluster ARN, container-name, task-arn, task-definition-family, task-definition-version), matching the keys and values documented in the AWS ECS container metadata file spec. Lets host-side log shippers, monitoring agents, and docker ps --filter "label=…" queries identify containers the same way they would against real ECS. Contributed by @YakirOren.
  • Step Functions JSONata standard library expanded — the JSONata evaluator now ships every built-in function called out in the ticket, plus the parity-edge cases AWS/JSONata require: string ($uppercase, $lowercase, $substring, $trim, $contains, $split, $join, $replace, $pad), numeric ($sum, $average, $max, $min, $abs, $floor, $ceil, $round, $power, $sqrt, $formatNumber), array ($sort — including the function($l, $r){...} comparator form — $reverse, $distinct, $append), object ($keys, $values, $lookup over both objects and arrays-of-objects, $exists distinguishing missing paths from explicit null per JSONata spec), type ($type, $boolean — falsy for arrays of only-falsy values), date/time ($now() / $now(picture) / $now(picture, timezone) with the XPath-3.1 picture-string subset, $millis), and utility ($uuid, $base64encode, $base64decode). $contains, $split, and $replace accept JSONata regex literals (/pattern/flags), with $1/$& substitution refs supported in $replace. The headline ticket example "Condition": "{% $exists($states.input.userId) %}" now routes correctly whether the field is present, explicitly null, or missing. Implemented natively in Python with no new runtime dependency. Reported by @youngkwangk.

Fixed

  • RDS Data API no longer acknowledges writes through the SQL stub for real containers that are still booting — when a Docker-backed RDS instance is configured but its container is still bootstrapping, ExecuteStatement / BatchExecuteStatement previously fell back to the in-memory SQL stub on any connection error and returned a 200 acknowledging CREATE USER / GRANT statements that never reached MySQL. The fallback now only applies to control-plane-only clusters (no real container). Container-backed clusters whose endpoint can't be reached surface DatabaseUnavailableException (HTTP 504, the canonical AWS error code), so callers see the same transient-error shape they'd see against real RDS. Real SQL errors (lock-wait timeout, etc.) still surface as BadRequestException, not transient-unavailable. Contributed by @jayjanssen.
  • CreateDBInstance returns immediately with DBInstanceStatus="creating" for Docker-backed instances, matching real AWS — readiness finalisation runs on a daemon thread and transitions the instance to available or failed based on container liveness. Previously the call blocked inline for up to 60s. Image-side password mismatches (auth-denied during the readiness probe) log at WARNING with a remediation hint.
  • RDS Aurora MySQL local endpoint and master-user parity — Aurora cluster endpoints now track the reachable backing DB instance endpoint after cluster members are created, so Lambda containers using DescribeDBClusters.Endpoint can connect to MiniStack-backed databases. MySQL and Aurora MySQL containers also grant the configured master username AWS/RDS-like global privileges after the server is reachable, with version-specific dynamic privileges treated as best-effort. Contributed by @jayjanssen.

Don't miss a new ministack release

NewReleases is sending notifications on new releases.