如何使用 AWS CLI 批量删除多个 AWS 快照?

问题描述 投票:0回答:7

因此使用 SnapshotID 删除 AWS 快照的命令如下

aws ec2 delete-snapshot --snapshot-id snap-1234567890abcdef0 

我有一个包含 400 个快照 ID 的列表需要删除。我应该使用什么命令来使用 SnapshotID 批量删除它们。

**PS:没有任何快照被标记。

amazon-web-services aws-cli
7个回答
8
投票

# 删除 us-west-2 区域内的所有快照:

for K in $(aws ec2 --region us-west-2 describe-snapshots --owner-ids=${AWS_OWNER_ID} --query 'Snapshots[*].SnapshotId' --output=text); do
aws ec2 --region us-west-2 delete-snapshot --snapshot-id $K
done

4
投票

这是一个听起来很愚蠢的解决方案,但非常有效......

我通常会创建一个 Excel 电子表格,并在第一列中包含 ID 列表

然后,我使用包含完整命令的公式创建第二列,并引用在适当位置插入 ID 的第一列。然后我复制所有行的公式。

为了测试公式,我复制第一行并将其粘贴到我的 shell 中以确认其按预期工作。

然后,我将公式生成的所有行粘贴到文本文件中,然后在 shell 中执行该文本文件。如果您从 Amazon EC2 实例执行此操作,它将运行得更快,因为它减少了网络延迟,但从您自己的计算机运行它也同样有效。只需去喝杯咖啡即可。

如果您讨厌使用 Excel,那么您可以用 Python 编写一个简单的脚本,循环访问列表并调用

delete_snapshot()
命令。


0
投票

批量删除aws-cli 2.2的快照

在以下版本/系统上测试:

% aws --version
aws-cli/2.2.26 Python/3.8.8 Darwin/20.6.0 exe/x86_64 prompt/off

等等...它正在截断快照 ID,因此删除失败。 (?!)

哎呀。我稍后会再回顾一下这一点。 :-(

命令:

% aws ec2 describe-snapshots | grep SNAPSHOT | sort -k 6 | head -20 \
    | awk '{print "Deleting-> " $4,$6,$8,$9,$10; \
      system("aws ec2 delete-snapshot --snapshot-id " $8)}'

输出:

Deleting-> image.vmdk 099720109477 snap-005349429a002f03b 2019-05-08T11:09:45.481000+00:00 completed
Deleting-> image.vmdk 099720109477 snap-00ea72d226a56a8cf 2019-05-29T16:27:54.246000+00:00 completed
    :

备注:

  • 命令采用 v2 格式,与问题中给出的匹配。
  • Grep:用于 SNAPSHOT 跳过任何 TAGS 行。
  • 排序:对我来说是字段 6
  • 头部:20个用于测试;一旦起作用就增加。
  • awk print:显示几个用于跟踪的字段($4、$6、$8...)。
  • awk 系统:使用 $8,基于之前的

字段与之前评论者给出的字段有所不同。

  • 可能是 aws cli 差异,
  • 可能是操作系统/外壳差异。
  • 无论哪种方式,先做一个简短的测试打印字段。

感谢此 AWS 论坛主题中的想法。


0
投票

注意:这将从您的区域中删除在 AWS CLI 中配置的所有快照 使用此命令将所有快照 ID 保存在 sgn.txt 文件中。

命令:

aws ec2 描述快照 --owner-ids self --query 'Snapshots[].SnapshotId' > sgn.txt


[
    "snap-04030b95f2ebcbe6e",
    "snap-06e1a8394774c8486",
    "snap-03c6659d966953d6c",
    "snap-02de629dc082b33cb",
    "snap-033dfc52483c09455"
]

删除括号并使文件看起来像这样,并在最后一个 id 中添加“,”

"snap-04030b95f2ebcbe6e",
"snap-06e1a8394774c8486",
"snap-03c6659d966953d6c",
"snap-02de629dc082b33cb",
"snap-033dfc52483c09455",

现在使用下面的Python代码来删除所有快照

代码:

import boto3
client = boto3.client('ec2',region_name='us-east-1')
file=open('sgn.txt','r')
l=file.readlines()
for i in l: 
    s=i.strip()
    s=s[1:len(s)-2]
    client.delete_snapshot(SnapshotId=s)
    print(s,"deleted")

注:- 您必须配置 aws cli 才能运行此 python 文件,并且还需要在 python 中安装 boto3 模块


0
投票

使用@Lock-o-motiffe的答案

如果您尝试按描述搜索或按标签等任何其他内容进行过滤,并且还拥有 aws sso,请首先执行

aws ec2 describe-snapshots --region us-west-2 --owner-ids self --profile <your-profile> --filters '{"Name":"description","Values":["Created by CreateImage(*) for *"]}' --query 'Snapshots[*].SnapshotId' --output=text --max-items 5

然后执行以下操作并删除 --max-items 标志:

for K in $(aws ec2 describe-snapshots --region us-west-2 --owner-ids self --profile <your-profile> --filters '{"Name":"description","Values":["Created by CreateImage(*) for *"]}' --query 'Snapshots[*].SnapshotId' --output=text); do
aws ec2 delete-snapshot --region us-west-2 --profile <your-profile> --snapshot-id $K
done

名称可以是此处过滤器选项中列出的任何名称https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ec2/describe-images.html,例如架构、名称、标签等等


0
投票

尝试了上面@Lock-o-motiffe 的答案。

它几乎对我有用,但是

describe-snapshots
命令在一行中输出其格式,并用制表符分隔,这导致循环失败。通过添加将制表符转换为换行符的
sed
对其进行了调整(在 Mac 环境中):

for K in $(aws ec2 --region REGION_HERE describe-snapshots --owner-ids=OWNER_ID_HERE --query 'Snapshots[*].SnapshotId' --output=text | sed 's/\t/\n/g' | head -2); do
echo $K
  aws ec2 --region REGION_HERE delete-snapshot --snapshot-id $K
done

0
投票

由于备份过程没有生命周期策略,我们发现了数万个链接到 AMI 的快照。如果您有数千个快照,这里的答案可能会失败,因为“参数列表太长”。如果快照链接到 AMI,您必须先取消注册 AMI。运行了很多小时,所以我输出了日期。

这是我使用的脚本,用于取消注册 >10k AMI,然后删除 >100k 快照。 警告:这将删除您的所有备份。在运行此操作之前,请保护您想要保留的 AMI/快照。

date
# deregister AMIs in batches of 100 
numAMIs=$(aws ec2 describe-images --owners self --output text|wc -w)
echo "Deregistering $numAMIs AMIs"
for i in $( seq 1 $((numAMIs/100)) ); do 
  echo $i
  for image in $( aws ec2 describe-images --owners self --query "Images[0:100].ImageId" --output text ); do
    aws ec2 deregister-image --image-id $image
  done  
done

date

# delete snapshots in batches of 100
numSnapshots=$(aws ec2 describe-snapshots --owner-ids self --output text|wc -w)
echo "Deleting $numSnapshots snapshots"
for i in $(seq 1 $((numSnapshots/100)) ); do 
  echo $i
  for snapshot in $( aws ec2 describe-snapshots  --owner-ids self --query "Snapshots[0:100].SnapshotId" --output text ); do 
    aws ec2 delete-snapshot --snapshot-id $snapshot
  done
done 
date
© www.soinside.com 2019 - 2024. All rights reserved.