How to create and rotate Automatic Snapshot?

前端 未结 10 2034
梦如初夏
梦如初夏 2020-12-14 08:33

On Compute Engine we can do Snapshots, which are basically backups. Could you try to figure out how we could create a script to do automated snapshots every day and keep lik

10条回答
  •  轻奢々
    轻奢々 (楼主)
    2020-12-14 09:18

    UPDATE:

    The script has changed a lot since I first gave this answer - please see Github repo for latest code: https://github.com/jacksegal/google-compute-snapshot

    ORIGINAL ANSWER:

    I had the same problem, so I created a simple shell script to take a daily snapshot and delete all snapshots over 7 days: https://github.com/Forward-Action/google-compute-snapshot

    #!/usr/bin/env bash
    export PATH=$PATH:/usr/local/bin/:/usr/bin
    
    #
    # CREATE DAILY SNAPSHOT
    #
    
    # get the device name for this vm
    DEVICE_NAME="$(curl -s "http://metadata.google.internal/computeMetadata/v1/instance/disks/0/device-name" -H "Metadata-Flavor: Google")"
    
    # get the device id for this vm
    DEVICE_ID="$(curl -s "http://metadata.google.internal/computeMetadata/v1/instance/id" -H "Metadata-Flavor: Google")"
    
    # get the zone that this vm is in
    INSTANCE_ZONE="$(curl -s "http://metadata.google.internal/computeMetadata/v1/instance/zone" -H "Metadata-Flavor: Google")"
    
    # strip out the zone from the full URI that google returns
    INSTANCE_ZONE="${INSTANCE_ZONE##*/}"
    
    # create a datetime stamp for filename
    DATE_TIME="$(date "+%s")"
    
    # create the snapshot
    echo "$(gcloud compute disks snapshot ${DEVICE_NAME} --snapshot-names gcs-${DEVICE_NAME}-${DEVICE_ID}-${DATE_TIME} --zone ${INSTANCE_ZONE})"
    
    
    #
    # DELETE OLD SNAPSHOTS (OLDER THAN 7 DAYS)
    #
    
    # get a list of existing snapshots, that were created by this process (gcs-), for this vm disk (DEVICE_ID)
    SNAPSHOT_LIST="$(gcloud compute snapshots list --regexp "(.*gcs-.*)|(.*-${DEVICE_ID}-.*)" --uri)"
    
    # loop through the snapshots
    echo "${SNAPSHOT_LIST}" | while read line ; do
    
       # get the snapshot name from full URL that google returns
       SNAPSHOT_NAME="${line##*/}"
    
       # get the date that the snapshot was created
       SNAPSHOT_DATETIME="$(gcloud compute snapshots describe ${SNAPSHOT_NAME} | grep "creationTimestamp" | cut -d " " -f 2 | tr -d \')"
    
       # format the date
       SNAPSHOT_DATETIME="$(date -d ${SNAPSHOT_DATETIME} +%Y%m%d)"
    
       # get the expiry date for snapshot deletion (currently 7 days)
       SNAPSHOT_EXPIRY="$(date -d "-7 days" +"%Y%m%d")"
    
       # check if the snapshot is older than expiry date
    if [ $SNAPSHOT_EXPIRY -ge $SNAPSHOT_DATETIME ];
            then
         # delete the snapshot
             echo "$(gcloud compute snapshots delete ${SNAPSHOT_NAME} --quiet)"
       fi
    done
    

提交回复
热议问题