2016-10-18 9 views
1

EC2、CloudFormation(およびTroposphere)などに入ろうとしています。夜間に実行する単純なSelenium Gridから始めようとしています。現在、私たちは必要に応じて12個のセレン・ノード(それぞれがそれ自身のEC2インスタンスです)を回転させて使用しています。スタックは一度に数時間しか稼働しません。将来はもっと必要になる可能性が高いので、静的にノード数を設定するのではなく、Jenkinsが動的にノード数を増やすように設定しようとしています。Troposphereでn個のec2インスタンスを動的に作成する

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 
特に例の束を見た後 - 今

は、私はそれがうまく動作するはずのように見えるループのためのシンプルなんです私も、コンストラクタにすべてを渡してみました

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

答えて

1

まあ、私が骨抜きだと分かったら、私はその質問を削除するつもりでした...しかし、すべての人類のために "答えられた質問"を削除するという小さなメッセージ、yadda yadda yaddaは私に罪悪感を感じさせました。うまくいけば、そこの誰かが私の間違いから学ぶことができます。その答えについては

...

は対流圏(私はそれは私のせいだったと仮定)と間違って何もないが判明。私は完全にSelenium Hubを忘れていました.Selenium Hubはそれ自体のインスタンスですが、必要なノードの数に基づいて動的に設定されません。私はハブのためのリソースを部分的に追加しました。あなたはそれを推測する - 私はImageId kwargを指定するのを忘れていた。私がそれを加えたら(そして他のいくつかのkwargs)、すべては完璧に機能しました。

@phobologicと他のすべてのTroposphereのメンテナーに叫んでください。あなたのために、2500行以上のJSONオブジェクトを〜175行のPythonスクリプトに変換することができます。

+0

ああ、あなたがそれを理解してうれしい嬉しいです。私は実際には、問題の原因となっているオブジェクトのタイトル(そのタイトルが付いているもの)をその例外のポイントにする方法があるのであれば、今は疑問に思っています。私は見て、あなたのような言葉をありがとう:) – phobologic

+0

私は先に進み、これらの問題のトラブルシューティングをより簡単にするためのPRを作成しました:https://github.com/cloudtools/troposphere/pull/597 – phobologic

1

対流圏のメンテナ。どの時点でValueErrorを取得していますか?完全なスタックトレースを共有できますか?

これを修正しない可能性がありますが、私が指摘したことは、オブジェクトの作成後にインスタンスの個々の属性を指定する必要はないということです。

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")], 
     IamInstanceProfile="SeleniumNode", 
    ) 
    template.add_resource(instance) 

あなたも、それを短縮することができます::代わりに、あなたは通常、代わりにこのコードを使用することになり、あなたの問題ではないようです。とにかく

for i in range(numNodes): 
    instance = template.add_resource(
     ec2.Instance(
      "Node{}".format(str(i)), 
      ImageId=Ref(Image) 
      UserData=Base64(Join("", userData)), 
      InstanceType=Ref(NodeSize), 
      KeyName=Ref(SSHKey), 
      SecurityGroups=[Ref("NodeSecurityGroup")], 
      IamInstanceProfile="SeleniumNode", 
     ) 
    ) 

、 - あなたは、フルを共有することができればスタックトレースは、あなたが使用している両方のpythonの&対流圏のバージョンだけでなく、役立つだろうエラーのために。

+0

実際には短縮してコンストラクタに渡しましたが、同じエラーが発生しています。 – Sathed

+0

申し訳ありませんが、早すぎます。あなたが求めた情報で質問を更新しました。 – Sathed

関連する問題