使用AWS Lambda的boto3获取未使用的AMI

时间:2017-03-14 11:26:00

标签: python amazon-web-services lambda aws-lambda boto3

我正在尝试使用boto3获取所有未使用的AMI的列表。

创建变量

import boto3

REGION = 'us-east-1'
OWNER_ID = 'XXXXXXXXXXXX'

ec2_client = boto3.client('ec2', REGION)
ec2_resource = boto3.resource('ec2', REGION)

按实例获取AMI ID

def get_used_amis_by_instances():

    reservations = ec2_client.describe_instances(
        Filters=[
        {
            'Name': 'owner-id',
            'Values': [
                OWNER_ID,
            ]
        },
    ])['Reservations']
    amis_used_list = []
    for reservation in reservations:
        ec2_instances = reservation['Instances']
        for ec2 in ec2_instances:
            ImageId = ec2['ImageId']
            if ImageId not in amis_used_list:
                amis_used_list = amis_used_list + [ImageId]
    return amis_used_list

获取所有AMI ID

我只需要AMI ID ID列表

def get_all_amis():
    amis = ec2_resource.images.filter(Owners = [OWNER_ID])
    all_amis = []
    for ami in amis.all():
        if ami.id not in all_amis:
            all_amis = all_amis + [ami.id]
    return all_amis

获取未使用的AMI。

使用以前的方法,我有all_amis和all_used_amis。

def get_unused_amis(all_amis, all_used_amis):

    unused_amis_list = []
    for ami_id in all_amis:
        if ami_id not in all_used_amis:
            if ami_id not in unused_amis_list:
                unused_amis_list = unused_amis_list + [ami_id]
    return unused_amis_list

输出结果

def deregister_amis(event, context):

    all_amis = get_all_amis()
    print("All AMIs: %d" % len(all_amis) )

    all_used = get_used_amis_by_instances()
    print("All used AMIs: %d" % len(all_used) )

    all_unused = get_unused_amis(all_amis, all_used)
    print("All unused AMIs: %d" % len(all_unused) )

我的问题

deregister_amis正在返回

  • 所有AMI :201
  • 所有使用的AMI :102
  • 所有未使用的AMI :140

对于所有未使用的AMI,我预计99。我不知道我的错误在哪里。但是我不知道102的使用值是否有错误。总数是正确的201,但是其他两个值可能是我做错了什么或遗漏了什么。如果你能看到我的错误在哪里,请告诉我,因为我可以。

1 个答案:

答案 0 :(得分:2)

许多实例都可以使用一个AMI。使用list,您可能会将相同的AMI添加到列表中(其中多个实例使用相同的AMI)。如果您想要运行多个实例,而不是AMI,那么您的列表就可以了。

你应该首先使用set(),而不是列表。只需将所有列表转换为set()即可。另外,使用set,你可以做减法,同步等。所以你真的不需要冗余的get_unused_amis()函数。

使用set

非常简单
unused_ami = all_amis - all_used_amis

快速入侵

def deregister_amis(event, context):

    all_amis = set(get_all_amis())
    print("All AMIs: %d" % len(all_amis) )

    all_used = set(get_used_amis_by_instances())
    print("All used AMIs: %d" % len(all_used) )

    all_unused = all_amis - all_used 
    print("All unused AMIs: %d" % len(all_unused) )

在另一个观点之后,我认为使用快速黑客更好。保留列表会给您一个额外的好处:您可以查看多次使用多少AMI。