DevDocsDev Docs
DynamoDB

DynamoDB CLI Reference

AWS CLI commands for DynamoDB

Complete reference for AWS DynamoDB CLI commands with examples.

Table Operations

Create Table

# Simple table with partition key only
aws dynamodb create-table \
  --table-name Users \
  --attribute-definitions AttributeName=userId,AttributeType=S \
  --key-schema AttributeName=userId,KeyType=HASH \
  --billing-mode PAY_PER_REQUEST

# Table with composite key
aws dynamodb create-table \
  --table-name Orders \
  --attribute-definitions \
    AttributeName=customerId,AttributeType=S \
    AttributeName=orderId,AttributeType=S \
  --key-schema \
    AttributeName=customerId,KeyType=HASH \
    AttributeName=orderId,KeyType=RANGE \
  --billing-mode PAY_PER_REQUEST

# With provisioned capacity
aws dynamodb create-table \
  --table-name Products \
  --attribute-definitions AttributeName=productId,AttributeType=S \
  --key-schema AttributeName=productId,KeyType=HASH \
  --provisioned-throughput ReadCapacityUnits=10,WriteCapacityUnits=5

Describe Table

aws dynamodb describe-table --table-name Users

# Get only table status
aws dynamodb describe-table \
  --table-name Users \
  --query 'Table.TableStatus'

List Tables

aws dynamodb list-tables

# With pagination
aws dynamodb list-tables --limit 10

Delete Table

aws dynamodb delete-table --table-name Users

Update Table

# Change to on-demand billing
aws dynamodb update-table \
  --table-name Users \
  --billing-mode PAY_PER_REQUEST

# Update provisioned capacity
aws dynamodb update-table \
  --table-name Users \
  --provisioned-throughput ReadCapacityUnits=20,WriteCapacityUnits=10

Item Operations

Put Item

aws dynamodb put-item \
  --table-name Users \
  --item '{
    "userId": {"S": "user-001"},
    "name": {"S": "John Doe"},
    "email": {"S": "john@example.com"},
    "age": {"N": "30"},
    "active": {"BOOL": true}
  }'

# With condition (only if not exists)
aws dynamodb put-item \
  --table-name Users \
  --item '{"userId": {"S": "user-001"}, "name": {"S": "John"}}' \
  --condition-expression "attribute_not_exists(userId)"

Get Item

# Simple get
aws dynamodb get-item \
  --table-name Users \
  --key '{"userId": {"S": "user-001"}}'

# With composite key
aws dynamodb get-item \
  --table-name Orders \
  --key '{
    "customerId": {"S": "cust-001"},
    "orderId": {"S": "order-001"}
  }'

# Get specific attributes
aws dynamodb get-item \
  --table-name Users \
  --key '{"userId": {"S": "user-001"}}' \
  --projection-expression "name, email"

# Strongly consistent read
aws dynamodb get-item \
  --table-name Users \
  --key '{"userId": {"S": "user-001"}}' \
  --consistent-read

Update Item

# Update single attribute
aws dynamodb update-item \
  --table-name Users \
  --key '{"userId": {"S": "user-001"}}' \
  --update-expression "SET #n = :name" \
  --expression-attribute-names '{"#n": "name"}' \
  --expression-attribute-values '{":name": {"S": "Jane Doe"}}'

# Update multiple attributes
aws dynamodb update-item \
  --table-name Users \
  --key '{"userId": {"S": "user-001"}}' \
  --update-expression "SET age = :age, #s = :status" \
  --expression-attribute-names '{"#s": "status"}' \
  --expression-attribute-values '{":age": {"N": "31"}, ":status": {"S": "active"}}'

# Increment a counter
aws dynamodb update-item \
  --table-name Products \
  --key '{"productId": {"S": "prod-001"}}' \
  --update-expression "SET viewCount = viewCount + :inc" \
  --expression-attribute-values '{":inc": {"N": "1"}}'

# Add to a list
aws dynamodb update-item \
  --table-name Users \
  --key '{"userId": {"S": "user-001"}}' \
  --update-expression "SET tags = list_append(if_not_exists(tags, :empty), :tag)" \
  --expression-attribute-values '{":tag": {"L": [{"S": "premium"}]}, ":empty": {"L": []}}'

# Return updated values
aws dynamodb update-item \
  --table-name Users \
  --key '{"userId": {"S": "user-001"}}' \
  --update-expression "SET age = :age" \
  --expression-attribute-values '{":age": {"N": "32"}}' \
  --return-values ALL_NEW

Delete Item

aws dynamodb delete-item \
  --table-name Users \
  --key '{"userId": {"S": "user-001"}}'

# With condition
aws dynamodb delete-item \
  --table-name Users \
  --key '{"userId": {"S": "user-001"}}' \
  --condition-expression "active = :false" \
  --expression-attribute-values '{":false": {"BOOL": false}}'

Query Operations

Query by Partition Key

aws dynamodb query \
  --table-name Orders \
  --key-condition-expression "customerId = :cid" \
  --expression-attribute-values '{":cid": {"S": "cust-001"}}'

Query with Sort Key Condition

# Begins with
aws dynamodb query \
  --table-name Orders \
  --key-condition-expression "customerId = :cid AND begins_with(orderId, :prefix)" \
  --expression-attribute-values '{
    ":cid": {"S": "cust-001"},
    ":prefix": {"S": "2024-"}
  }'

# Between
aws dynamodb query \
  --table-name Orders \
  --key-condition-expression "customerId = :cid AND orderId BETWEEN :start AND :end" \
  --expression-attribute-values '{
    ":cid": {"S": "cust-001"},
    ":start": {"S": "2024-01-01"},
    ":end": {"S": "2024-12-31"}
  }'

