首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >删除最早的AWS EC2快照

删除最早的AWS EC2快照
EN

Stack Overflow用户
提问于 2016-05-22 19:22:18
回答 3查看 3.9K关注 0票数 1

我正在尝试删除我所有的AWS EC2快照,除了最后6次使用这个脚本:

代码语言:javascript
复制
#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

# Backup script

Volume="{VOL-DATA}"
Owner="{OWNER}"
Description="{DESCRIPTION}"
Local_numbackups=6
Local_region="us-west-1"

# Remove old snapshots associated to a description, keep the last $Local_numbackups
aws ec2 describe-snapshots --filters Name=description,Values=$Description | grep "SnapshotId" | head -n -$Local_numbackups | awk '{print $2}' | sed -e 's/,//g' | xargs -n 1 -t aws ec2 delete-snapshot --snapshot-id

但是它不起作用。它删除实例,但不删除最老的实例。为什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-05-23 20:09:47

您试图在一行中完成一些过于复杂的操作(优雅地),因此我们需要对其进行一些细分。首先,让我们将快照按年龄排序,从最老到最新:

aws ec2 describe-snapshots --filters Name=description,Values=$Description --query 'Snapshots[*].[StartTime,SnapshotId]' --output text | sort -n

然后,我们可以删除StartTime字段,只获取快照ID:

aws ec2 describe-snapshots --filters Name=description,Values=$Description --query 'Snapshots[*].[StartTime,SnapshotId]' --output text | sort -n | sed -e 's/^.*\t//'

head (或tail)并不适合丢弃我们希望保留的固定数量的快照。我们需要用另一种方法过滤掉这些。因此,总而言之:

代码语言:javascript
复制
# Get array of snapshot IDs sorted by age (oldest to newest)
snapshots=($(aws ec2 describe-snapshots --filters Name=description,Values=$Description --query 'Snapshots[*].[StartTime,SnapshotId]' --output text | sort -n | sed -e 's/^.*\t//'))
# Get number of snapshots
count=${#snapshots[@]}

if [ "$count" -lt "$Local_numbackups" ]; then
  echo "We already have less than $Local_numbackups snapshots"
  exit 0
else
  # Drop the last (newest) $Local_numbackups IDs from the array
  snapshots=(${snapshots[@]:0:$((count - Local_numbackups))})
  # Loop through the remaining snapshots and delete
  for snapshot in ${snapshots[@]}; do
    aws ec2 delete-snapshot --snapshot-id $snapshot
  done
fi

(虽然在bash中使用AWS显然可以做到这一点,但它非常复杂,我个人宁愿使用更健壮的语言和AWS。)

票数 2
EN

Stack Overflow用户

发布于 2017-10-31 17:55:46

这是一个样本。

代码语言:javascript
复制
  days2keep="30"
  region="us-west-2"
  name="jdoe"

  #date - -v is for Osx

  cutoffdate=`date -j -v-${days2keep}d '+%Y-%m-%d'`

  echo "Finding list of snapshots before $cutoffdate "
  oldsnapids=$(aws ec2 describe-snapshots --region $region --filters Name=tag:Name,Values=$name --query Snapshots[?StartTime\<=\`$cutoffdate\`].SnapshotId --output text)

  for snapid in $oldsnapids
  do
    echo Deleting snapshot $snapid
    aws ec2 delete-snapshot --snapshot-id $snapid --region $region
  done
票数 2
EN

Stack Overflow用户

发布于 2016-10-28 21:23:32

我们可以使用以下步骤删除所有旧快照:

  • 列出所有快照ID--它们是旧的,并放入一个文件,如:-/opt/snshot.txt
  • 然后使用"aws配置“命令从命令行设置访问AWS帐户,此时我们需要提供凭据:-

例如:

代码语言:javascript
复制
AWS Access Key ID [None]: XXXXXXXXXXXXXXXXXX    
AWS Secret Access Key [None]: XXXXXXXXXXXXXXXXXXXXX    
Default region name [None]: XXXXXXXXXXXXXXXX
  • 之后,我们可以使用下面的shell脚本,我们需要给出快照ID的文件名

代码:

代码语言:javascript
复制
#!/bin/bash 

list=$(cat /opt/snapshot.txt) 

for i in $list 

do 

   aws ec2 delete-snapshot --snapshot-id $i 

   if [ $? -eq 0 ]; then 

     echo Going Good 

   else 

     echo FAIL 

   fi 

done

谢谢

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37378630

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档