删除未使用的 Amazon EC2 快照

Remove unused Amazon EC2 Snapshots

自从亚马逊从 ec2-ami-tools 切换到 awscli(检查 this) Robert Sindall's solution 不再可接受。

所以我决定根据新的 python/json 标准重写他的脚本。

欢迎提出任何问题或提供您的解决方案。

请安装和配置 awscli properly. For MacOS I would recommend brew 版本。

安装完成后别忘了运行 aws configure

对我来说完美无缺,但无论如何使用它需要您自担风险。

import json, subprocess

def remove_unused_snaps(region):
    line = 'aws ec2 describe-images --region {} --owners self'.format(region)
    p = subprocess.Popen(line.split(),
                         stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    out, err = p.communicate()
    obj = json.loads(out.decode("utf-8"))

    snaps_used = set(i['BlockDeviceMappings'][0]['Ebs']['SnapshotId'] for i in obj['Images'])

    line = 'aws ec2 describe-snapshots --region {} --owner-ids self'.format(region)
    p = subprocess.Popen(line.split(),
                         stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    out, err = p.communicate()
    obj = json.loads(out.decode("utf-8"))

    snaps_old = set(i['SnapshotId'] for i in obj['Snapshots'])

    line = 'aws ec2 delete-snapshot --region {} --snapshot-id'.format(region)
    for snap in list(snaps_old - snaps_used):
        p = subprocess.Popen(line.split() + [snap],
                             stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        out, err = p.communicate()
        print(snap, out, err)

然后简单地运行它:remove_unused_snaps('us-west-2')