1

Following code is working for EC2 and it is adding the condition statement in the output, but for S3 its not producing the condition statement. I can manually add this statement to make it work, but that has many disadvantages.

from __future__ import print_function
from troposphere import (Template, Parameter, Ref, Condition, Equals)
from troposphere import ec2
from troposphere import s3

parameters = {
    "One": Parameter(
        "One",
         Type="String",
    ),
}

conditions = {
    "OneEqualsFoo": Equals(
        Ref("One"),
        "Foo"
  ),
}

resources = {
    "MyS3bucket": s3.Bucket(
         "MybucketName",
         Condition="OneEqualsFoo",
   ),

   "Ec2Instance": ec2.Instance(
       "Ec2Instance",
       Condition="OneEqualsFoo",
       ImageId="ami-1234556",
       InstanceType="t1.micro",
       KeyName="mykeypair",
       SecurityGroups=["default"],
   )
}

def template():
     t = Template()
 for p in parameters.values():
    t.add_parameter(p)
 for k in conditions:
    t.add_condition(k, conditions[k])
 for r in resources.values():
    t.add_resource(r)
return t
print(template().to_json())

OUT-PUT-RESULT this result is missing condition statement in S3 template section

{
"Conditions": {
    "OneEqualsFoo": {
        "Fn::Equals": [
            {
                "Ref": "One"
            },
            "Foo"
        ]
    }
},
"Parameters": {
    "One": {
        "Type": "String"
    }
},
"Resources": {
    "Ec2Instance": {
        "Condition": "OneEqualsFoo",
        "Properties": {
            "ImageId": "ami-1234556",
            "InstanceType": "t1.micro",
            "KeyName": "mykeypair",
            "SecurityGroups": [
                "default"
            ]
        },
        "Type": "AWS::EC2::Instance"
    },
    "MybucketName": {
        "Type": "AWS::S3::Bucket"
    }
}
}
Vertexwahn
  • 7,709
  • 6
  • 64
  • 90
Anup Singh
  • 313
  • 1
  • 5
  • 18

1 Answers1

2

I think you need to add Properties before adding Conditions:

So something like this should work:

 "MyS3bucket": s3.Bucket(
         "MybucketName",
         Tags=s3.Tags(),
         Condition="OneEqualsFoo"
   ),

or

    "MyS3bucket": s3.Bucket(
         "MybucketName",
         AccessControl=s3.PublicRead,
         Condition="OneEqualsFoo"
   )
Vor
  • 33,215
  • 43
  • 135
  • 193