Python3 - 从 json 解析 AWS 实例标签。经历不稳定的行为

Posted

技术标签:

【中文标题】Python3 - 从 json 解析 AWS 实例标签。经历不稳定的行为【英文标题】:Python3 - Parsing AWS instance tags from json. Experiencing erradic behavior 【发布时间】:2020-05-09 02:28:04 【问题描述】:

我的任务:解析“aws ec2 describe-instances”json 输出的输出以收集各种实例详细信息,包括分配给实例的“名称”标签。

我的代码摘录:

# Query AWS ec2 for instance information
        my_aws_instances = subprocess.check_output("/home/XXXXX/.local/bin/aws ec2 describe-instances --region %s --profile %s" % (region, current_profile), shell=True)

        # Convert AWS json to python dictionary
        my_instance_dict = json.loads(my_aws_instances)

        # Pre-enter the 'Reservations' top level dictionary to make 'if' statement below cleaner.
        my_instances = my_instance_dict['Reservations']

        if my_instances:

            for my_instance in my_instances:

                if 'PublicIpAddress' in my_instance['Instances'][0]:
                    public_ip = my_instance['Instances'][0]['PublicIpAddress']
                else:
                    public_ip = "None"

                if 'PrivateIpAddress' in my_instance['Instances'][0]:
                    private_ip = my_instance['Instances'][0]['PrivateIpAddress']
                else:
                    private_ip = "None"

                if 'Tags' in my_instance['Instances'][0]:
                    tag_list = my_instance['Instances'][0]['Tags']

                    for tag in tag_list:
                        my_tag = tag.get('Key')

                        if my_tag == "Name":
                            instance_name = tag.get('Value')
                        else:
                            instance_name = "None"

                state         = my_instance['Instances'][0]['State']['Name']
                instance_id   = my_instance['Instances'][0]['InstanceId']
                instance_type = my_instance['Instances'][0]['InstanceType']

以下是“tag”变量循环时包含的内容的示例。这是一个python字典:

'Value': 'server_name01.domain.com', 'Key': 'Name'

如果有帮助,这是实例标签的原始 json:

 "Tags": [
                        
                            "Value": "migration test",
                            "Key": "Name"
                        
                    ],

除了在某些情况下有效而在其他情况下无效的“标签”部分之外,一切都正常工作,即使我正在测试的“名称”值在所有情况下都存在。换句话说,在某些确实具有“名称”标签和名称的实例上,我得到“无”。 我已经排除了服务器名称本身的问题,即空格和特殊字符与结果有关。 我还尝试确保 python 正在寻找确切的“名称”并且没有其他变体。 在这一点上我很困惑,任何帮助将不胜感激。

提前致谢

【问题讨论】:

my_instance['Instances'][0]['State']['Name'] 返回None,对吗?您是否检查过名称是否出现在 my_instance 中,可能是在不同的键下? 为什么要调用子进程来运行aws,而不是直接从Python 中使用boto3?您想要一个如何使用 boto3 执行上述操作的示例吗? 嗨,约翰,是的,如果它更有效,那将会很有帮助。 【参考方案1】:

你这里有一个逻辑问题:

for tag in tag_list:
  my_tag = tag.get('Key')

  if my_tag == "Name":
    instance_name = tag.get('Value')
  else:
    instance_name = "None"

假设你有一个带有两个标签的实例,

[
  
    "Key": "Name",
    "Value": "My_Name"
  ,
  
    "Key": "foo",
    "Value": "bar"
  
]

当它遍历for循环时,它将首先评估Name: My_Name键值对并将instance_name设置为My_Name,但是for循环将继续运行,当它评估第二个键值时配对它会将instance_name 设置为None,覆盖之前分配的值。

一个简单的解决方案是在找到 Name 键后退出 for 循环,例如:

for tag in tag_list:
  my_tag = tag.get('Key')

  if my_tag == "Name":
    instance_name = tag.get('Value')
    break
  else:
    instance_name = "None"

【讨论】:

这就是解决方案。非常感谢您恢复我的理智!

以上是关于Python3 - 从 json 解析 AWS 实例标签。经历不稳定的行为的主要内容,如果未能解决你的问题,请参考以下文章

python3.0怎么用json从文件解析

Go 语言入门很简单 -- Go 语言解析JSON #私藏项目实操分享#

[Python3]JSON解析

Python3 JSON 数据解析

转 Python3 JSON 数据解析

AWS Lambda 错误:当 url 参数包含 JSON 数组时,“无法将请求正文解析为 json”