【问题标题】:How to bulk delete multiple AWS snapshots using AWS CLI?如何使用 AWS CLI 批量删除多个 AWS 快照?
【发布时间】:2022-02-22 23:05:40
【问题描述】:

所以使用 SnapshotID 删除 AWS Snapshot 的命令如下

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

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

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

【问题讨论】:

  • 你不能,因为目前还没有命令可以这样做。
  • 检索快照列表并将其通过管道传输到某些内容中,然后检查您是否可以遍历文件。或者将快照复制到编辑器中,进入列选择模式并在前面插入aws命令,或者用aws命令替换每个链接中断等。有一百万个答案要实现,你只需要找到你最喜欢的一个熟悉。
  • 这样的事情可能会起作用:ec2-describe-snapshots | grep SNAPSHOT | sort -k 5 | head -200 | awk '{print "Deleting-> " $2; system("ec2-delete-snapshot " $2)}'
  • CLI 和默认输出格式可能已更改?我的经验: * 必须使用aws ec2 describe-snapshots 作为第一个命令。 * 必须在删除命令中添加--snapshot-id 选项。 * 必须使用aws config 命令或--output 选项设置文本输出。 * 排序列和打印列仍有一些问题。 * 与字段分隔符和列计数相比,使用 JSON 或 YAML 输出可能更容易,并使用 Python 进行迭代。

标签: amazon-web-services aws-cli


【解决方案1】:

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

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

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

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

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

如果您讨厌使用 Excel,那么您可以用 Python 编写一个简单的脚本来遍历列表并调用 delete_snapshot() 命令。

【讨论】:

  • 这正是我使用 bash 脚本所遵循的。不得不稍作调整,因为一些快照位于不同的区域。但这个解决方案就像一个魅力。
【解决方案2】:

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 打印:显示几个字段($4、$6、$8...)用于跟踪。
  • Awk 系统:使用 $8,基于以前的

与之前评论者提供的字段有所不同。

  • 可能是 aws cli 差异,
  • 可能是操作系统/shell 的差异。
  • 不管怎样,先做一个简短的测试打印字段。

感谢this AWS forum thread 中的想法。

【讨论】:

    【解决方案3】:

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

    命令:

    aws ec2 describe-snapshots --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 模块

    【讨论】:

      【解决方案4】:

      # 删除 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
      

      【讨论】:

      • 您可以简单地使用--owner-ids self 列出当前 AWS 账户拥有的快照。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-07-10
      • 2020-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多