boto 3 создать экземпляр ec2 из файла json, используя python - PullRequest
0 голосов
/ 11 сентября 2018

Я пытался найти решение этой проблемы, которая у меня возникла, но я борюсь с ней, потому что я новичок в python и почему-то считаю, что моя проблема в основном там, а не в BOTO3.

Что я пытаюсь сделать, это прочитать конфигурацию из файла JSON и с помощью этой конфигурации создать экземпляр EC2.Это работает для меня, если конфигурация включает в себя только 1 конфигурацию для создания экземпляра EC2, и я выбираю нужные параметры из загруженного JSON и сохраняю их в новом списке следующим образом:

imageId = instance[0]["ImageId"]
ec2params['ImageId'] = imageId

, но ..если у меня есть больше, это где я получил проблему.

Я пытаюсь зациклить конфигурацию, используя цикл for и сохранить необходимые параметры в списке, а затем передать его в BOTO3 функцию create_instances (), которая принимает** kwargs.

Проблема возникает, когда я пытаюсь переместить деталь BOTO3 внутри цикла for.

пример кода: import json import boto3

with open('EC2_us_east') as json_file:
        config = json.load(json_file)
        ec2region = "us-east-2"
        reservation = region["Reservations"]
        for reserv in reservation:
            ec2params = {}
            if "Instances" in reserv:
                instance = reserv["Instances"]
            else:
                print("No Instances object present in JSON file")
                break
            if "ImageId" in instance[0]:
                imageId = instance[0]["ImageId"]
                ec2params['ImageId'] = imageId
            else:
                print("No ImageId preset in Instances")
                break
            if "InstanceType" in instance[0]:
                instanceType = instance[0]["InstanceType"]
                ec2params["InstanceType"] = instanceType
                ec2params["MaxCount"] = 1
                ec2params["MinCount"] = 1
            else:
                print("No InstanceType present in Instances")
            if "KeyName" in instance[0]:
                keyName = instance[0]["KeyName"]
                ec2params["KeyName"] = keyName
            else:
                print("No KeyName present in Instances")
            if "Monitoring" in instance[0]:
                monitoring = instance[0]["Monitoring"]["State"]
            if monitoring == 'disabled':
                ec2params["Monitoring"] = {"Enabled": False}
            else:
                ec2params["Monitoring"] = {"Enabled": True}
            else:
                print("No Monitoring present in Instances")
            if "IamInstanceProfile" in instance[0]:
                iamInstanceProfile = instance[0]["IamInstanceProfile"]
                ec2params["IamInstanceProfile"] = iamInstanceProfile
            else:
                print("No IamInstanceProfile present in Instances")
            if "BlockDeviceMappings" in instance[0]:
                blockDeviceMappings = instance[0]["BlockDeviceMappings"]
                ec2params["BlockDeviceMappings"] = blockDeviceMappings
            else:
                print("No BlockDeviceMappings present in Instances")
            if "NetworkInterfaces" in instance[0]:
                networkInterfaces = instance[0]["NetworkInterfaces"]
                ec2params["NetworkInterfaces"] = networkInterfaces
            else:
                print("No NetworkInterfaces present in Instances")
            print(ec2params)

ec2 = boto3.resource('ec2', ec2region)
response = ec2.create_instances(**ec2params)
instance_id = response[0].instance_id
print("Instance: " + ec2params['InstanceType'] + " with ID: " +
  instance_id + " was created")

Когдасоздание части экземпляра происходит внутри цикла for, для меня это не получается, и я получаю ошибку проверки из BOTO3 при передаче ec2params validation error

, но когда я выполняю эту часть снаружи, она работает нормально исоздает экземпляр EC2.

Я хочу, чтобы он работал в цикле for, который будет перебирать резервирование и получать экземпляры оттуда.Позже я разбью его на функции, чтобы он был более читабельным, и надеюсь, что он заработает: /

Спасибо за вашу помощь, ребята!

...