AWS code-library documentation change
Summary
Added a new Bash script tutorial demonstrating basic DynamoDB operations including table creation, data manipulation, querying, and cleanup with point-in-time recovery enabled as a best practice.
Security assessment
The change adds a comprehensive tutorial script that includes enabling point-in-time recovery (PITR) for DynamoDB tables, which is a security best practice for data backup and recovery. However, there is no evidence this addresses a specific security vulnerability or incident - it's a routine documentation addition for educational purposes. The PITR feature helps with data protection and recovery scenarios.
Diff
diff --git a/code-library/latest/ug/bash_2_dynamodb_code_examples.md b/code-library/latest/ug/bash_2_dynamodb_code_examples.md index 19466dca8..71123b11e 100644 --- a//code-library/latest/ug/bash_2_dynamodb_code_examples.md +++ b//code-library/latest/ug/bash_2_dynamodb_code_examples.md @@ -3375,0 +3376,238 @@ Clean up MRSC global table resources. +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 + + + + +**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](https://github.com/aws-samples/sample-developer-tutorials/tree/main/tuts/070-amazon-dynamodb-gs) 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 up logging + LOG_FILE="dynamodb-tutorial-$(date +%Y%m%d-%H%M%S).log" + exec > >(tee -a "$LOG_FILE") 2>&1 + + echo "Starting DynamoDB Getting Started Tutorial at $(date)" + echo "Logging to $LOG_FILE" + + # Function to check for errors in command output + check_error() { + local output=$1 + local cmd_name=$2 + + if echo "$output" | grep -i "error" > /dev/null; then + echo "ERROR detected in $cmd_name command:" + echo "$output" + exit 1 + fi + } + + # Function to wait for table to be in ACTIVE state + wait_for_table_active() { + local table_name=$1 + local status="" + + echo "Waiting for table $table_name to become ACTIVE..." + + while [[ "$status" != "ACTIVE" ]]; do + sleep 5 + status=$(aws dynamodb describe-table --table-name "$table_name" --query "Table.TableStatus" --output text) + echo "Current status: $status" + done + + echo "Table $table_name is now ACTIVE" + } + + # Track created resources for cleanup + RESOURCES=() + + # Step 1: Create a table in DynamoDB + echo "Step 1: Creating Music table in DynamoDB..." + + CREATE_TABLE_OUTPUT=$(aws dynamodb create-table \ + --table-name Music \ + --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) + + check_error "$CREATE_TABLE_OUTPUT" "create-table" + echo "$CREATE_TABLE_OUTPUT" + + # Add table to resources list + RESOURCES+=("Table:Music") + + # Wait for table to be active + wait_for_table_active "Music" + + # Enable point-in-time recovery (best practice) + echo "Enabling point-in-time recovery for the Music table..." + + PITR_OUTPUT=$(aws dynamodb update-continuous-backups \ + --table-name Music \ + --point-in-time-recovery-specification PointInTimeRecoveryEnabled=true) + + 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 Music table..." + + # Add first item + ITEM1_OUTPUT=$(aws dynamodb put-item \ + --table-name Music \ + --item \ + '{"Artist": {"S": "No One You Know"}, "SongTitle": {"S": "Call Me Today"}, "AlbumTitle": {"S": "Somewhat Famous"}, "Awards": {"N": "1"}}') + + check_error "$ITEM1_OUTPUT" "put-item (item 1)" + echo "$ITEM1_OUTPUT" + + # Add second item + ITEM2_OUTPUT=$(aws dynamodb put-item \ + --table-name Music \ + --item \ + '{"Artist": {"S": "No One You Know"}, "SongTitle": {"S": "Howdy"}, "AlbumTitle": {"S": "Somewhat Famous"}, "Awards": {"N": "2"}}') + + check_error "$ITEM2_OUTPUT" "put-item (item 2)" + echo "$ITEM2_OUTPUT" + + # Add third item + ITEM3_OUTPUT=$(aws dynamodb put-item \ + --table-name Music \ + --item \ + '{"Artist": {"S": "Acme Band"}, "SongTitle": {"S": "Happy Day"}, "AlbumTitle": {"S": "Songs About Life"}, "Awards": {"N": "10"}}') + + check_error "$ITEM3_OUTPUT" "put-item (item 3)" + echo "$ITEM3_OUTPUT" + + # Add fourth item + ITEM4_OUTPUT=$(aws dynamodb put-item \ + --table-name Music \ + --item \ + '{"Artist": {"S": "Acme Band"}, "SongTitle": {"S": "PartiQL Rocks"}, "AlbumTitle": {"S": "Another Album Title"}, "Awards": {"N": "8"}}') + + check_error "$ITEM4_OUTPUT" "put-item (item 4)" + echo "$ITEM4_OUTPUT" + + # Step 3: Read data from the DynamoDB table + echo "Step 3: Reading data from the Music table..." + + # Get a specific item + GET_ITEM_OUTPUT=$(aws dynamodb get-item --consistent-read \ + --table-name Music \ + --key '{"Artist": {"S": "Acme Band"}, "SongTitle": {"S": "Happy Day"}}') + + 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 Music table..." + + # Update an item + UPDATE_ITEM_OUTPUT=$(aws dynamodb update-item \ + --table-name Music \ + --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) + + 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 Music table..." + + # Query items by Artist + QUERY_OUTPUT=$(aws dynamodb query \ + --table-name Music \ + --key-condition-expression "Artist = :name" \ + --expression-attribute-values '{":name": {"S": "Acme Band"}}') + + check_error "$QUERY_OUTPUT" "query" + echo "Query results:" + echo "$QUERY_OUTPUT" + + # Prompt for cleanup + echo "" + echo "===========================================" + echo "CLEANUP CONFIRMATION" + echo "===========================================" + echo "Resources created:" + for resource in "${RESOURCES[@]}"; do + echo "- $resource" + done + echo "" + echo "Do you want to clean up all created resources? (y/n): " + read -r CLEANUP_CHOICE + + if [[ "$CLEANUP_CHOICE" =~ ^[Yy]$ ]]; then + # Step 6: Delete the DynamoDB table