我正在尝试使用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。