我正在构建Amazon中的EC2实例列表。我正在测试字典中是否存在称为PrivateIpAddress和PublicIpAddress的键。在某些情况下,这两个键都不存在,并且出现异常:
-------------------------------------
Instance ID: i-86533615
Type: m4.xlarge
State: stopped
Private IP: 10.1.233.18
Traceback (most recent call last):
File ".\aws_ec2_list_instances.py", line 43, in <module>
print(Fore.CYAN + "{0}: {1}".format(key, instance[key]))
KeyError: 'Public IP'
我的代码说:
for instance in reservation["Instances"]:
if 'PrivateIpAddress' in instance and 'PublicIpAddress' in instance:
... do stuff...
elif 'PrivateIpAddress' in instance:
else:
...do stuff..
但是最后一个没有解决实例既没有公共IP地址又没有私有IP地址的问题。
这是python中的完整代码:list ec2 instances
答案 0 :(得分:1)
for instance in reservation.get("Instances", []):
private_ip_address = instance.get("PrivateIpAddress" , None)
public_ip_address = instance.get("PublicIpAddress" , None)
if private_ip_address and public_ip_address:
... do stuff...
elif private_ip_address:
...do stuff..
else:
...do stuff..
尝试这个
答案 1 :(得分:1)
我认为您的逻辑存在一个基本问题。您正在遍历所有实例,并在 ec2info 中为每个实例建立地图。但是,每次循环时,在处理特定实例时,您都会循环遍历 ec2info 中的所有数据,包括循环的先前迭代添加的数据。我敢打赌,您真的不想这样做。我敢打赌,您真的想只显示您正在处理的实例的属性。
这是解决您问题的关键:
attributes = ['Instance ID', 'Type',
'State', 'Private IP', 'Launch Time' ]
for instance_id, instance in ec2info.items():
因此,在这里,您要遍历 ec2info 中的所有地图,但是您要应用一组特定于您当前正在处理的实例的“属性”。由于通常来说,按照您自己的代码, ec2info 中的并非所有地图都具有全部相同的键,因此您会遇到错误。