使用boto3 witn aws lambda获取未使用的Amis



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

创建变量

import boto3
REGION = 'us-east-1'
OWNER_ID = 'XXXXXXXXXXXX'
ec2_client = boto3.client('ec2', REGION)
ec2_resource = boto3.resource('ec2', REGION)

通过实例获取AMIS 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

获取所有AMIS ID

我只需要AMIS 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

获得未使用的Amis。

使用以前的方法我有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正在返回

  • 所有AMIS :201
  • 全部使用的Amis :102
  • 所有未使用的AMIS :140

我希望所有未使用的AMIS 99。我看不到我的错误在哪里。但是我看不出使用的二手值为102是否存在错误。总计是正确的201,但是其他两个值也许我在做错事或缺少某些事情。让我知道您是否能够看到我的错误,因为我可以。

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

您应该首先使用set(),而不是列表。只需将您的所有列表转换为set()。另外,使用集合可以减法,一致等。因此,您确实不需要冗余get_unused_amis()函数。

使用集合

是如此简单
unused_ami = all_amis - all_used_amis

快速hack

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。

最新更新