troposphere模板add_resource中使用if判断的替代方案有哪些
解决方案
你遇到的问题是Python语法限制导致的:Python不允许在类实例化的关键字参数列表中直接写if代码块,同时你写的三元运算符语法也不符合Python规范,正确的Python三元表达式语法为结果A if 判定条件 else 结果B,不需要加冒号。
方案1:使用正确的三元运算符(单参数简单判断场景)
直接用正确的三元表达式给BucketName传参即可,修改后的代码如下:
s3_bucket = t.add_resource(Bucket( "MyBucket", # 正确的三元表达式写法 BucketName="bucket1" if 2>1 else "bucket2", CorsConfiguration=CorsConfiguration( "CorsConfiguration", CorsRules=[CorsRules( "AllowOrganization", AllowedMethods=["GET"], AllowedOrigins=["*"], )] ), Tags=Tags( Environment="aa", ) ))
方案2:预构造参数字典再解包传入(多参数复杂判断场景)
如果需要判断的参数不止一个,或者判断逻辑比较复杂,可以先把所有参数拼写成字典,再通过字典解包的方式传入Bucket构造函数:
# 先定义固定参数 bucket_params = { "CorsConfiguration": CorsConfiguration( "CorsConfiguration", CorsRules=[CorsRules( "AllowOrganization", AllowedMethods=["GET"], AllowedOrigins=["*"], )] ), "Tags": Tags( Environment="aa", ) } # 条件判断添加动态参数 if 2>1: bucket_params["BucketName"] = "bucket1" else: bucket_params["BucketName"] = "bucket2" # 解包字典传入构造函数 s3_bucket = t.add_resource(Bucket("MyBucket", **bucket_params))
方案3:使用troposphere内置If函数(部署时动态判断场景)
如果你需要把判断逻辑内置到生成的CloudFormation模板中,在部署阶段才根据条件决定参数值,可以使用troposphere提供的If工具函数:
from troposphere import If, Equals, Parameter, Ref # 先定义模板参数和条件 env_type = t.add_parameter(Parameter( "EnvType", Type="String", AllowedValues=["prod", "test"] )) t.add_condition("IsProd", Equals(Ref(env_type), "prod")) s3_bucket = t.add_resource(Bucket( "MyBucket", # 部署时如果是生产环境用bucket1,测试环境用bucket2 BucketName=If("IsProd", "bucket1", "bucket2"), CorsConfiguration=CorsConfiguration( "CorsConfiguration", CorsRules=[CorsRules( "AllowOrganization", AllowedMethods=["GET"], AllowedOrigins=["*"], )] ), Tags=Tags( Environment="aa", ) ))
内容的提问来源于stack exchange,提问作者cosmos-1905-14
相关产品推荐
相关产品推荐

