Я вижу фундаментальную проблему в вашей логике. Вы просматриваете все экземпляры и строите карты для каждого из них в ec2info . Но каждый раз в цикле при обработке конкретного экземпляра вы перебираете все данные в ec2info , включая данные, добавленные предыдущими итерациями цикла. Бьюсь об заклад, вы не хотите этого делать. Держу пари, вы действительно хотите отобразить атрибуты только для экземпляра, над которым вы работаете.
Вот ключ к вашей проблеме:
attributes = ['Instance ID', 'Type',
'State', 'Private IP', 'Launch Time' ]
for instance_id, instance in ec2info.items():
Итак, здесь вы перебираете все карты в ec2info , и все же вы применяете набор «атрибутов», характерных для одного экземпляра, который вы сейчас обрабатываете. Так как в целом, согласно вашему собственному коду, не все карты в ec2info будут иметь все одинаковые ключи, вы получаете сообщение об ошибке.