我们最终得到了删除了AMI的大量AWS EC2快照,但是这些快照被遗弃了。我想要一种非手动的方式来识别和删除这些孤儿,以节省我们的金钱和空间。

理想情况下,我在考虑利用CLI的bash脚本,但是我的AWS-fu很弱。我以为以前有人这样做过,但是我找不到真正有效的脚本。

在最佳情况下,这还将检查体积并清理体积,但这可能更适合第二个问题。

评论

我在python上的版本。使用方法和github链接

#1 楼

受此问题启发的博客帖子和要旨在很大程度上受到启发,这是我对问题的看法。

我确实使用了一些复杂的JMESpath函数来获取快照列表,而不需要tr

免责声明:使用时需要您自担风险,我会尽力避免出现任何问题并保持默认的默认值,但是如果这给您造成问题,我将不承担任何责任。 >
 #!/bin/sh
# remove x if you don't want to see the commands
set -ex

# Some variable initialisation with sane defaults
DRUN='--dry-run'
DO_DELETE=${1:-'no'}
REGION=${2:-'eu-west-1'}
ACCOUNTID=${3:-'self'}

# Get two temporary files
SNAP_FILE=$(mktemp)
IMAGE_FILE=$(mktemp)

# Get the snapshot list and the volume list
aws --region "$REGION" ec2 describe-snapshots --owner-ids "$ACCOUNTID" --query 'Snapshots[*].[SnapshotId]' --output text > "$SNAP_FILE"
aws --region "$REGION" ec2 describe-images --owners "$ACCOUNTID" --filters Name=state,Values=available --query 'Images[*].BlockDeviceMappings[*].Ebs.[SnapshotId]' --output text > "$IMAGE_FILE"

# Check if the outputed command should be dry-run (default) or not
if [ "$DO_DELETE" = "IAMSURE" ]
then
 DRUN=''
fi

# count each snapshot id, decrease when a volume reference it, print delete command for those with no volumes
awk -v REGION="$REGION" -v DRUN="$DRUN" '
FNR==NR { snap[]++; next } # increment snapshots and get to next line in file immediately

{ snap[]-- } # we changed file, decrease the snap counter when a volume reference it

END {
 for (s in snap) { # loop over the snapshots
   if (snap[s] > 0) { # if we did not decrese under 1 that means there is no volume referencing this snapshot
    cmd="aws --region " REGION " " DRUN " ec2 delete-snapshot --snapshot-id " s
    print(cmd)
  }
 }
}
' "$SNAP_FILE" "$IMAGE_FILE"
# Clean up the temp files
rm "$SNAP_FILE" "$IMAGE_FILE"
 


我希望脚本本身有足够的注释。

默认用法(无参数) )将列出当前帐户和区域eu-west-1的孤立快照的删除命令,提取:

aws --region eu-west-1 --dry-run ec2 delete-snapshot --snapshot-id snap-81e5856a
aws --region eu-west-1 --dry-run ec2 delete-snapshot --snapshot-id snap-95c68c7e
aws --region eu-west-1 --dry-run ec2 delete-snapshot --snapshot-id snap-a3bf50bd


您可以将此输出重定向到文件进行审核

如果希望脚本执行命令而不是打印命令,请用print(cmd)替换system(cmd)

用法如下,并使用脚本命名为snap_cleaner

用于空运行命令n us-west-1地区

./snap_cleaner no us-west-1


eu-central-1中可用的命令

./snap_cleaner IAMSURE eu-central-1 


第三个参数可用于访问另一个帐户(我更喜欢以前将角色切换到另一个帐户)。 />
#!/bin/sh
set -ex

# Some variable initialisation with sane defaults
DRUN='--dry-run'
DO_DELETE=${1:-'no'}
REGION=${2:-'eu-west-1'}
ACCOUNTID=${3:-'self'}

# Get two temporary files
SNAP_FILE=$(mktemp)
IMAGE_FILE=$(mktemp)

# Get the snapshot list and the volume list
aws --region "$REGION" ec2 describe-snapshots --owner-ids "$ACCOUNTID" --query 'Snapshots[*].[SnapshotId]' --output text > "$SNAP_FILE"
aws --region "$REGION" ec2 describe-images --owners "$ACCOUNTID" --filters Name=state,Values=available --query 'Images[*].BlockDeviceMappings[*].Ebs.[SnapshotId]' --output text > "$IMAGE_FILE"

# Check if the outputed command should be dry-run (default) or not
if [ "$DO_DELETE" = "IAMSURE" ]
then
 DRUN=''
fi

# count each snapshot id, decrease when a volume reference it, print delete command for those with no volumes
awk -v REGION="$REGION" -v DRUN="$DRUN" 'FNR==NR { snap[]++; next } { snap[]-- } END { for (s in snap) { if (snap[s] > 0) { cmd="aws --region " REGION " " DRUN " ec2 delete-snapshot --snapshot-id " s; print(cmd) } } }' "$SNAP_FILE" "$IMAGE_FILE"
# Clean up the temp files
rm "$SNAP_FILE" "$IMAGE_FILE"


评论


太棒了!除了“跟随”(IMO应该是“跟随”)之外,我认为此答案应被视为高质量帖子的样本。免责声明(其中SE网站上某人使用的任何内容都带有“自担风险”),其中似乎唯一有点多余。我只能想到您可能要添加的另外一项改进:指示您是否测试了该脚本,如果可以,则如何总结其测试结果(例如“按设计工作”?)。显然,如果您已经使用过它,那将是一个更好的指示。

