I am working on a CLI for AWS, and I'm trying to get all instances of all EC2 into a single dict, across all regions.
def get_all_ec2_instances_in_all_regions(self):
ec2_instance_list = {}
region_list = list_ec2_instance_regions() #this returns a list of regions to iterate on
print('Finding Regions')
for region in region_list:
region_name = region['RegionName']
ec2 = boto3.client('ec2', region_name=region_name)
regional_instance_list_return = ec2.describe_instances()['Reservations']
if len(regional_instance_list_return) == 0:
ec2_instance_list.update({
region_name: regional_instance_list_return
})
for reservation in regional_instance_list_return:
instance_id= reservation['Instances'][0]['InstanceId']
ec2_instance_list.update({
region_name: {
instance_id: reservation['Instances'][0]
}
})
print('Region search complete')
print(prettyPrintDict(ec2_instance_list)) #prettyPrintDict just console logs the dict in a nicer format for human readability
The resulting object only has one single dict object with the instance_id
as the key, even though regional_instance_list_return
actually has a list with multiple objects in it.
I would figure this code would add dictionaries with each InstanceID Like this
{ region1_name:
{ instance_id1: {instance1 data},
instance_id2: {instance2 data},
instance_id3: {instance3 data}
}
region2_name:
{ instance_id1: {instance1 data},
instance_id2: {instance2 data},
instance_id3: {instance3 data},
instance_id4: {instance4 data}
}
... and so on
}
but the resulting dict actually looks like this when it's finished:
{ region1_name:
{
instance_id3: {instance3 data}
}
region2_name:
{
instance_id4: {instance4 data}
}
... and so on
}
It doesn't actually add each instance, it just overwrites the instance_id
key (Which is unique for each instance) and the key's values.
I was under the impression that if a key is unique, and you use dict.update()
it'll just add them all without overwriting? What am I doing wrong?