You're trying to create an EBS snapshot and getting errors like:
Failed to create snapshot: An error occurred (InvalidVolume.NotFound) when calling the CreateSnapshot operationOr perhaps:
SnapshotCreationPerRateExceeded: You have exceeded the maximum number of snapshot creation requests.Snapshot failures can halt your backup strategy. Let's fix them.
Understanding Common Snapshot Errors
EBS snapshot creation can fail for several reasons:
- 1.Volume not found - Wrong volume ID or deleted volume
- 2.Volume state invalid - Volume in error state or being created
- 3.Rate limiting - Too many snapshot requests
- 4.Permission issues - Missing IAM permissions
- 5.KMS issues - Encryption key problems
- 6.Service quotas - Snapshot limit reached
Solution 1: Verify Volume Exists and State
First, confirm the volume is valid:
# Check volume exists and its state
aws ec2 describe-volumes \
--volume-ids vol-1234567890abcdef0 \
--query 'Volumes[0].[VolumeId,State,Size,Encrypted]' \
--output tableIf the volume doesn't exist:
```bash # List all volumes to find the correct one aws ec2 describe-volumes \ --filters Name=tag:Name,Values=your-volume-name \ --query 'Volumes[*].[VolumeId,State,Size,AvailabilityZone]' \ --output table
# Or search by attachment aws ec2 describe-volumes \ --filters Name=attachment.instance-id,Values=i-1234567890abcdef0 \ --query 'Volumes[*].[VolumeId,State]' \ --output table ```
Valid volume states for snapshots:
- in-use - Attached to an instance (ideal)
- available - Detached but exists
Solution 2: Handle Rate Limiting
AWS limits snapshot creation requests. If you see rate limit errors:
Request limit exceeded for CreateSnapshot.Implement exponential backoff:
```bash #!/bin/bash
create_snapshot_with_retry() { local volume_id=$1 local max_attempts=5 local wait_time=10 local attempt=1
while [ $attempt -le $max_attempts ]; do result=$(aws ec2 create-snapshot \ --volume-id $volume_id \ --description "Backup $(date +%Y%m%d)" \ --query 'SnapshotId' \ --output text 2>&1)
if [[ $? -eq 0 ]]; then echo "Snapshot created: $result" return 0 elif [[ $result == *"RequestLimitExceeded"* ]] || [[ $result == *"SnapshotCreationPerRateExceeded"* ]]; then echo "Rate limited. Attempt $attempt of $max_attempts. Waiting ${wait_time}s..." sleep $wait_time wait_time=$((wait_time * 2)) attempt=$((attempt + 1)) else echo "Error: $result" return 1 fi done
echo "Failed after $max_attempts attempts" return 1 }
create_snapshot_with_retry "vol-1234567890abcdef0" ```
For bulk snapshots, add delays between requests:
# Create snapshots with throttling
for volume_id in vol-111 vol-222 vol-333; do
aws ec2 create-snapshot \
--volume-id $volume_id \
--description "Backup $(date +%Y%m%d)"
sleep 2 # Wait between requests
doneSolution 3: Fix Permission Issues
Check your IAM permissions for snapshots:
```bash # Test if you can describe snapshots aws ec2 describe-snapshots --owner-ids self --max-items 1
# If this fails, your IAM role lacks permissions ```
Required IAM policy for snapshots:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ec2:CreateSnapshot",
"ec2:CreateSnapshots",
"ec2:DescribeSnapshots",
"ec2:DescribeVolumes",
"ec2:CreateTags"
],
"Resource": [
"arn:aws:ec2:*:*:volume/*",
"arn:aws:ec2:*:*:snapshot/*"
]
},
{
"Effect": "Allow",
"Action": "kms:CreateGrant",
"Resource": "*",
"Condition": {
"StringEquals": {
"kms:ViaService": "ec2.amazonaws.com"
}
}
}
]
}If you see "UnauthorizedOperation", attach the required policy:
```bash # List attached policies for your role aws iam list-attached-role-policies --role-name your-role-name
# Attach the EC2 full access (or create custom policy) aws iam attach-role-policy \ --role-name your-role-name \ --policy-arn arn:aws:iam::aws:policy/AmazonEC2FullAccess ```
Solution 4: Handle Encrypted Volumes
Encrypted volumes require KMS key access:
```bash # Check if volume is encrypted aws ec2 describe-volumes \ --volume-ids vol-1234567890abcdef0 \ --query 'Volumes[0].[Encrypted,KmsKeyId]'
# If encrypted, ensure you have KMS permissions aws kms describe-key --key-id alias/aws/ebs ```
If you see KMS errors:
User is not authorized to perform: kms:CreateGrantAdd KMS permissions:
# Grant yourself access to the KMS key
aws kms create-grant \
--key-id alias/my-key \
--grantee-principal arn:aws:iam::123456789012:role/your-role \
--operations "Encrypt" "Decrypt" "CreateGrant"Solution 5: Check Service Quotas
You might have hit your snapshot limit:
```bash # Check your snapshot quota aws service-quotas get-service-quota \ --service-code ec2 \ --quota-code L-309BACF6 \ --region us-east-1 \ --query 'Quota.Value'
# Count your current snapshots aws ec2 describe-snapshots \ --owner-ids self \ --query 'length(Snapshots)' ```
If you need more snapshots:
# Request quota increase
aws service-quotas request-service-quota-increase \
--service-code ec2 \
--quota-code L-309BACF6 \
--desired-value 500 \
--region us-east-1Solution 6: Create Snapshots from Running Instances
For consistent backups, use multi-attach snapshot:
# Create snapshot with tags in one command
aws ec2 create-snapshot \
--volume-id vol-1234567890abcdef0 \
--description "Production backup $(date +%Y%m%d-%H%M%S)" \
--tag-specifications 'ResourceType=snapshot,Tags=[{Key=Name,Value=production-backup},{Key=Environment,Value=prod}]'For consistent snapshots of all volumes attached to an instance:
# Create snapshots of all instance volumes at once
aws ec2 create-snapshots \
--instance-specification InstanceId=i-1234567890abcdef0 \
--description "Full instance backup $(date +%Y%m%d)" \
--tag-specifications 'ResourceType=snapshot,Tags=[{Key=BackupType,Value=full-instance}]'Solution 7: Handle "Volume Being Modified" State
If the volume is being modified, wait:
```bash # Check for volume modifications aws ec2 describe-volumes-modifications \ --volume-ids vol-1234567890abcdef0
# Wait for modification to complete aws ec2 wait volume-modified --volume-ids vol-1234567890abcdef0 ```
Verification
After creating a snapshot, verify it completed:
```bash # Check snapshot status snapshot_id=$(aws ec2 create-snapshot \ --volume-id vol-1234567890abcdef0 \ --description "Test snapshot" \ --query 'SnapshotId' \ --output text)
# Wait for completion aws ec2 wait snapshot-completed --snapshot-ids $snapshot_id
# Verify details aws ec2 describe-snapshots \ --snapshot-ids $snapshot_id \ --query 'Snapshots[0].[SnapshotId,State,VolumeId,StartTime,VolumeSize]' ```
Troubleshooting Checklist
- 1.Volume exists:
aws ec2 describe-volumes --volume-ids vol-xxx - 2.Volume in valid state: State should be
in-useoravailable - 3.Not rate limited: Add delays between snapshot requests
- 4.Permissions correct: Check IAM policy includes
ec2:CreateSnapshot - 5.KMS access: For encrypted volumes, verify KMS permissions
- 6.Quota available: Check you haven't exceeded snapshot limits
Best Practices for Reliable Snapshots
```bash # 1. Use consistent tagging aws ec2 create-snapshot \ --volume-id vol-1234567890abcdef0 \ --description "Daily backup" \ --tag-specifications 'ResourceType=snapshot,Tags=[{Key=Name,Value=daily-backup},{Key=AutoDelete,Value=true},{Key=RetentionDays,Value=30}]'
# 2. Verify completion before relying on backup aws ec2 wait snapshot-completed --snapshot-ids snap-1234567890abcdef0
# 3. Use AWS Backup for automated policies instead of manual snapshots aws backup create-backup-plan --backup-plan file://backup-plan.json ```
Common Error Messages Reference
| Error | Cause | Solution |
|---|---|---|
InvalidVolume.NotFound | Wrong volume ID | Verify volume exists |
InvalidVolumeID.Malformed | Bad ID format | Check volume ID format |
SnapshotCreationPerRateExceeded | Too many requests | Add delays, use exponential backoff |
UnauthorizedOperation | Missing permissions | Add EC2 snapshot permissions to IAM |
Kms.NotFound | KMS key deleted | Restore key or decrypt volume |
Resource.AlreadyAssociated | Snapshot in progress | Wait or check existing snapshot |