What's Changed
[1.3.21] — 2026-04-29
Added
- ElastiCache: real Redis replication groups + opt-in real Redis Cluster mode —
CreateReplicationGroupnow spawns live Redis containers per shard (was a metadata-only stub). BehindELASTICACHE_CLUSTER_MODE_REAL=1+DOCKER_NETWORK,NumNodeGroups=N/ReplicasPerNodeGroup=RprovisionsN × (1+R)cluster-enabled nodes, runsredis-cli --cluster create, and serves realCLUSTER SLOTS/MOVEDredirects.NumNodeGroups=2rejected withInvalidParameterValue(matches AWS: only 1 or ≥3 shards). Account-scoped container names +account_idlabel so accounts can sharerg_id; orphan-container reaper at startup. Reported by @akursar.
Fixed
- ElastiCache list responses wrapped items in
<member>instead of the AWS-spec element name —DescribeCacheClustersand 10 other list-emitting ops emitted<member>where AWS uses the model-declaredlocationName(e.g.<CacheCluster>,<Tag>,<Snapshot>). Strict generated SDKs (aws-sdk-go-v2, Java/Rust v2) parse a<member>-wrapped list as empty; botocore is permissive, so boto3 / CLI users never saw it. 16 sites fixed; the 5 remaining<member>sites (UserList,UserGroupList,UserIdList, etc.) match AWS. Verified against botocore service-2.json. Reported by @jmickey (#530). - RDS error codes carried a stale
Faultsuffix on two not-found shapes —DescribeDBInstances(and 7 other DBInstance ops) emitted<Code>DBInstanceNotFoundFault</Code>while real AWS returns<Code>DBInstanceNotFound</Code>;DescribeDBParameters(and 9 other DBParameterGroup ops) emitted<Code>DBParameterGroupNotFoundFault</Code>while real AWS returns<Code>DBParameterGroupNotFound</Code>. Verified againstbotocore/data/rds/2014-10-31/service-2.json(the wireerror.codediffers from the shape name on ~19 RDS not-found errors — these two were the ones ministack emitted with the wrong wire code). Breaks string-matching consumers like the ACK RDS controller'ssdkFind, which comparesawsErr.ErrorCode() == "DBInstanceNotFound"to detect the not-found branch and reach the create path; with theFaultsuffix the branch never matched and the CR sat atReady=False. Also affectsaws-sdk-go-v2(smithy.APIError.ErrorCode()) and any boto3 caller matching one.response["Error"]["Code"]. Reported by @jmickey. - RDS error responses were missing
<Type>Sender</Type>/<Type>Receiver</Type>— real AWS Query-protocol error envelopes include the fault type alongside<Code>and<Message>. The_errorhelper now emitsSenderfor 4xx andReceiverfor 5xx. Cosmetic for SDKs that read<Code>only, but completes the documented AWS shape. - API Gateway REST API (v1): pagination missing on 10 list operations —
GetRestApis,GetResources,GetDeployments,GetAuthorizers,GetModels,GetApiKeys,GetUsagePlans,GetUsagePlanKeys,GetDomainNames, andGetBasePathMappingsignored the AWS-speclimit(default 25, max 500) +positionquery params and always returned the full list with nopositioncursor. Pagination-aware SDKs that round-trip the cursor (boto3 paginators, AWS CLI--max-items/--starting-token, Java SDK v2) silently received the same first page on every call. The 10 ops now slice perlimit, return an opaque base64url-encodedpositiontoken when more pages remain, and reject malformed tokens withBadRequestException.GetStagesis correctly not paginated — its AWS shape has nolimit/positionfields. - API Gateway REST API (v1)
PutMethodResponseandPutIntegrationResponsereturned HTTP 200 instead of 201. Real AWS returns 201 on resource creation (verified againstbotocore/data/apigateway/2015-07-09/service-2.json); the AWS CLI prints the resource on 201 and is silent on 200, so scripts that branched on stderr would diverge. The remaining v1 Create/Put ops already returned 201.