When checking for RDS instance existence using the AWS CLI, many developers encounter the frustrating DBInstanceNotFound error. The standard approach fails because AWS CLI treats missing resources as errors rather than returning empty results.
The proper way to check for RDS instance existence while handling the error case gracefully is to:
#!/bin/bash
DB_INSTANCE_ID="my-database"
# Use query filtering and error suppression
aws rds describe-db-instances \
--query "DBInstances[?DBInstanceIdentifier=='${DB_INSTANCE_ID}'].[DBInstanceIdentifier]" \
--output text \
2>/dev/null
if [ $? -eq 0 ]; then
echo "Instance exists"
else
echo "Instance does not exist"
fi
Method 1: Using jq for JSON Processing
EXISTS=$(aws rds describe-db-instances \
--query "DBInstances[*].DBInstanceIdentifier" \
--output json | jq -e ".[] | select(. == \"$DBINSTANCEIDENTIFIER\")" >/dev/null; echo $?)
if [ "$EXISTS" -eq 0 ]; then
echo "Found"
fi
Method 2: List All Instances First
INSTANCES=$(aws rds describe-db-instances --query "DBInstances[*].DBInstanceIdentifier" --output text)
if [[ $INSTANCES =~ (^|[[:space:]])$DBINSTANCEIDENTIFIER($|[[:space:]]) ]]; then
echo "Found"
fi
For production scripts, consider these improvements:
#!/bin/bash
check_rds_instance() {
local instance_id=$1
local result
result=$(aws rds describe-db-instances \
--db-instance-identifier "$instance_id" \
--query "DBInstances[0].DBInstanceIdentifier" \
2>&1)
case $? in
0) return 0 ;; # Found
255)
if [[ $result == *"DBInstanceNotFound"* ]]; then
return 1 # Not found
else
return 2 # Other error
fi ;;
*) return 3 # Unknown error
esac
}
For environments with many RDS instances, filtering server-side is more efficient:
aws rds describe-db-instances \
--query "length(DBInstances[?DBInstanceIdentifier=='${DB_INSTANCE_ID}'])"
This returns a count (0 or 1) without transferring full instance details.
When scripting AWS infrastructure management, we often need to verify if an RDS instance exists before taking actions like creation or deletion. The naive approach using describe-db-instances fails ungracefully:
# This throws DBInstanceNotFound error for non-existent instances aws rds describe-db-instances --db-instance-identifier="nonexistent-db"
Method 1: Using Query Filtering
The cleanest approach leverages JMESPath queries to handle missing instances gracefully:
#!/bin/bash
DB_INSTANCE="greatdb"
EXISTS=$(aws rds describe-db-instances \
--query 'DBInstances[?DBInstanceIdentifier=='"$DB_INSTANCE"'].DBInstanceIdentifier' \
--output text)
if [ -z "$EXISTS" ]; then
echo "Instance does not exist"
else
echo "Instance exists: $EXISTS"
fi
Method 2: Error Suppression with Status Check
For older AWS CLI versions, we can redirect stderr and check the command status:
aws rds describe-db-instances \
--db-instance-identifier="$DB_INSTANCE" \
>/dev/null 2>&1
if [ $? -eq 0 ]; then
echo "Instance exists"
else
echo "Instance does not exist (or other error occurred)"
fi
Handling Multiple Regions
For cross-region checks, always specify the region explicitly:
REGIONS="us-east-1 us-west-2 eu-west-1"
TARGET_INSTANCE="prod-database"
for region in $REGIONS; do
echo "Checking $region..."
aws rds describe-db-instances \
--region $region \
--query 'contains(DBInstances[*].DBInstanceIdentifier, '"$TARGET_INSTANCE"')' \
--output text
done
Performance Optimization
For frequent checks in large environments, use filters to minimize API response size:
aws rds describe-db-instances \
--query 'DBInstances[?DBInstanceIdentifier=='"$DB_INSTANCE"'].{ID:DBInstanceIdentifier, Status:DBInstanceStatus}' \
--output json
- Always add
--regionparameter in scripts - Consider implementing exponential backoff for automation scripts
- Use AWS CLI v2 for improved JMESPath query support
- Cache results when possible to avoid rate limits