Query with Filter

aws dynamodb query \
  --table-name Orders \
  --key-condition-expression "customerId = :cid" \
  --filter-expression "#s = :status" \
  --expression-attribute-names '{"#s": "status"}' \
  --expression-attribute-values '{
    ":cid": {"S": "cust-001"},
    ":status": {"S": "SHIPPED"}
  }'

Query Index

aws dynamodb query \
  --table-name Orders \
  --index-name StatusIndex \
  --key-condition-expression "#s = :status" \
  --expression-attribute-names '{"#s": "status"}' \
  --expression-attribute-values '{":status": {"S": "PENDING"}}'

Query with Pagination

# First page
aws dynamodb query \
  --table-name Orders \
  --key-condition-expression "customerId = :cid" \
  --expression-attribute-values '{":cid": {"S": "cust-001"}}' \
  --limit 10

# Next page (use LastEvaluatedKey from previous response)
aws dynamodb query \
  --table-name Orders \
  --key-condition-expression "customerId = :cid" \
  --expression-attribute-values '{":cid": {"S": "cust-001"}}' \
  --limit 10 \
  --exclusive-start-key '{"customerId": {"S": "cust-001"}, "orderId": {"S": "order-010"}}'

Scan Operations

# Simple scan
aws dynamodb scan --table-name Users

# Scan with filter
aws dynamodb scan \
  --table-name Users \
  --filter-expression "age > :minAge" \
  --expression-attribute-values '{":minAge": {"N": "25"}}'

# Scan with projection
aws dynamodb scan \
  --table-name Users \
  --projection-expression "userId, #n, email" \
  --expression-attribute-names '{"#n": "name"}'

# Parallel scan
aws dynamodb scan \
  --table-name Users \
  --total-segments 4 \
  --segment 0

Batch Operations

Batch Get

aws dynamodb batch-get-item \
  --request-items '{
    "Users": {
      "Keys": [
        {"userId": {"S": "user-001"}},
        {"userId": {"S": "user-002"}},
        {"userId": {"S": "user-003"}}
      ]
    }
  }'

Batch Write

aws dynamodb batch-write-item \
  --request-items '{
    "Users": [
      {"PutRequest": {"Item": {"userId": {"S": "user-004"}, "name": {"S": "Alice"}}}},
      {"PutRequest": {"Item": {"userId": {"S": "user-005"}, "name": {"S": "Bob"}}}},
      {"DeleteRequest": {"Key": {"userId": {"S": "user-001"}}}}
    ]
  }'

Transactions

TransactWrite

aws dynamodb transact-write-items \
  --transact-items '[
    {
      "Put": {
        "TableName": "Orders",
        "Item": {"customerId": {"S": "cust-001"}, "orderId": {"S": "order-new"}}
      }
    },
    {
      "Update": {
        "TableName": "Inventory",
        "Key": {"productId": {"S": "prod-001"}},
        "UpdateExpression": "SET quantity = quantity - :qty",
        "ExpressionAttributeValues": {":qty": {"N": "1"}}
      }
    }
  ]'

TransactGet

aws dynamodb transact-get-items \
  --transact-items '[
    {"Get": {"TableName": "Users", "Key": {"userId": {"S": "user-001"}}}},
    {"Get": {"TableName": "Orders", "Key": {"customerId": {"S": "cust-001"}, "orderId": {"S": "order-001"}}}}
  ]'

Global Secondary Index

Create GSI

aws dynamodb update-table \
  --table-name Orders \
  --attribute-definitions AttributeName=status,AttributeType=S \
  --global-secondary-index-updates '[
    {
      "Create": {
        "IndexName": "StatusIndex",
        "KeySchema": [{"AttributeName": "status", "KeyType": "HASH"}],
        "Projection": {"ProjectionType": "ALL"}
      }
    }
  ]'

Delete GSI

aws dynamodb update-table \
  --table-name Orders \
  --global-secondary-index-updates '[
    {"Delete": {"IndexName": "StatusIndex"}}
  ]'

Streams

# Enable streams
aws dynamodb update-table \
  --table-name Orders \
  --stream-specification StreamEnabled=true,StreamViewType=NEW_AND_OLD_IMAGES

# Describe stream
aws dynamodbstreams describe-stream \
  --stream-arn arn:aws:dynamodb:us-east-1:123456789012:table/Orders/stream/timestamp

TTL

# Enable TTL
aws dynamodb update-time-to-live \
  --table-name Sessions \
  --time-to-live-specification Enabled=true,AttributeName=expirationTime

# Describe TTL
aws dynamodb describe-time-to-live --table-name Sessions

Backups

# Create backup
aws dynamodb create-backup \
  --table-name Users \
  --backup-name Users-backup-2024

# List backups
aws dynamodb list-backups --table-name Users

# Restore from backup
aws dynamodb restore-table-from-backup \
  --target-table-name Users-restored \
  --backup-arn arn:aws:dynamodb:us-east-1:123456789012:table/Users/backup/backup-id

# Enable point-in-time recovery
aws dynamodb update-continuous-backups \
  --table-name Users \
  --point-in-time-recovery-specification PointInTimeRecoveryEnabled=true

Tags

# Add tags
aws dynamodb tag-resource \
  --resource-arn arn:aws:dynamodb:us-east-1:123456789012:table/Users \
  --tags Key=Environment,Value=Production

# List tags
aws dynamodb list-tags-of-resource \
  --resource-arn arn:aws:dynamodb:us-east-1:123456789012:table/Users

On this page