What's Changed
New Contributors
- @hectormauer made their first contribution in #507
[1.3.17] — 2026-04-28
Added
ministackorg/ministack:fullDocker variant — Debian/glibc-based superset of the regular Alpine image, addingduckdb(Athena engine),psycopg2-binary(PostgreSQL driver), andpymysql(MySQL driver). DuckDB and psycopg2 shipmanylinuxwheels but nomusllinuxwheels, so on Alpine they either fall back to source-builds or silently disable themselves; the:fulltag installs them cleanly. Published in lockstep with the regular image on every release::fullalways points at the latest Debian build, alongside:{version}-fulland:{major}.{minor}-full. The regular:latest/:{version}tags are unchanged. Full image reportsedition: fullon/_ministack/health; regular reportsedition: light. Closes the long-standing Athena-on-Alpine gap raised by @arischow.- STS
GetWebIdentityTokenaction — implements AWS-spec validation:SigningAlgorithmis required and must beRS256orES384;Audience.member.Nis required, 1–10 items × 1–1000 chars;DurationSecondsis bounded 60–3600 (default 300). Returns a parseable JWT for OIDC dev flows. Signature is HS256 (not the publicly-verifiable RS256/ES384 real STS publishes via JWKS) — sufficient for emulator workloads that inspect claims, not for clients that verify against AWS JWKS. Requested by @anghel93.
Fixed
- Step Functions child execution integrations now return child execution metadata —
arn:aws:states:::states:startExecutionstarts the nested execution and returnsExecutionArn/StartDateinstead of echoing the request payload.arn:aws:states:::aws-sdk:sfn:startExecutionnow accepts AWS Step Functions' PascalCase integration parameters (StateMachineArn,Input,Name) by translating them to MiniStack's lower-camel Step Functions API shape. Existing.syncand.waitForTaskTokenpaths preserved. Contributed by @jayjanssen. - STS
GetCallerIdentityreturnedarn:aws:iam::{account}:rootregardless of credentials — tests obtaining temporary credentials viaAssumeRoleand then verifying the assumed-role identity could never confirm the role. Handler now extracts theAccessKeyIdfrom the SigV4Authorizationheader and looks it up in a session map populated byAssumeRole/AssumeRoleWithWebIdentity, returning the matchingarn:aws:sts::{account}:assumed-role/{role}/{session}ARN and{role-id}:{session}UserId. Falls back to root for non-session credentials. Contributed by @hectormauer. - S3 virtual-hosted-style routing broke on non-
localhostendpoints —_S3_VHOST_REwas anchored to_MINISTACK_HOST(defaultlocalhost), so requests withHost: bucket.ministack:4566(Docker Compose service name) or any custom hostname fell through to S3 path-style with the wrong bucket — silently breaking AWS SDK for JavaScript v3 setups. Replaced with_extract_s3_vhost_bucket(host)which validates against AWS bucket-naming rules (3–63 chars, lowercase + digits + dots + hyphens, alphanum start/end, no.., not IPv4) and accepts any tail — vhost works againstlocalhost,ministack, custom DNS, ors3.amazonaws.comwithout configuration. Verified against 40 host-header cases. The dead vhost branch ins3.py:_parse_bucket_keyis removed since the rewrite happens at the routing layer. Reported by @mgius-ae. - Lambda routing missed every API path that wasn't
/2015-03-31/functions— the path-based service detector only matched the original Lambda API version date, so unsigned requests to/2019-09-25/functions/.../event-invoke-config(PutFunctionEventInvokeConfig),/2019-09-30/functions/.../provisioned-concurrency,/2021-10-31/functions/.../url,/2018-10-31/layers,/2015-03-31/event-source-mappings,/2015-03-31/tags,/2016-08-19/account-settings,/2018-06-01/runtime/..., and/2020-04-22/code-signing-configs/...all fell through to S3. boto3 always signs (so it routed via SigV4 credential scope), but raw HTTP / curl / the Lambda Runtime API itself missed. Detector now matches^/{date}/{lambda-resource}/...for every documented resource. - CloudFormation
AWS::Lambda::Functionnever fetched S3 code —_lambda_createstoredCode.S3Bucket/Code.S3Keyas metadata but never resolved them against the in-memory S3 service, so every CFN-deployed S3-backed Lambda hadcode_zip = Noneand failed to invoke. InlineZipFilewas unaffected; everything else broken. Provisioner now fetches the bytes via the standard Lambda S3 helper. Contributed by @hiddengearz. - Lambda warm-worker execution path was missing standard runtime env vars —
lambda_runtime.py's warm-worker path didn't injectAWS_REGION,AWS_DEFAULT_REGION,AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEY,AWS_SESSION_TOKEN,AWS_LAMBDA_FUNCTION_VERSION, orAWS_LAMBDA_LOG_STREAM_NAME, while the Docker execution path already did. Functions callingboto3.client(...), X-Ray tracers, CloudWatch metric emitters, and any code branching on$LATESTvs published versions ran with an inconsistent environment compared to AWS. Warm-worker now injects the full set, matching Docker mode and AWS spec. Contributed by @hiddengearz. - 4 AWS wire-format compliance bugs. STS
AssumeRole/AssumeRoleWithWebIdentityreturnedarn:aws:iam::...:assumed-role/...for the assumed-role principal — real AWS usesarn:aws:sts::...:assumed-role/{role}/{session}(any IAM-policyCondition: aws:PrincipalArnchecking against the sts shape would mismatch). API Gateway v1PutIntegrationreturned HTTP 200 instead of 201. EventBridgeStartReplaystarted inRUNNINGstate instead ofSTARTING(background thread still transitionsRUNNING→COMPLETED). SNSSubscribereturnedPendingConfirmationasSubscriptionArnfor HTTP/email pending subscriptions — real AWS returns lowercasepending confirmation(with the space).