overcast local AWS emulator

Service Reference

DynamoDB

DynamoDB accepts AWS JSON 1.0 and Smithy RPC v2 CBOR. JSON operations are identified by the X-Amz-Target header (e.g. DynamoDB_20120810.PutItem); CBOR operations use...

DynamoDB

AWS docs: https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/Welcome.html

DynamoDB accepts AWS JSON 1.0 and Smithy RPC v2 CBOR. JSON operations are identified by the X-Amz-Target header (e.g. DynamoDB_20120810.PutItem); CBOR operations use /service/DynamoDB/operation/<Operation> with Smithy-Protocol: rpc-v2-cbor.

All data types are supported in the request/response format. The emulator stores items in their DynamoDB JSON wire format internally to avoid serialisation round-trip issues.


Tables are region-scoped

A DynamoDB table is a regional resource, and Overcast models it as one. A table created in us-east-1 is invisible from eu-west-1: ListTables does not report it, DescribeTable answers ResourceNotFoundException, and the same table name can exist independently in both regions with entirely separate items, GSI index entries, ItemCount and stream records. Deleting the table in one region leaves the same-named table in the other untouched.

The region comes from the request, exactly as on AWS — the SigV4 credential scope, a regional endpoint hostname, or OVERCAST_DEFAULT_REGION when the request names none. A create in one region and a list in another therefore correctly disagree; that is the emulated behaviour, not a bug.

Upgrading an existing database. Before this, item rows, GSI index entries and stream records were keyed by table name alone, so same-named tables in different regions shared them. A startup migration rewrites existing rows to the region their table was created in, which is already recorded on disk, so single-region data carries over untouched. If the same table name existed in two regions, those regions genuinely shared one set of rows and nothing on disk says which write came from where: the rows are assigned to the alphabetically first of those regions and the others start out empty.


Known limitations

  • GSI consistency: real DynamoDB GSIs are eventually consistent; the emulator is immediately consistent — items are visible in GSI queries the instant they are written. Asking for a strongly consistent read on a GSI (ConsistentRead=true with a GSI IndexName) is still rejected with a ValidationException, exactly as AWS does, so code written against the emulator cannot come to depend on a read mode AWS has no way to serve.
  • TTL expiry is not enforced in real-time. Items with expired TTL are removed by a background sweeper (runs hourly), not lazily on read.
  • PartiQL (ExecuteStatement, ExecuteTransaction, BatchExecuteStatement) is explicitly out of scope for v1.
  • Every other modeled DynamoDB operation — global tables, backups, exports and imports, resource policies, contributor insights, PartiQL — answers 501 Not Implemented with x-emulator-unsupported: true, in DynamoDB’s own AWS JSON 1.0 error envelope. Only an X-Amz-Target naming no AWS operation at all gets 400 UnknownOperationException. The endpoint tables below name the global-table operations explicitly; the rest follow the same rule without being listed one by one.

Summary

Category✅ Supported❌ Unsupported
Table management71
Item operations6
Query & scan2
Transactions2
Tags3
Streams interoperability1
Global tables6

Endpoints

Table management

OperationStatusNotesAWS Docs
CreateTable✅ SupportedIncludes GSI/LSI definitions; an omitted BillingMode defaults to PROVISIONED, which requires ProvisionedThroughput on the table and on every GSI, while PAY_PER_REQUEST rejects itdocs
DeleteTable✅ Supporteddocs
DescribeTable✅ Supporteddocs
ListTables✅ SupportedRegion-scoped — lists only tables in the request’s region; Limit (default/max 100) and ExclusiveStartTableName honored; LastEvaluatedTableName echoed when more tables remaindocs
UpdateTable✅ SupportedBillingMode, ProvisionedThroughput, GSI create/delete/update-throughput, AttributeDefinitions, StreamSpecificationdocs
DescribeTimeToLive✅ Supporteddocs
UpdateTimeToLive✅ SupportedTTL-based item expiry; sweeper deletes expired items hourlydocs
RestoreTableFromBackup❌ Unsupporteddocs

