Я только вхожу в EC2, CloudFormation (и Troposphere) и т. Д. Я пытаюсь начать с простой Selenium Grid, которая будет работать каждую ночь. Прямо сейчас мы используем 12 узлов селена (каждый на своем собственном экземпляре EC2), когда это необходимо. Стаки собираются только на пару часов за раз. Весьма вероятно, что нам понадобится больше в будущем, поэтому вместо того, чтобы устанавливать количество узлов статически, я пытаюсь настроить его так, чтобы Дженкинс мог динамически увеличивать количество узлов.
Прямо сейчас у меня есть простой цикл for, который, похоже, должен работать нормально - особенно после просмотра нескольких примеров:
for i in range(numNodes):
instance = ec2.Instance("Node{}".format(str(i)))
instance.ImageId = Ref(Image)
instance.UserData = Base64(Join("", userData))
instance.InstanceType = Ref(NodeSize)
instance.KeyName = Ref(SSHKey)
instance.SecurityGroups = [Ref("NodeSecurityGroup")]
instance.IamInstanceProfile = "SeleniumNode"
template.add_resource(instance)
Полная трассировка стека:
Traceback (most recent call last):
File "C:/dev/source/admin/scripts/troposphere/seleniumGrid.py", line 171, in <module>
print(template.to_json())
File "C:\Users\Sathed\AppData\Local\Programs\Python\Python35-32\lib\site-packages\troposphere\__init__.py", line 543, in to_json
sort_keys=sort_keys, separators=separators)
File "C:\Users\Sathed\AppData\Local\Programs\Python\Python35-32\lib\json\__init__.py", line 237, in dumps
**kw).encode(obj)
File "C:\Users\Sathed\AppData\Local\Programs\Python\Python35-32\lib\json\encoder.py", line 200, in encode
chunks = list(chunks)
File "C:\Users\Sathed\AppData\Local\Programs\Python\Python35-32\lib\json\encoder.py", line 429, in _iterencode
yield from _iterencode_dict(o, _current_indent_level)
File "C:\Users\Sathed\AppData\Local\Programs\Python\Python35-32\lib\json\encoder.py", line 403, in _iterencode_dict
yield from chunks
File "C:\Users\Sathed\AppData\Local\Programs\Python\Python35-32\lib\json\encoder.py", line 403, in _iterencode_dict
yield from chunks
File "C:\Users\Sathed\AppData\Local\Programs\Python\Python35-32\lib\json\encoder.py", line 436, in _iterencode
o = _default(o)
File "C:\Users\Sathed\AppData\Local\Programs\Python\Python35-32\lib\site-packages\troposphere\__init__.py", line 440, in default
return obj.JSONrepr()
File "C:\Users\Sathed\AppData\Local\Programs\Python\Python35-32\lib\site-packages\troposphere\__init__.py", line 223, in JSONrepr
"Resource %s required in type %s" % (k, rtype))
ValueError: Resource ImageId required in type AWS::EC2::Instance
Параметр My Image выглядит так:
Image = template.add_parameter(Parameter(
"Image",
Type="AWS::EC2::Image::Id", # I even tried setting this to "String"
Description="AMI To use for all windows grid instances.",
Default="ami-c06b24a0"
))
Я даже пробовал передать все в конструктор.
for i in range(numNodes):
instance = ec2.Instance("Node{}".format(str(i)),
ImageId=Ref(Image),
UserData=Base64(Join("", userData)),
InstanceType=Ref(NodeSize),
KeyName=Ref(SSHKey),
SecurityGroups=[Ref("NodeSecurityGroup")],
DependsOn=["NodeSecurityGroup", "WindowsHub"],
IamInstanceProfile="SeleniumNode")
template.add_resource(instance)
Но я все еще получаю ту же ошибку. Я уверен, что это что-то глупое, но это стало довольно раздражающим. Есть предположения?
Кроме того, я получаю сообщение об ошибке при попытке распечатать шаблон JSON.
print(template.to_json())
Тропосфера 1.8.2
Python 3.5.2