因此使用 SnapshotID 删除 AWS 快照的命令如下
aws ec2 delete-snapshot --snapshot-id snap-1234567890abcdef0
我有一个包含 400 个快照 ID 的列表需要删除。我应该使用什么命令来使用 SnapshotID 批量删除它们。
**PS:没有任何快照被标记。
# 删除 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
这是一个听起来很愚蠢的解决方案,但非常有效......
我通常会创建一个 Excel 电子表格,并在第一列中包含 ID 列表。
然后,我使用包含完整命令的公式创建第二列,并引用在适当位置插入 ID 的第一列。然后我复制所有行的公式。
为了测试公式,我复制第一行并将其粘贴到我的 shell 中以确认其按预期工作。
然后,我将公式生成的所有行粘贴到文本文件中,然后在 shell 中执行该文本文件。如果您从 Amazon EC2 实例执行此操作,它将运行得更快,因为它减少了网络延迟,但从您自己的计算机运行它也同样有效。只需去喝杯咖啡即可。
如果您讨厌使用 Excel,那么您可以用 Python 编写一个简单的脚本,循环访问列表并调用
delete_snapshot()
命令。
在以下版本/系统上测试:
% 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
:
备注:
字段与之前评论者给出的字段有所不同。
感谢此 AWS 论坛主题中的想法。
注意:这将从您的区域中删除在 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 模块
使用@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,例如架构、名称、标签等等
尝试了上面@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
由于备份过程没有生命周期策略,我们发现了数万个链接到 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