There are more AWS SDK examples available in the AWS Doc SDK Examples
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 API details, see the following topics in AWS CLI Command Reference.
-
Detect PPE in images
Insert data using PartiQL INSERT