理想情况下,我在考虑利用CLI的bash脚本,但是我的AWS-fu很弱。我以为以前有人这样做过,但是我找不到真正有效的脚本。
在最佳情况下,这还将检查体积并清理体积,但这可能更适合第二个问题。
#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和卷的信息。还有命令以交互方式删除悬空的快照。
评论
我在python上的版本。使用方法和github链接