셸 스크립트를 사용하여 Amazon EC2 볼륨 생성 및 삭제

셸 스크립트를 사용하여 Amazon EC2 볼륨 생성 및 삭제

Amazon AWS 클라우드 서비스의 볼륨을 정기적으로 백업하기 위해 다음 스크립트를 사용하고 있습니다. 볼륨의 새 스냅샷을 생성하고 이틀 전의 스냅샷을 삭제해야 합니다. 새로운 스냅샷을 생성하는 데에는 잘 작동하지만, 오래된 스냅샷을 삭제하는 데에는 제대로 작동하지 않습니다.

#!/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."

아래 줄은 단지 이틀 전의 스냅샷을 제공하지만 이틀 이전의 스냅샷은 제공하지 않습니다.

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

답변2

타임스탬프는 문자열이 시간순으로 정렬되도록 구성됩니다. 따라서 $TIMESTAMP<를 사용하여 오래된 것을 찾을 수 있습니다 $CUTOFF.

  • 스냅샷 목록을 가져오는 데 사용됩니다 ec2-describe-snapshots -C $EC2_CERT -K $EC2_PRIVATE_KEY | grep $volume.
  • Foreach 스냅샷:
    • 타임스탬프 추출
    • 타임스탬프 <인 경우 $OLD삭제

답변3

여러 곳에서 얻은 몇 가지 아이디어를 결합했기 때문에 다른 사람에게 도움이 될 수 있도록 오래된 스냅을 삭제하는 데 사용한 내용을 공유해야겠다고 생각했습니다.

    ec2-describe-snapshots | awk '{print $5 "\t" $2}' > /backups/tmp/snapshot_info_start.txt
    grep -v '^[A-Za-z]' /backups/tmp/snapshot_info_start.txt > /backups/tmp/snapshot_info.txt

    cat /backups/tmp/snapshot_info.txt | while read obj0

    do
            Snapshot_Name=`cat /backups/tmp/snapshot_info.txt | grep "$obj0" | awk '{print $2}'`
            Snapshot_Old=`cat /backups/tmp/snapshot_info.txt | grep "$Snapshot_Name" | awk '{print $1}'`
            Snapshot_Old_s=`date "--date=$Snapshot_Old" +%s`

            if (($Snapshot_Old_s <= $SnapCheck_21_Day_s)) ;
            then
                    echo "Deleting Snapshot $Snapshot_Name ... "
                    ec2-delete-snapshot $Snapshot_Name

            else
                    echo "Not deleting snapshot $Snapshot_Name ...  "

            fi

관련 정보