Я пытался найти решение этой проблемы, которая у меня возникла, но я борюсь с ней, потому что я новичок в 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
, но когда я выполняю эту часть снаружи, она работает нормально исоздает экземпляр EC2.
Я хочу, чтобы он работал в цикле for, который будет перебирать резервирование и получать экземпляры оттуда.Позже я разбью его на функции, чтобы он был более читабельным, и надеюсь, что он заработает: /
Спасибо за вашу помощь, ребята!