View a markdown version of this page

Getting started with DynamoDB - Amazon DynamoDB

Getting started with DynamoDB

The following code example shows how to:

  • Create a table in DynamoDB

  • Update data in a DynamoDB table

  • Query data in a DynamoDB table

  • Delete your DynamoDB table

Bash
AWS CLI with Bash script
Note

There's more on GitHub. Find the complete example and learn how to set up and run in the Sample developer tutorials repository.

#!/bin/bash # DynamoDB Getting Started Tutorial Script # This script demonstrates basic operations with Amazon DynamoDB: # - Creating a table # - Writing data to the table # - Reading data from the table # - Updating data in the table # - Querying data in the table # - Deleting the table (cleanup) set -uo pipefail # Set up logging with secure permissions LOG_DIR="${XDG_STATE_HOME:-.}/dynamodb-tutorial-logs" mkdir -p "$LOG_DIR" LOG_FILE="$LOG_DIR/dynamodb-tutorial-$(date +%Y%m%d-%H%M%S).log" chmod 700 "$LOG_DIR" touch "$LOG_FILE" chmod 600 "$LOG_FILE" exec > >(tee -a "$LOG_FILE") 2>&1 echo "Starting DynamoDB Getting Started Tutorial at $(date)" echo "Logging to $LOG_FILE" # Validate AWS CLI is configured if ! command -v aws &> /dev/null; then echo "ERROR: AWS CLI is not installed or not in PATH" exit 1 fi # Check AWS credentials are available if ! aws sts get-caller-identity &> /dev/null; then echo "ERROR: AWS credentials not configured or invalid" exit 1 fi # Function to check for errors in command output check_error() { local output=$1 local cmd_name=$2 if echo "$output" | grep -qi "error\|failed"; then echo "ERROR detected in $cmd_name command:" >&2 echo "$output" >&2 return 1 fi return 0 } # Function to wait for table to be in ACTIVE state wait_for_table_active() { local table_name=$1 local max_attempts=60 local attempt=0 local status="" echo "Waiting for table $table_name to become ACTIVE..." while [[ "$status" != "ACTIVE" && $attempt -lt $max_attempts ]]; do sleep 5 status=$(aws dynamodb describe-table --table-name "$table_name" --query "Table.TableStatus" --output text 2>/dev/null || echo "UNKNOWN") echo "Current status: $status" ((attempt++)) done if [[ "$status" != "ACTIVE" ]]; then echo "ERROR: Table $table_name did not become ACTIVE within timeout period" >&2 return 1 fi echo "Table $table_name is now ACTIVE" return 0 } # Track created resources for cleanup declare -a RESOURCES=() # Cleanup function cleanup() { local exit_code=$? if [[ $exit_code -ne 0 ]]; then echo "Script encountered an error (exit code: $exit_code)" >&2 fi echo "" echo "===========================================" echo "CLEANUP" echo "===========================================" echo "Resources to clean up:" for resource in "${RESOURCES[@]+"${RESOURCES[@]}"}"; do echo "- $resource" done echo "" if [[ ${#RESOURCES[@]} -gt 0 ]]; then echo "Proceeding with cleanup of all created resources..." for resource in "${RESOURCES[@]+"${RESOURCES[@]}"}"; do if [[ "$resource" == Table:* ]]; then local table_name="${resource#Table:}" echo "Deleting table: $table_name" if aws dynamodb delete-table --table-name "$table_name" 2>/dev/null; then echo "Waiting for table deletion to complete..." aws dynamodb wait table-not-exists --table-name "$table_name" 2>/dev/null || true else echo "Warning: Failed to delete table $table_name" >&2 fi fi done echo "Cleanup completed." fi return $exit_code } trap cleanup EXIT # Validate table name validate_table_name() { local name=$1 if [[ ! $name =~ ^[a-zA-Z0-9._-]+$ ]] || [[ ${#name} -gt 255 ]]; then echo "ERROR: Invalid table name: $name" >&2 return 1 fi return 0 } # Step 1: Create a table in DynamoDB echo "Step 1: Creating Music table in DynamoDB..." TABLE_NAME="Music" validate_table_name "$TABLE_NAME" CREATE_TABLE_OUTPUT=$(aws dynamodb create-table \ --table-name "$TABLE_NAME" \ --attribute-definitions \ AttributeName=Artist,AttributeType=S \ AttributeName=SongTitle,AttributeType=S \ --key-schema AttributeName=Artist,KeyType=HASH AttributeName=SongTitle,KeyType=RANGE \ --billing-mode PAY_PER_REQUEST \ --table-class STANDARD \ --tags Key=project,Value=doc-smith Key=tutorial,Value=amazon-dynamodb-gs 2>&1) || { echo "ERROR: Failed to create table" >&2 exit 1 } check_error "$CREATE_TABLE_OUTPUT" "create-table" echo "$CREATE_TABLE_OUTPUT" # Add table to resources list RESOURCES+=("Table:$TABLE_NAME") # Wait for table to be active wait_for_table_active "$TABLE_NAME" # Enable point-in-time recovery (best practice) echo "Enabling point-in-time recovery for the $TABLE_NAME table..." PITR_OUTPUT=$(aws dynamodb update-continuous-backups \ --table-name "$TABLE_NAME" \ --point-in-time-recovery-specification PointInTimeRecoveryEnabled=true 2>&1) || { echo "ERROR: Failed to enable PITR" >&2 exit 1 } check_error "$PITR_OUTPUT" "update-continuous-backups" echo "$PITR_OUTPUT" # Step 2: Write data to the DynamoDB table echo "Step 2: Writing data to the $TABLE_NAME table..." # Use a temporary file for item data ITEMS_TEMP=$(mktemp) trap "rm -f '$ITEMS_TEMP'" EXIT cat > "$ITEMS_TEMP" << 'EOF' {"Artist": {"S": "No One You Know"}, "SongTitle": {"S": "Call Me Today"}, "AlbumTitle": {"S": "Somewhat Famous"}, "Awards": {"N": "1"}} {"Artist": {"S": "No One You Know"}, "SongTitle": {"S": "Howdy"}, "AlbumTitle": {"S": "Somewhat Famous"}, "Awards": {"N": "2"}} {"Artist": {"S": "Acme Band"}, "SongTitle": {"S": "Happy Day"}, "AlbumTitle": {"S": "Songs About Life"}, "Awards": {"N": "10"}} {"Artist": {"S": "Acme Band"}, "SongTitle": {"S": "PartiQL Rocks"}, "AlbumTitle": {"S": "Another Album Title"}, "Awards": {"N": "8"}} EOF declare -i item_num=0 while IFS= read -r item_data; do ((item_num++)) ITEM_OUTPUT=$(aws dynamodb put-item \ --table-name "$TABLE_NAME" \ --item "$item_data" 2>&1) || { echo "ERROR: Failed to put item $item_num" >&2 exit 1 } check_error "$ITEM_OUTPUT" "put-item (item $item_num)" echo "Item $item_num added successfully" done < "$ITEMS_TEMP" # Step 3: Read data from the DynamoDB table echo "Step 3: Reading data from the $TABLE_NAME table..." # Get a specific item GET_ITEM_OUTPUT=$(aws dynamodb get-item --consistent-read \ --table-name "$TABLE_NAME" \ --key '{"Artist": {"S": "Acme Band"}, "SongTitle": {"S": "Happy Day"}}' 2>&1) || { echo "ERROR: Failed to get item" >&2 exit 1 } check_error "$GET_ITEM_OUTPUT" "get-item" echo "Retrieved item:" echo "$GET_ITEM_OUTPUT" # Step 4: Update data in the DynamoDB table echo "Step 4: Updating data in the $TABLE_NAME table..." # Update an item UPDATE_ITEM_OUTPUT=$(aws dynamodb update-item \ --table-name "$TABLE_NAME" \ --key '{"Artist": {"S": "Acme Band"}, "SongTitle": {"S": "Happy Day"}}' \ --update-expression "SET AlbumTitle = :newval" \ --expression-attribute-values '{":newval": {"S": "Updated Album Title"}}' \ --return-values ALL_NEW 2>&1) || { echo "ERROR: Failed to update item" >&2 exit 1 } check_error "$UPDATE_ITEM_OUTPUT" "update-item" echo "Updated item:" echo "$UPDATE_ITEM_OUTPUT" # Step 5: Query data in the DynamoDB table echo "Step 5: Querying data in the $TABLE_NAME table..." # Query items by Artist QUERY_OUTPUT=$(aws dynamodb query \ --table-name "$TABLE_NAME" \ --key-condition-expression "Artist = :name" \ --expression-attribute-values '{":name": {"S": "Acme Band"}}' 2>&1) || { echo "ERROR: Failed to query table" >&2 exit 1 } check_error "$QUERY_OUTPUT" "query" echo "Query results:" echo "$QUERY_OUTPUT" echo "DynamoDB Getting Started Tutorial completed successfully at $(date)" echo "Log file: $LOG_FILE"

For a complete list of AWS SDK developer guides and code examples, see Using DynamoDB with an AWS SDK. This topic also includes information about getting started and details about previous SDK versions.