gpt4 book ai didi

Python3 - 从 json 解析 AWS 实例标签。经历古怪的行为

转载 作者:行者123 更新时间:2023-12-05 07:14:34 26 4
gpt4 key购买 nike

我的任务:解析来自“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 正在寻找准确的“名称”并且没有其他变体。我在这一点上感到困惑,任何帮助将不胜感激。

提前致谢

最佳答案

你这里有逻辑问题:

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 实例标签。经历古怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59868015/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com