Python3 - Анализ AWS тегов экземпляра из json. Испытываю ошибочное поведение c - PullRequest
2 голосов
/ 22 января 2020

Моя задача: разобрать вывод из вывода "aws ec2 description-instances" json, чтобы собрать различные сведения об экземпляре, включая тег "Name", назначенный экземпляру.

Выдержка из моего кода:

# 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"
                        }
                    ],

Все работает, кроме "Тегов" раздел, который работает в некоторых случаях и не работает в других, хотя значение «Имя», которое я проверяю, существует во всех случаях. Другими словами, я получаю «None» в результате в некоторых случаях, которые действительно имеют тег «Name» и имя. Я исключил проблемы с именами серверов, т. Е. Пробелами и специальными символами, приводящими к результату Я также пытался убедиться, что python ищет именно «Имя» и никаких других вариантов. Я озадачен в этом пункте, и любая помощь будет оценена.

Заранее спасибо

1 Ответ

0 голосов
/ 23 января 2020

У вас есть проблема с логикой c:

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"
  }
]

Когда он выполняет итерацию для l oop , он сначала оценит пару ключ-значение Name: My_Name и установит instance_name в My_Name, однако for l oop продолжит работу, и когда он оценит вторую пару ключ-значение, он установит instance_name на None, перезаписывая ранее присвоенное значение.

Одним из простых решений было бы выйти из для l oop при нахождении клавиши Name, например:

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

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