What's Changed
New Contributors
[1.3.51] — 2026-05-27
Added
- DynamoDB Backups —
CreateBackup,DescribeBackup,DeleteBackup,ListBackups,RestoreTableFromBackup, andRestoreTableToPointInTime. Restore rebuilds the target table with the snapshot's items, key schema, and indexes;BillingModeOverride,GlobalSecondaryIndexOverride, andLocalSecondaryIndexOverrideare honored. State persists across restarts via the existing ministack persistence hooks. - DynamoDB Export / Import —
ExportTableToPointInTime,DescribeExport,ListExports,ImportTable,DescribeImport,ListImports. Both ops are idempotent onClientToken. The emulator completes exports synchronously and re-creates the destination table fromTableCreationParameterson import. Driven by the dynamodb-conformance.org gap report. - DynamoDB Contributor Insights —
UpdateContributorInsights,DescribeContributorInsights,ListContributorInsights. ENABLING→ENABLED and DISABLING→DISABLED state machine matches the way real AWS settles status on subsequentDescribecalls; optionalIndexNameis validated against the table's GSI list. - DynamoDB Resource-Based Policies —
PutResourcePolicy,GetResourcePolicy,DeleteResourcePolicywith full revision-id semantics.ExpectedRevisionIdmismatches raisePolicyNotFoundException, including theNO_POLICYconditional path documented in the AWS API reference. Policy size is capped at 20 KB per the AWS quota. - DynamoDB PartiQL transactions and batches —
BatchExecuteStatementandExecuteTransaction, includingClientRequestTokenidempotency, all-or-nothing rollback on any statement failure, andDuplicateItemExceptiononINSERTagainst an existing primary key.ExecuteStatementnow also returnsConsumedCapacitywhenReturnConsumedCapacityis set. - DynamoDB
DescribeLimits— returns canonical account- and table-level read/write capacity limits. - EC2
CreateSecurityGroupreturnsSecurityGroupArn,DeleteSecurityGroupreturns the deletedGroupId, andRevokeSecurityGroupEgressreturnsRevokedSecurityGroupRules— security group lifecycle responses now carry the fields real AWS emits, so workflows that inspect create / revoke / delete output get the same shapes as production. Contributed by @Areson.
Fixed
- DynamoDB item-level validation —
PutItem,BatchWriteItem, andTransactWriteItemsnow reject emptySS/NS/BS, duplicate set elements, and empty strings for hash or sort key values. Numbers are canonicalized (leading-zero strip, negative-zero normalization, trailing-decimal trim) and bounded to 38 significant digits and magnitude[1E-130, 9.9999...E+125]. The 400 KB item-size cap is now enforced with attribute names contributing to the total per the AWS Developer Guide accounting. - DynamoDB batch caps —
BatchWriteItemrejects more than 25 requests,BatchGetItemrejects more than 100 keys, both with the AWS-canonical validation error. Duplicate target keys are rejected in both ops, andBatchGetItemagainst a non-existent table now raisesResourceNotFoundExceptionup front instead of silently routing the table toUnprocessedKeys. - DynamoDB transaction caps and accounting —
TransactWriteItemsandTransactGetItemscap at 100 actions,TransactWriteItemscaps at 4 MB total payload, both reject duplicate target keys, and both returnConsumedCapacityat 2× the per-item rate per the AWS Developer Guide.ClientRequestTokenidempotency raisesIdempotentParameterMismatchExceptionon payload mismatch. - DynamoDB
CreateTablevalidation — table name pattern[A-Za-z0-9_.-]+and length 3-255, exactly oneHASHand at most oneRANGEinKeySchema, every key attribute must appear inAttributeDefinitionswith no unused entries, duplicateIndexNameacross LSI/GSI rejected, LSIs require aRANGEkey on the base table and must use the sameHASHkey,BillingModeenum enforced,ProvisionedThroughputonly allowed onPROVISIONEDtables.TableClass,OnDemandThroughput, and AWS-managed-keySSEDescriptionnow round-trip viaDescribeTable. - DynamoDB
UpdateTablevalidation — rejects PROVISIONED → PROVISIONED no-op, rejectsProvisionedThroughputwithPAY_PER_REQUEST, rejects zero or negative capacity values, validatesTableClassenum, adds GSI duplicate-name and undefined-attribute detection, and returnsResourceNotFoundExceptionwhen deleting or updating a non-existent GSI.OnDemandThroughputchanges round-trip viaDescribeTable. Deletion protection onDeleteTableis enforced. - DynamoDB
Queryvalidation —KeyConditionExpressionmay only reference key attributes (returnsQuery condition missed key schema elementon violation), emptyKeyConditionExpressionrejected,Selectenum enforced (ALL_PROJECTED_ATTRIBUTESonly on an indexed query,SPECIFIC_ATTRIBUTESrequires aProjectionExpressionorAttributesToGet),ConsistentRead=trueon a GSI rejected,Limit >= 1enforced, malformedExclusiveStartKeyrejected. - DynamoDB
Scanvalidation —Segment/TotalSegmentsco-requirement and range checks,Limit >= 1,ConsistentReadon a GSI rejected,Selectenum same asQuery,ScanFilter+FilterExpressionmutually exclusive,AttributesToGet+ProjectionExpressionmutually exclusive. - DynamoDB
UpdateItemsemantics —SETreferences now resolve against the pre-update snapshot of the item (soSET a = b, b = :vassigns the OLD value ofbtoa), an intermediate path that doesn't exist is rejected, hash- and range-key attribute mutation is rejected,REMOVEwithReturnValues=UPDATED_NEWomitsAttributesfrom the response (no new values to report), and emptyUpdateExpressionis rejected. - DynamoDB
GetItemProjectionExpressionhonors nested paths — nested map paths (level1.level2.leaf), list indexes (items[1]), combined nested + index (rec.tags[0]), and multiple sibling paths under the same root all return the correctly-pruned attribute tree instead of the whole root attribute. - DynamoDB
ReturnValuesandReturnItemCollectionMetricsper op — invalidReturnValuesenum is rejected per op (PutItemandDeleteItemonly acceptNONEandALL_OLD), invalidReturnItemCollectionMetricsrejected, andSIZEreturns the AWS shape{ItemCollectionKey, SizeEstimateRangeGB}on tables with at least one LSI. - DynamoDB binary keys order bytewise and
size()counts UTF-16 code units — binary sort keys are compared after base64 decoding sob'\x01' < b'\xff',begins_withon binary now decodes both operands before comparing prefixes, andsize(s)returns the UTF-16 code-unit count for strings (a surrogate-pair emoji counts as 2) and the decoded byte length for binary, matching the AWS Developer Guide. - DynamoDB rejects unaliased AWS reserved keywords in expressions — every bare identifier in
ConditionExpression,UpdateExpression,FilterExpression,KeyConditionExpression, orProjectionExpressionthat matches the canonical AWS DynamoDB reserved-word list is now rejected withAttribute name is a reserved keyword; reserved keyword: <word>. Users must alias the name viaExpressionAttributeNamesexactly as with real AWS. - DynamoDB rejects redundant parentheses and
contains(x, x)— the((expr))pattern is rejected across all expression fields (returns the AWS "expression has redundant parentheses" validator), andcontains()with structurally identical operands is rejected with the AWS "operands must be distinct" message. - DynamoDB
ExpressionAttributeNames/ExpressionAttributeValuesbookkeeping — every defined#aliasand:placeholdermust be referenced by some expression in the request, and every#aliasor:placeholderused in an expression must be defined. Mismatches return the AWS-canonical "unused" or "not defined" validation error instead of silently passing. - DynamoDB PartiQL
INSERTagainst an existing item now raisesDuplicateItemException— previously emittedConditionalCheckFailedException. Matches the error code listed in botocore'sExecuteStatementservice-2.json shape. - DynamoDB
TagResource/UntagResource/ListTagsOfResourcevalidate theResourceArn— non-DynamoDB ARNs and ARNs pointing at non-existent tables now returnValidationExceptionandResourceNotFoundExceptionrespectively, instead of silently storing tags against a phantom resource. - DynamoDB
UpdateTimeToLiverejects emptyAttributeName— matches AWS shape validation. - EC2
DescribeSecurityGroupsdistinguishes malformed IDs from missing ones — malformed security group IDs now returnInvalidGroupId.Malformedand valid-looking but unknown IDs continue to returnInvalidGroup.NotFound, matching the way AWS classifies the two failure modes. Contributed by @Areson. - Glue
StartJobRunno longer auto-pulls a missing image — Spark jobs that target a Glue Docker image now check whether the image is already present locally and stub the run toSUCCEEDEDwhen it is not, instead of triggering a multi-gigabyte pull on the request path. - MWAA worker containers auto-remove on exit — Airflow task containers spawned by the MWAA emulator now self-clean instead of leaving stopped containers on the Docker daemon after every DAG run.