What's Changed
New Contributors
- @Alexis-DevOps made their first contribution in #1677
[1.5.10] — 2026-09-10
Added
- Amazon Location — trackers and device positions — the service did not exist, so a client bound to it failed at the first call and a template with
AWS::Location::Trackerdid not deploy.CreateTracker,DescribeTracker,UpdateTracker,ListTrackersandDeleteTrackermanage trackers,BatchUpdateDevicePosition,GetDevicePosition,BatchGetDevicePositionandGetDevicePositionHistoryserve positions, andPositionFilteringapplies (TimeBasedstores one sample per 30 seconds per device,DistanceBasedignores a move under 30 m). Positions are held in memory, newest 100 per device, rather than for the service's 30 days. Contributed by @iot-rocket. - AWS Signer —
StartSigningJobwith its S3 side effect — thesignerAPI did not exist.StartSigningJob,DescribeSigningJob,ListSigningJobs,PutSigningProfileandGetSigningProfileare served natively; signing is synchronous and synthetic, so the marker object lands atprefix + jobIdbefore the call returns and a caller whose contract is the signed object never polls. A missing source object, destination bucket or profile isResourceNotFoundExceptionwith no job recorded. Contributed by @iot-rocket. - IoT Wireless —
GetPositionEstimate— the service was absent, so a client bound to it failed at the first call.POST /position-estimatenow answers the way the API is shaped: the output structure declares apayloadblob, so the body is the raw GeoJSONPointrather than a JSON envelope. The estimate resolves fromIpand is deterministic;WiFiAccessPoints,CellTowersandGnssare accepted and not resolved. Contributed by @iot-rocket. - Amazon Translate — batch text translation jobs — the service did not exist.
StartTextTranslationJob,DescribeTextTranslationJob,ListTextTranslationJobsandStopTextTranslationJobrun a job against the local S3 store, with the documented filters and paging. Contributed by @ppettitau. - Lambda Core — network connectors — Terraform's
aws_lambdacore_network_connectorfailed withFunction not found: /2026-04-04/network-connectors: the service signs with Lambda's own credential scope, so the request reached the function router and the path was read as a function name.CreateNetworkConnector,GetNetworkConnector,UpdateNetworkConnector,DeleteNetworkConnectorandListNetworkConnectorsnow serve that path, withClientTokenidempotency andMarker/MaxItemspaging. There is no VPC attachment behind a connector; it reachesACTIVEon the next read. Reported by @edersonbrilhante. - CloudFormation — the
Rulessection is evaluated — a template's rules were ignored; they now run after the parameters resolve and before any resource is touched, onCreateStack,UpdateStackandCreateChangeSet. A falseAssertrefuses the operation with itsAssertDescriptionas aValidationError, so the CDK'sCheckBootstrapVersionrule refuses an outdated bootstrap instead of passing silently. Contributed by @iot-rocket. - CloudFormation — the
AWS::Includetransform — an embeddedFn::TransformnamingAWS::Includewas carried into the stack as a literal key; it is now replaced by the contents of the S3 object itsLocationpoints to before the template is validated, and a location that is not ans3://URI, a missing object or a nested include is refused before a stack exists. Contributed by @iot-rocket.
Changed
- API Gateway — a REST method's
COGNITO_USER_POOLSauthorizer is enforced — the v1 data plane matched onlyNONE,AWS_IAMandCUSTOMand passed everything else through, so a method fronted by a user-pool authorizer served every caller andrequestContext.authorizer.claimswas never populated, leaving a handler that branches on claims to take its no-claims path locally while AWS denied the request. The token named by the authorizer'sidentitySourceis now verified against the pools inproviderARNsand its claims reach the backend; a method carryingauthorizationScopesrequires one of them and answers403otherwise.PutMethodalso stops discardingauthorizationScopes. Contributed by @ppettitau. - CloudFormation — the template and stack quotas are enforced — a template of any size, with any number of resources, parameters, outputs or mappings, and a stack name of any shape were accepted, so a template a real account refuses deployed. The body, resource, parameter, output and mapping limits and the stack-name pattern are now checked before a stack record exists, with the messages the API's parameter validation gives;
ValidateTemplatealso takesTemplateURL. Contributed by @iot-rocket. - CloudFormation —
Capabilitiesare enforced underAUTH=true—CreateStack,UpdateStackandCreateChangeSetaccepted a template with IAM resources or aTransformwhatever the request acknowledged, so a deploy CloudFormation refuses went through. WithAUTH=truethey now answerInsufficientCapabilitiesExceptionand create nothing. WithoutAUTHnothing changes. Contributed by @iot-rocket.
Fixed
- EC2 —
AvailabilityZoneIdis populated on subnets —DescribeSubnetsandCreateSubnetalways returnednull, even thoughDescribeAvailabilityZonesreported the correct mapping, and a consumer that recomputes the id when it is missing (the AWS Load Balancer Controller) can crash on that fallback. The id is now derived from the zone on every creation path, subnets restored from older state are backfilled, and the two members always name the same zone. Contributed by @Alexis-DevOps. - EC2 —
DescribeAvailabilityZonesreportsZoneType— the field was omitted entirely, so a consumer that branches on it read it as empty and refused to classify the subnet, blocking Service and Ingress reconciliation. Every zone now reportsavailability-zone. Contributed by @Alexis-DevOps. - EC2 —
CreateFleetapplies a launch template's instance tags — instances created by a fleet came back with an emptyTagslist even though the referenced launch template carriedTagSpecifications, which is the mechanism AWS documents for tagging fleet instances. The template'sinstancetags now reach the instances, with a request-level tag winning on a duplicate key. Reported by @edersonbrilhante. - Step Functions — numeric
*PathChoice comparisons —NumericLessThanPath,NumericGreaterThanPath,NumericLessThanEqualsPathandNumericGreaterThanEqualsPathsilently evaluated false, so a batch loop guarded by one never exited and eventually failed inStates.ArrayGetItem. The four operators now resolve the right operand from the input and compare it. Contributed by @jayjanssen. - SES —
SendBulkEmailis routed —POST /v2/email/outbound-bulk-emailsreached no handler, so the call failed instead of sending. It now routes to the v2 handler. Contributed by @jgrumboe. - Glue — the Data Catalog operations — the catalog operations were missing, so a client that creates or reads a catalog before its databases could not proceed. Catalog create, read and update are served.
Internal
- CI — install with uv and collect test shards in one pass — the shard planner ran
pytest --collect-onlyonce per marker filter for counts a single pass already has, and superseded pull-request runs competed for runners. Installs go through uv, one collection pass yields both counts, and a concurrency group cancels superseded runs (never onmain). No user-visible behavior changes. Contributed by @jgrumboe. - Lint —
F401is enforced — unused imports were ignored repo-wide pending a manual review; the review is done, the rule is on, and the four dead imports it found are gone. No user-visible behavior changes. - Testcontainers —
containerdbumped to 1.7.35 in the Go example module, picking up CVE-2026-53495. No user-visible behavior changes.