– Pierre.Vriens♦
17 Mar 23 '17 at 11:08

@pierre今天早上写了它,经过了部分测试,可能会在今天下午进入我们的渠道。尽管我同意“按原样提供”的一般想法,但是删除“备份”的风险很高,我觉得我应该强调一下更。

–滕西拜
17 Mar 23 '17 at 11:16

嗯,所以我们可以帮助您启动针对这些DevOps需求的免费代码编写服务(附带一些免责声明字符串)...有趣!我建议稍后(时间合适时)添加一个小更新(最后),例如“我的脚本今天下午进入了我们的管道”。

– Pierre.Vriens♦
17 Mar 23 '17 at 11:24

@ Pierre.Vriens我说过,也许不能保证,也可以在下周或更晚;)

–滕西拜
17 Mar 23 '17 at 12:40

完美,谢谢编辑!完全按预期工作。

– Alex
17 Mar 23 '17 at 14:19

#2 楼

我在Rodrigue Koffi(bonclay7)的GitHub上使用了以下脚本,它的效果很好。

https://github.com/bonclay7/aws-amicleaner

命令:

amicleaner --check-orphans


从文档博客文章中,它还可以做更多的事情:


实际上,它的作用还不止这些如今它允许:


删除图像列表和相关快照
映射AMI:


使用名称
使用标签


过滤AMI:


用于运行自动缩放组(启动配置)中的实例的
,所需容量设置为0
与自动缩放组分离的启动配置中的



指定要保留的AMI数量
清理孤立的快照
少量报告
>


#3 楼

这是一个可以帮助您查找孤立快照的脚本

comm -23 <(echo $(ec2-describe-snapshots --region eu-west-1 | grep SNAPSHOT | awk '{print }' | sort | uniq) | tr ' ' '\n') <(echo $(ec2-describe-images --region eu-west-1 | grep BLOCKDEVICEMAPPING | awk '{print }' | sort | uniq) | tr ' ' '\n') | tr '\n' ' '


(从这里开始)

也可以从serverfault中查看此文章

PS当然,您可以更改区域以反映您的

P.P.S.这里是更新的代码:

 comm -23 \
<(echo $(aws ec2 describe-snapshots --region eu-west-1 |awk '/SNAPSHOT/ {print }' | sort -u) | tr ' ' '\n') \
<(echo $(aws ec2 describe-images --region eu-west-1 |  awk '/BLOCKDEVICEMAPPING/ {print }' | sort -u) | tr ' ' '\n') | tr '\n' ' '


示例示例代码的作用是:

echo $(aws ec2 describe-snapshots --region eu-west-1 | awk '/SNAPSHOT/ {print }' | sort -u) | tr ' ' '\n')


发送到STDOUT快照列表。此构造:

<(...)


创建虚拟临时文件处理程序以使comm命令从两个“文件”中读取并进行比较

评论


你测试了吗?我找到了同一篇文章,但无法正常工作。如果可以的话,用户错误会终止,但是我担心根据文章的年龄可能会过时。

– Alex
17 Mar 22 '17 at 18:26

@Alex,明天可以检查一下

–罗密欧·尼诺夫(Romeo Ninov)
17 Mar 22 '17 at 18:27

命令已更改,请使用aws ec2 describe / delete

–滕西拜
17 Mar 22 '17 at 18:47

我确实找到了相同的源,但是链接hero awk sort和uniq使我的shell编码器感到难过,我明天将发布我的版本:)

–滕西拜
17年3月22日在18:53

对我来说很好,只是想向您提供一些(建设性的)反馈,以使您知道专家(像您)看起来像普通英语,对我来说看起来像中文。 PS:听起来也不像佛兰德语...如果您想在完成后通知我,请给我多条评论(如果您想要我的最新反馈)。

– Pierre.Vriens♦
17年3月22日在19:22



#4 楼

这是Daniil Yaroslavtsev所要求的GitHub Gist代码片段。

它使用所有图像及其快照的列表,并将ID与所有快照ID的列表进行比较。剩下的就是孤儿了。该代码的工作原理与上述答案相同,但格式更好,可读性更高。

该代码利用了带有
--query Snapshots[*].SnapshotId选项的JMESPath(如果已经在您的发行版中,您也可以使用jp命令行实用程序。使用--output text将输出格式化为文本。这里是指向API参考的链接和一些示例,它比一长串的grep / awk / sort / uniq / tr管道更为优雅。

Todd Walton的警告:不要误会“ jq”实用程序,它使用不同的查询语言来解析json文档。

评论


仅供参考,jq命令行实用程序与“ aws”命令使用的JSON查询语言不同。 “ aws”命令使用JMESPath。

–托德·沃尔顿(Todd Walton)
18年11月14日在17:54

感谢您指出这一点。我今天学到了一些新东西。

–吉里·克劳达(Jiri Klouda)
18年11月14日在18:58

#5 楼

我编写了snapshots.py脚本,该脚本遍历所有快照(在定义的区域列表中)并生成report.csv。此文件包含有关所有快照引用的实例,AMI和卷的信息。

还有命令以交互方式删除悬空的快照。