Item operations

OperationStatusNotesAWS Docs
PutItem✅ SupportedIncludes ConditionExpression, ReturnValues (ALL_OLD); records AWS/DynamoDB CloudWatch metrics SuccessfulRequestLatency, ConsumedWriteCapacityUnits, UserErrors/SystemErrors (service-metrics-platform.md phase 2)docs
GetItem✅ SupportedIncludes ProjectionExpression; records SuccessfulRequestLatency, ConsumedReadCapacityUnits, UserErrors/SystemErrorsdocs
UpdateItem✅ SupportedSET/REMOVE/ADD/DELETE clauses; all ReturnValues variants; upsert; records SuccessfulRequestLatency, ConsumedWriteCapacityUnits, UserErrors/SystemErrorsdocs
DeleteItem✅ SupportedConditionExpression, ReturnValues (ALL_OLD); records SuccessfulRequestLatency, ConsumedWriteCapacityUnits, UserErrors/SystemErrorsdocs
BatchGetItem✅ SupportedUp to 100 items across tables; records SuccessfulRequestLatency/ConsumedReadCapacityUnits per table toucheddocs
BatchWriteItem✅ SupportedUp to 25 put/delete operations; records SuccessfulRequestLatency/ConsumedWriteCapacityUnits per table toucheddocs

Query & scan

OperationStatusNotesAWS Docs
Query✅ SupportedKeyConditionExpression, FilterExpression, Limit (applied before FilterExpression per AWS semantics), ExclusiveStartKey/LastEvaluatedKey pagination, ScanIndexForward, Select=COUNT; ConsistentRead=true on a GSI is rejected as AWS does; records SuccessfulRequestLatency and ConsumedReadCapacityUnits (with GlobalSecondaryIndexName when IndexName names a real GSI)docs
Scan✅ SupportedFilterExpression, Limit (applied before FilterExpression per AWS semantics), ExclusiveStartKey/LastEvaluatedKey pagination, parallel scan (Segment/TotalSegments), Select=COUNT; ConsistentRead=true on a GSI is rejected as AWS does; records SuccessfulRequestLatency and ConsumedReadCapacityUnits (with GlobalSecondaryIndexName when IndexName names a real GSI)docs

Transactions

OperationStatusNotesAWS Docs
TransactGetItems✅ SupportedUp to 100 items across tables; records SuccessfulRequestLatency/ConsumedReadCapacityUnits per table (2x weighted, matching AWS’s transactional-read capacity accounting)docs
TransactWriteItems✅ SupportedPut, Update, Delete, ConditionCheck; all-or-nothing; records SuccessfulRequestLatency/ConsumedWriteCapacityUnits per table (2x weighted, matching AWS’s transactional-write capacity accounting)docs

Tags

OperationStatusNotesAWS Docs
TagResource✅ SupportedMerges tags; max 50; validates key/value lengthsdocs
ListTagsOfResource✅ SupportedReturns tags as Key/Value arraydocs
UntagResource✅ SupportedRemoves specified keys; idempotent on missing keysdocs

Streams interoperability

OperationStatusNotesAWS Docs
GetShardIterator✅ SupportedTRIM_HORIZON, LATEST, AT/AFTER_SEQUENCE_NUMBERdocs

Global tables

OperationStatusNotesAWS Docs
CreateGlobalTable❌ UnsupportedOvercast emulates a single regiondocs
DescribeGlobalTable❌ UnsupportedOvercast emulates a single regiondocs
DescribeGlobalTableSettings❌ UnsupportedOvercast emulates a single regiondocs
ListGlobalTables❌ UnsupportedOvercast emulates a single regiondocs
UpdateGlobalTable❌ UnsupportedOvercast emulates a single regiondocs
UpdateGlobalTableSettings❌ UnsupportedOvercast emulates a single regiondocs