シェルスクリプトを使用したAmazon EC2ボリュームの作成と削除

シェルスクリプトを使用したAmazon EC2ボリュームの作成と削除

Amazon AWS クラウドサービスのボリュームを定期的にバックアップするには、次のスクリプトを使用しています。ボリュームの新しいスナップショットを作成し、2日前のスナップショットを削除する必要があります。新しいスナップショットの作成にはうまく機能しますが、古いスナップショットの削除にはうまく機能しません。

#!/bin/bash
#
# File: vol-snapshot.sh
TODAY=`date +%m-%d-%Y`
echo "================================================"
echo "Starting SNAPSHOT creation and deletion process for $TODAY"
echo ""
echo "The script will create a snapshot of every single volume"
echo "It will delete snapshots older than two days"
echo ""
echo "Setting ENVIRONMENTAL VARIABLES FOR ec2"

##
#
export EC2_HOME='/usr/local/ec2'  # Make sure you use the API tools, not the     AMI tools
export EC2_BIN=$EC2_HOME/bin
export EC2_PRIVATE_KEY=$EC2_HOME/pk-XXXXXXXXXXXXXXXXXXXXXXXXXXXXX.pem
export EC2_CERT=$EC2_HOME/cert-XXXXXXXXXXXXXXXXXXXXXXXXXXX.pem
export REGION=us-east-1d
export PATH=$PATH:$EC2_BIN
export OLD=`date +%m-%d-%Y --date '2 days ago'`
##
#

#
# To find the current location of JAVA_HOME, try env | grep JAVA_HOME
# It's necessary to put this environment variable in here because
# cron will not have access to your standard environment variables.
export JAVA_HOME=/usr/lib/jvm/jre-1.6.0-openjdk.x86_64
##

## Get Volumes
VOLUMES=`ec2-describe-volumes | grep VOLUME | cut -f 2`
echo "The volumes are: $VOLUMES"
echo ""

echo "===================================="
echo "Creating snapshots of volumes: $VOLUMES"
echo ""
for volume in $VOLUMES
do 
  ec2-create-snapshot -C $EC2_CERT -K $EC2_PRIVATE_KEY -d "Creating     Snapshots for $TODAY" $volume
done

echo""
echo "====================================="
echo "Deleting snapshots older than two days for $VOLUMES"
echo ""
for volume in $VOLUMES
do
OLDEST=`ec2-describe-snapshots -C $EC2_CERT -K $EC2_PRIVATE_KEY | grep     $volume | grep $OLD | sed -e 's/.*snap/snap/' | sed -e 's/\t.*//'`
    if [ "x$OLDEST" != "x" ]; then
        ec2-delete-snapshot -C $EC2_CERT -K $EC2_PRIVATE_KEY $OLDEST
        else
        echo "No other snapshots to delete using this script."
    fi
done
echo "The end of script."

下の行は2日前のスナップショットを提供しますが、2日前のスナップショットは提供しません。

OLDEST=`ec2-describe-snapshots -C $EC2_CERT -K $EC2_PRIVATE_KEY | grep $volume | grep $OLD | sed -e 's/.*snap/snap/' | sed -e 's/\t.*//'

また、ifの前にforループの下に配置する必要がありますか?

ここで誰かが私を助けることができたら、私はとても嬉しいです。

ベストアンサー1

アーカイブする最近のスナップショットの数(この場合は28個、作成したばかりの「保留中」のスナップショットを含む)を確認し、それより古いスナップショットを削除します。

for SNAPSHOT in `ec2-describe-snapshots | grep $THIS_EBS_VOLUME | grep -v pending | head -n -27 | awk '{print $2}'` ; do
  ec2-delete-snapshot $SNAPSHOT
done

おすすめ記事