【问题标题】:Delete older than month AWS EC2 snapshots删除超过一个月的 AWS EC2 快照
【发布时间】:2022-02-25 02:39:54
【问题描述】:

下面给出的命令是否可以删除早于一个月的 AWS EC2 快照。

aws 描述快照 | grep -v (日期 +%Y-%m-) | grep snap- | awk '{打印 $2}' | xargs -n 1 -t aws 删除快照

【问题讨论】:

  • 为什么不将--dry-run添加到delete-snapshot命令中并自己测试呢?

标签: amazon-web-services amazon-ec2


【解决方案1】:

您的命令无法正常工作主要是因为拼写错误:aws describe-snapshots 应该是 aws ec2 describe-snapshots

无论如何,除了 aws 之外,您无需任何其他工具即可做到这一点:

snapshots_to_delete=$(aws ec2 describe-snapshots --owner-ids xxxxxxxxxxxx --query 'Snapshots[?StartTime<=`2017-02-15`].SnapshotId' --output text)
echo "List of snapshots to delete: $snapshots_to_delete"

# actual deletion
for snap in $snapshots_to_delete; do
  aws ec2 delete-snapshot --snapshot-id $snap
done

确保您始终知道要删除的内容。以echo $snap 为例。
此外,将--dry-run 添加到aws ec2 delete-snapshot 可以表明请求中没有错误。


编辑:

第一个命令有两点需要注意:

  1. --owner-ids - 您的帐户唯一 ID。可在 AWS 控制台右上角手动轻松找到:Support-&gt;Support Center-&gt;Account Number xxxxxxxxxxxx

  2. --query - JMESPath 查询仅获取晚于指定日期(例如:2017-02-15)创建的快照:Snapshots[?StartTime&gt;=`2017-02-15`].SnapshotId

【讨论】:

  • 如果我错了,请纠正我,但是 ?StartTime>=2017-02-15 会选择比 2017-02-15 更新的快照,对吧?所以我认为这是 =.
  • 这一次只给了我一个快照ID...这是意料之中的吗?我正在尝试以这种方式删除数千张快照
  • @CyrilDuchon-Doris $snapshots_to_delete 变量应该包含一长串由空格分隔的快照 id
  • 在运行时获取 illegal token value?您的 awscli 版本可能太旧了。升级到 1.16 对我有用 (maybe JMESPath is in > 1.2)。还要确保您的 pip 大于 2.9,否则您将收到 SNIMissingWarning 的警告。
  • 我编辑了答案以解决 ThePerson 和 Cyril Duchon-Doris 报告的问题
【解决方案2】:

+1 @roman-zuzha 让我靠近。当$snapshots_to_delete 没有解析成一长串由空格分隔的快照时,我确实遇到了麻烦。

下面的这个脚本确实将它们解析成一长串快照 ID,在我的 Ubuntu(可信)14.04 上使用 awscli 1.16 进行 bash 分隔:

#!/usr/bin/env bash

dry_run=1
echo_progress=1

d=$(date +'%Y-%m-%d' -d '1 month ago')
if [ $echo_progress -eq 1 ]
then
  echo "Date of snapshots to delete (if older than): $d"
fi

snapshots_to_delete=$(aws ec2 describe-snapshots \
    --owner-ids xxxxxxxxxxxxx \
    --output text \
    --query "Snapshots[?StartTime<'$d'].SnapshotId" \
)
if [ $echo_progress -eq 1 ]
then
  echo "List of snapshots to delete: $snapshots_to_delete"
fi


for oldsnap in $snapshots_to_delete; do

  # some $oldsnaps will be in use, so you can't delete them
  # for "snap-a1234xyz" currently in use by "ami-zyx4321ab"
  # (and others it can't delete) add conditionals like this

  if [ "$oldsnap" = "snap-a1234xyz" ] ||
     [ "$oldsnap" = "snap-c1234abc" ]
  then
    if [ $echo_progress -eq 1 ]
    then
       echo "skipping $oldsnap known to be in use by an ami"
    fi
    continue
  fi

  if [ $echo_progress -eq 1 ]
  then
     echo "deleting $oldsnap"
  fi

  if [ $dry_run -eq 1 ]
  then
    # dryrun will not actually delete the snapshots
    aws ec2 delete-snapshot --snapshot-id $oldsnap --dry-run
  else
    aws ec2 delete-snapshot --snapshot-id $oldsnap
  fi
done

根据需要切换这些变量:

dry_run=1           # set this to 0 to actually delete
echo_progress=1     # set this to 0 to not echo stmnts

date -d 字符串更改为您要删除“早于”的天数、月数或年数的人类可读版本:

d=$(date +'%Y-%m-%d' -d '15 days ago')  # half a month

找到您的帐户 ID 并将这些 XXXX 更新为该号码:

    --owner-ids xxxxxxxxxxxxx \

这是一个可以找到该号码的示例:


如果在 cron 中运行它,您只想看到错误和警告。一个常见的警告是正在使用快照。两个示例快照 id (snap-a1234xyz, snap-c1234abc) 会被忽略,否则它们会打印如下内容:

调用 DeleteSnapshot 操作时发生错误 (InvalidSnapshot.InUse):快照 snap-a1234xyz 当前正在被 ami-zyx4321ab 使用

请参阅“snap-a1234xyx”示例快照 ID 附近的 cmets,了解如何处理此输出。


And don't forget to check on the handy examples and references in the 1.16 aws cli describe-snapshots manual.

【讨论】:

    【解决方案3】:

    您可以在“--owner-ids”中使用“self”,并使用此单行命令删除在特定日期(例如 2018-01-01)之前创建的快照:

    for i in $(aws ec2 describe-snapshots --owner-ids self --query 'Snapshots[?StartTime<=`2018-01-01`].SnapshotId' --output text); do echo Deleting $i; aws ec2 delete-snapshot --snapshot-id $i; sleep 1; done;
    

    【讨论】:

    • 这真的很有用,我们可以记录异常。新的生命周期 AMI 一代通过取消注册最旧的 AMI(如 GDG 或 Log Rotate)来保留 x 个 AMI,但不会删除快照 ($$$)。讨厌频繁更新 cli,因为中断太多了,尤其是文本输出。
    【解决方案4】:

    日期条件必须在括号()内

    aws ec2 describe-snapshots \
        --owner-ids 012345678910 \
        --query "Snapshots[?(StartTime<='2020-03-31')].[SnapshotId]"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-15
      • 1970-01-01
      • 2015-05-05
      • 2016-08-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多