Tables for DynamoDB users
Use this page if you already designed tables the DynamoDB way and want to know what carries over. Partition keys, sort keys, typed attributes, conditions, and GSIs mostly do. Your AWS client and endpoint do not: Tables is a native Skippr Cloud API with CloudTables.* targets and SigV4 service code tables.
Status: Preview — same commands as Tables.
At a glance
| Question | Answer |
|---|---|
| Can I keep partition and sort key designs? | Yes |
| Can I keep AttributeValue-shaped JSON? | Yes |
| Can I use conditional, batch, and transactional calls? | Yes, for the supported operations below |
| Can I point a stock DynamoDB SDK at this endpoint? | No |
| Are reads eventually consistent? | No; all current reads are strongly consistent |
| Are GSI updates asynchronous? | No; they commit with the base item |
| Do RCU/WCU values control throughput? | No; capacity numbers are accepted and reported as ignored |
| Can I keep DynamoDB Streams consumers? | No; shard APIs are not offered |
Decide before you port
Choose Tables when:
- your access patterns fit partition keys, optional sort keys, and GSIs;
- your code can call
skippr tablesor nativeCloudTables.*operations; - strong reads and same-commit GSI updates are acceptable; and
- you can replace AWS IAM/account assumptions with Cloud credentials and policies.
Choose another design when you require:
- a stock AWS SDK or the
dynamodbSigV4 service code; - DynamoDB Streams shard APIs;
- global tables or multi-region replication;
- local secondary indexes, PartiQL, or DAX; or
- on-demand backup or point-in-time recovery APIs.
Prerequisites
- A table created through Tables, with a string partition key named
pkfor the example below. - A Cloud session from
skippr loginauthorized fortables:PutItem. CLOUD_TABLE_NAMEset in your shell.
This is a complete native PutItem command:
skippr tables put-item --table-name "${CLOUD_TABLE_NAME}" --input - <<JSON
{
"item": {
"pk": { "S": "NOTE#1001" },
"title": { "S": "First note" },
"priority": { "N": "2" },
"published": { "BOOL": false }
},
"conditionExpression": "attribute_not_exists(pk)"
}
JSONThe condition makes a repeated call fail instead of replacing the item.
What stays the same
| Area | Portable model |
|---|---|
| Keys | Partition key, or partition plus sort key |
| Values | S, N, B, BOOL, NULL, M, L, SS, NS, and BS |
| Point operations | GetItem, PutItem, UpdateItem, DeleteItem |
| Conditions | Comparisons, AND/OR/NOT, attribute_exists, attribute_not_exists, begins_with, between, and the supported update functions |
| Range access | Query with partition equality, sort-key conditions, ordering, and continuation keys |
| Bulk access | BatchGetItem, BatchWriteItem (independent item ops; BatchGet is not a snapshot, ≤100 keys; BatchWrite is not a transaction, ≤25 ops) |
| Atomic access | TransactWriteItems (one transaction); TransactGetItems (one snapshot), up to 100 entries |
| Secondary access | GSIs with hash or hash-plus-range keys |
| Expiry | UpdateTimeToLive, DescribeTimeToLive |
| Item size | Maximum 400 KiB |
What is different
Wire and identity
| DynamoDB-shaped concept | Tables contract |
|---|---|
| Endpoint | https://tables.{region}.cloud.skippr.io/ |
| Target header | X-Cloud-Target: CloudTables.<Operation> |
| SigV4 | Service tables |
| User authentication | Cloud bearer JWT also works |
| Authorization | Cloud policy action tables:<Operation> |
Consistency
- Every read is strongly consistent, even if
consistentReadis false. - GSI entries commit with the base item, so a successful write is immediately reflected in the index.
- A false
consistentReadrequest reportsstrong_read_onlyinignoredFields. Do not build behavior around stale reads.
Capacity and encryption fields
provisionedThroughputand GSI capacity numbers are accepted as no-ops. Responses report reasonnoop_capacityinignoredFields; the optionalx-cloud-ignoredheader may mirror it.ConsumedCapacityis not a billing or throttling signal.- Customer KMS identifiers are not applied in Preview and are reported with reason
noop_sse_kms.
Pagination, retries, and not-found behavior
QueryandScanreturnlastEvaluatedKey; pass it back asexclusiveStartKey.- Pages default to 100 items and are bounded to 1,000.
- A missing table returns
ResourceNotFoundException. - A missing item from
GetItemis a successful response with noitem. - Current requests have no
clientToken. Use conditions to make retry intent explicit; do not assume an ambiguous mutation was deduplicated.
Operations by migration task
| Migration task | Current operations |
|---|---|
| Recreate table definitions | CreateTable, DescribeTable, ListTables, UpdateTable, DeleteTable |
| Port point reads and writes | GetItem, PutItem, UpdateItem, DeleteItem |
| Port key access patterns | Query, Scan |
| Port batch paths | BatchGetItem, BatchWriteItem |
| Port transactions | TransactGetItems, TransactWriteItems |
| Port expiration | UpdateTimeToLive, DescribeTimeToLive |
ProjectionExpression and DynamoDB Streams are coming soon.
Errors
Cloud JSON errors use:
{
"code": "ConditionalCheckFailedException",
"message": "The conditional request failed",
"requestId": "..."
}Common codes are ResourceNotFoundException, ResourceInUseException, ConditionalCheckFailedException, TransactionCanceledException, ValidationException, and InternalServerError. A transaction cancellation can include details.cancellationReasons.
