The script itself is fairly straightforward, but took several dry-runs in order to fine tune it so that it would reliably create the snapshots, but more importantly would clear out old snapshots older than 7 days.
You can see the for loop for deleting older snapshots. This is done by parsing snapshot dates, converting the dates to a pure numeric value and comparing said numeric value to a “7 days ago” date variable.
Take a look at the script below, hopefully it will be useful to you! There could be more error checking, but that should be fairly easy to do.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
#!/bin/sh
# EBS Snapshot volume script
# Written by Star Dot Hosting
# www.stardothosting.com
# Constants
ec2_bin="/opt/aws/bin"
my_cert="/opt/aws/cert.txt"
my_key="/opt/aws/key.txt"
instance_id=`wget -q -O- http://169.254.169.254/latest/meta-data/instance-id`
# Dates
datecheck_7d=`date +%Y-%m-%d --date '7 days ago'`
datecheck_s_7d=`date --date="$datecheck_7d" +%s`
# Get all volume info and copy to temp file
$ec2_bin/ec2-describe-volumes -C $my_cert -K $my_key --filter "attachment.instance-id=$instance_id" > /tmp/volume_info.txt 2>&1
# Get all snapshot info
$ec2_bin/ec2-describe-snapshots -C $my_cert -K $my_key | grep "$instance_id" > /tmp/snap_info.txt 2>&1
# Loop to remove any snapshots older than 7 days
for obj0 in $(cat /tmp/snap_info.txt)
do
snapshot_name=`cat /tmp/snap_info.txt | grep "$obj0" | awk '{print $2}'`
datecheck_old=`cat /tmp/snap_info.txt | grep "$snapshot_name" | awk '{print $5}' | awk -F "T" '{printf "%sn", $1}'`
datecheck_s_old=`date "--date=$datecheck_old" +%s`
# echo "snapshot name: $snapshot_name"
# echo "datecheck 7d : $datecheck_7d"
# echo "datecheck 7d s : $datecheck_s_7d"
# echo "datecheck old : $datecheck_old"
# echo "datecheck old s: $datecheck_s_old"
if (( $datecheck_s_old <= $datecheck_s_7d ));
then
echo "deleting snapshot $snapshot_name ..."
$ec2_bin/ec2-delete-snapshot -C $my_cert -K $my_key $snapshot_name
else
echo "not deleting snapshot $snapshot_name ..."
fi
done
# Create snapshot
for volume in $(cat /tmp/volume_info.txt | grep "VOLUME" | awk '{print $2}')
do
description="`hostname`_backup-`date +%Y-%m-%d`"
echo "Creating Snapshot for the volume: $volume with description: $description"
$ec2_bin/ec2-create-snapshot -C $my_cert -K $my_key -d $description $volume
done
|