Back to Checks
EBS volume has at least one snapshot
ec2_ebs_volume_snapshots_exists
Service: ec2Severity: high
OfficialBuilt-inVerified
Categories:resilienceforensics-ready
Resource Type:AwsEc2Volume
EBS volumes are evaluated for the existence of at least one associated snapshot, identifying volumes without any point-in-time backup available.
Risk
Missing EBS snapshots removes point-in-time recovery. Accidental deletion, corruption, or ransomware can cause irrecoverable data loss and prolonged service outages, degrading data integrity and availability and complicating recovery and forensics.
Run this check with Prowler
Run in Prowler CloudRun
prowler aws --checks ec2_ebs_volume_snapshots_existsRecommendation
Establish automated, policy-based EBS snapshot coverage for all volumes aligned to business RPO/RTO.
- Schedule regular snapshots with retention controls
- Encrypt snapshots and enforce least privilege access
- Replicate to another Region/account for DR
- Periodically test restores and document procedures
Remediation
CLI
aws ec2 create-snapshot --region <REGION> --volume-id <VOLUME_ID>Terraform
# Create a snapshot for an existing EBS volume
resource "aws_ebs_snapshot" "<example_resource_name>" {
volume_id = "<example_resource_id>" # Critical: creating this snapshot makes the volume pass the check
}NativeIaC
# CloudFormation: create a snapshot of an existing EBS volume
Resources:
<example_resource_name>:
Type: AWS::EC2::Snapshot
Properties:
VolumeId: <example_resource_id> # Critical: creates a snapshot for this volume to pass the checkOther
1In the AWS Console, go to EC2
2Click Volumes, select the target EBS volume
3Choose Actions > Create snapshot
4Click Create snapshot to confirm
Check Code
from prowler.lib.check.models import Check, Check_Report_AWS
from prowler.providers.aws.services.ec2.ec2_client import ec2_client
class ec2_ebs_volume_snapshots_exists(Check):
def execute(self):
findings = []
for volume in ec2_client.volumes:
report = Check_Report_AWS(metadata=self.metadata(), resource=volume)
report.status = "FAIL"
report.status_extended = (
f"Snapshots not found for the EBS volume {volume.id}."
)
if ec2_client.volumes_with_snapshots.get(volume.id, False):
report.status = "PASS"
report.status_extended = (
f"Snapshots found for the EBS volume {volume.id}."
)
findings.append(report)
return findings