I’ve stolen the example from here but i’ve made my own adjustments
1. Create an Amazon IAM user for snapshotting and save the credentials file. ( You’ll need them to use the amazon cli api , it comes in csv format)
Create an Amazon IAM Group for snapshot permissions
add a “Custom Policy” and paste the code block below
Example IAM Policy:
{
"Statement": [
{
"Action": [
"ec2:DescribeVolumes",
"ec2:CreateSnapshot",
"ec2:DeleteSnapshot",
"ec2:DescribeSnapshotAttribute",
"ec2:DescribeSnapshots",
"ec2:ModifySnapshotAttribute",
"ec2:ResetSnapshotAttribute"
],
"Effect": "Allow",
"Resource": [
"*"
]
}
]
}
2. Install the Amazon CLI Tools
$ wget http://s3.amazonaws.com/ec2-downloads/ec2-api-tools.zip $ unzip ec2-api-tools.zip $ mv ec2-api-tools /opt $ ln -s /opt/ec2-api-tools /opt/aws
3. Install the below script in cron on your snapshot interval and change the “Constants” and also plugin your AWS Keys
Script Below
#!/bin/bash
# EBS Snapshot volume script
# Constants - You'll want to edit these
JAVA_HOME="/usr"
EC2_HOME="/opt/aws"
ec2_bin="/opt/aws/bin"
export EC2_HOME
export JAVA_HOME
LOGFILE='/var/log/aws_snapshot.log'
TMPFILE='/tmp/snap_info.txt'
VOLTMPFILE='/tmp/volume_info.txt'
# Retention in days
RETENTION="7"
# AWS ACCESS INFO
access_key='SOMEACCESSKEY'
secret_key='SOMESECRETKEY'
instance_id=`wget -q -O- http://169.254.169.254/latest/meta-data/instance-id`
# Dates
datecheck_7d=`date +%Y-%m-%d --date "$RETENTION days ago"`
datecheck_s_7d=`date --date="$datecheck_7d" +%s`
datenow=`date +%Y-%m-%d-%H:%M:%S`
# Add entry in logfile for run begin
echo "${datenow} ======= BEGIN SNAPSHOT SCRIPT =========" 2>&1 >> $LOGFILE
# Get all volume info and copy to temp file
$ec2_bin/ec2-describe-volumes -O $access_key -W $secret_key --filter "attachment.instance-id=$instance_id" > $VOLTMPFILE 2>&1
# Get all snapshot info
$ec2_bin/ec2-describe-snapshots -O $access_key -W $secret_key | grep "$instance_id" > $TMPFILE 2>&1
# Loop to remove any snapshots older than 7 days
for obj0 in $(cat $TMPFILE | awk '{print $5}')
do
snapshot_name=`cat $TMPFILE | grep "$obj0" | awk '{print $2}'`
datecheck_old=`cat $TMPFILE | grep "$snapshot_name" | awk '{print $5}' | awk -F "T" '{print $1}'`
datecheck_s_old=`date --date="$datecheck_old" +%s`
# Check if snapshot is older than retention days
if (( $datecheck_s_old <= $datecheck_s_7d ));
then
echo "deleting snapshot $snapshot_name ... older than $RETENTION days" 2>&1 >> $LOGFILE
$ec2_bin/ec2-delete-snapshot -O $access_key -W $secret_key $snapshot_name
else
echo "not deleting snapshot $snapshot_name ... not older than $RETENTION days" 2>&1 >> $LOGFILE
fi
done
# Create snapshot
for volume in $(cat $VOLTMPFILE | grep "VOLUME" | awk '{print $2}')
do
# Description cannot have spaces
description="instance-id:${instance_id}_vol-id:${volume}_`hostname`_backup-`date +%Y-%m-%d`"
echo "Creating Snapshot for the volume: $volume with description: $description" 2>&1 >> $LOGFILE
$ec2_bin/ec2-create-snapshot -O $access_key -W $secret_key -d "$description" $volume 2>&1 >> $LOGFILE
done