Skip to content

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

QuestionAnswer
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 tables or native CloudTables.* 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 dynamodb SigV4 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 pk for the example below.
  • A Cloud session from skippr login authorized for tables:PutItem.
  • CLOUD_TABLE_NAME set in your shell.

This is a complete native PutItem command:

bash
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)"
}
JSON

The condition makes a repeated call fail instead of replacing the item.

What stays the same

AreaPortable model
KeysPartition key, or partition plus sort key
ValuesS, N, B, BOOL, NULL, M, L, SS, NS, and BS
Point operationsGetItem, PutItem, UpdateItem, DeleteItem
ConditionsComparisons, AND/OR/NOT, attribute_exists, attribute_not_exists, begins_with, between, and the supported update functions
Range accessQuery with partition equality, sort-key conditions, ordering, and continuation keys
Bulk accessBatchGetItem, BatchWriteItem (independent item ops; BatchGet is not a snapshot, ≤100 keys; BatchWrite is not a transaction, ≤25 ops)
Atomic accessTransactWriteItems (one transaction); TransactGetItems (one snapshot), up to 100 entries
Secondary accessGSIs with hash or hash-plus-range keys
ExpiryUpdateTimeToLive, DescribeTimeToLive
Item sizeMaximum 400 KiB

What is different

Wire and identity

DynamoDB-shaped conceptTables contract
Endpointhttps://tables.{region}.cloud.skippr.io/
Target headerX-Cloud-Target: CloudTables.<Operation>
SigV4Service tables
User authenticationCloud bearer JWT also works
AuthorizationCloud policy action tables:<Operation>

Consistency

  • Every read is strongly consistent, even if consistentRead is false.
  • GSI entries commit with the base item, so a successful write is immediately reflected in the index.
  • A false consistentRead request reports strong_read_only in ignoredFields. Do not build behavior around stale reads.

Capacity and encryption fields

  • provisionedThroughput and GSI capacity numbers are accepted as no-ops. Responses report reason noop_capacity in ignoredFields; the optional x-cloud-ignored header may mirror it.
  • ConsumedCapacity is 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

  • Query and Scan return lastEvaluatedKey; pass it back as exclusiveStartKey.
  • Pages default to 100 items and are bounded to 1,000.
  • A missing table returns ResourceNotFoundException.
  • A missing item from GetItem is a successful response with no item.
  • 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 taskCurrent operations
Recreate table definitionsCreateTable, DescribeTable, ListTables, UpdateTable, DeleteTable
Port point reads and writesGetItem, PutItem, UpdateItem, DeleteItem
Port key access patternsQuery, Scan
Port batch pathsBatchGetItem, BatchWriteItem
Port transactionsTransactGetItems, TransactWriteItems
Port expirationUpdateTimeToLive, DescribeTimeToLive

ProjectionExpression and DynamoDB Streams are coming soon.

Errors

Cloud JSON errors use:

json
{
  "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.