我正在尝试使用boto3获取所有未使用的AMI的列表。
import boto3
REGION = 'us-east-1'
OWNER_ID = 'XXXXXXXXXXXX'
ec2_client = boto3.client('ec2', REGION)
ec2_resource = boto3.resource('ec2', REGION)
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 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
使用以前的方法,我有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,我预计99。我不知道我的错误在哪里。但是我不知道102的使用值是否有错误。总数是正确的201,但是其他两个值可能是我做错了什么或遗漏了什么。如果你能看到我的错误在哪里,请告诉我,因为我可以。
答案 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。