Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services 删除最旧的AWS EC2快照_Amazon Web Services_Amazon Ec2 - Fatal编程技术网

Amazon web services 删除最旧的AWS EC2快照

Amazon web services 删除最旧的AWS EC2快照,amazon-web-services,amazon-ec2,Amazon Web Services,Amazon Ec2,我正在尝试使用以下脚本删除除最后6个快照之外的所有AWS EC2快照: #!/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_r

我正在尝试使用以下脚本删除除最后6个快照之外的所有AWS EC2快照:

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

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

您试图做的事情太复杂,无法(优雅地)在一行中处理,因此我们需要对其进行细分。首先,让我们按年龄对快照进行排序,从最老到最新:

aws ec2描述快照--过滤器名称=描述,值=$description--查询“快照[*].[StartTime,SnapshotId]”--输出文本|排序-n

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

aws ec2描述快照--过滤器名称=描述,值=$description--查询“快照[*].[StartTime,SnapshotId]”--输出文本| sort-n | sed-e's/^.*\t/'

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

# 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 CLI显然可以做到这一点,但它非常复杂,我个人宁愿使用更健壮的语言和AWS SDK。)

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

  • 列出所有旧的快照ID,并放入一个文件,如:-/opt/snapshot.txt

  • 然后使用“aws配置”命令从命令行设置访问aws帐户,此时我们需要提供凭据:-

例如:

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

#!/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
谢谢

这是一个示例

  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
days2keep=“30”
region=“美国西部-2”
name=“jdoe”
#日期--v代表Osx
截止日期=`date-j-v-${days2keep}d'+%Y-%m-%d'`
echo“查找$cutoffdate之前的快照列表”

oldsnapids=$(aws ec2描述快照--区域$region--过滤器名称=标记:名称,值=$Name--查询快照[?StartTime \看起来您假设
描述快照
返回按年龄排序的快照,但事实并非如此。您需要通过某种方式过滤响应。此外,看起来您实际上删除了响应的前6个快照,因为您是在对
输出进行操作。@KarenB I尝试使用sort-k 5对它们进行排序,但没有成功。如何对它们进行排序?有一个很好的预览功能,您可以使用它来正确设置代码的格式。此外,我相信
if
的拼写错误为
fi