从“ aws ec2 describe-instances”输出解析json时出现问题

时间:2019-12-27 20:03:19

标签: python json amazon-web-services parsing amazon-ec2

我正在尝试解析以下来自aws ec2 describe-instances cli命令输出的json:

    "Reservations": [
        {
            "Instances": [
                {
                    "Monitoring": {
                        "State": "disabled"
                    },
                    "PublicDnsName": "ec2xxxxxxxxxx.us-west-2.compute.amazonaws.com",
                    "StateReason": {
                        "Message": "Client.UserInitiatedShutdown: User initiated shutdown",
                        "Code": "Client.UserInitiatedShutdown"
                    },
                    "State": {
                        "Code": 80,
                        "Name": "stopped"
                    },
                    "EbsOptimized": false,
                    "LaunchTime": "2016-11-28T20:17:05.000Z",
                    "PublicIpAddress": "x.x.110.2",
                    "PrivateIpAddress": "x.x.2.2",

我能够解析“ LaunchTime”,但是使用相同的代码,我无法解析“ PublicIpAddress”或“ PrivateIpAddress。从逻辑上讲,这没有任何意义。

这是我的代码:

#!/usr/bin/python3

import json

with open('all-instances.json') as f:
    data = json.load(f)

for myInstance in data['Reservations']:
    print(myInstance['Instances'][0]['LaunchTime']) #This works
    print(myInstance['Instances'][0]['PublicIpAddress']) #This doesn't work

这是我得到的输出:

Traceback (most recent call last):
  File "./json-parsing.py", line 15, in <module>
    print(myInstance['Instances'][0]['PublicIpAddress'])
KeyError: 'PublicIpAddress'

所以我的问题是;为什么即使它们在同一个python词典中并且我使用的是完全相同的代码,我如何也可以获取LaunchTime的值而不是PublicIpAddress? 感谢您的协助。 埃里克

编辑:

这将说明没有公共IP的实例,并且将继续而不会引发错误。

if 'PublicIpAddress' in myInstance['Instances'][0]:
        print(myInstance['Instances'][0]['PublicIpAddress'])
else:
   print("None")

2 个答案:

答案 0 :(得分:0)

我认为这是因为实例之一没有PublicIpAddress。那是发生这种情况的唯一可能性

答案 1 :(得分:0)

我已经尝试过使用您的确切代码,并且可以正常工作,我想这是json文件本身的问题,也许不是所有实例都具有公共地址