Conditionally define Elastic Beanstalk environment variable using CloudFormation
我想使用CloudFormation模板创建一个Elastic Beanstalk。我想定义一个环境变量
首先我尝试了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | Parameters: var1: Type: String Conditions: isVar1Empty: !Equals [ !Ref var1,"" ] Resources: ElasticBeanstalkEnvironment: Type: 'AWS::ElasticBeanstalk::Environment' Properties: OptionSettings: - Namespace: 'aws:elasticbeanstalk:application:environment' Condition: isVar1Empty OptionName: ENV_VAR_1 Value: !Ref var1 |
然后我尝试了
1 2 3 4 5 6 7 8 9 10 11 12 | Parameters: var1: Type: String Resources: ElasticBeanstalkEnvironment: Type: 'AWS::ElasticBeanstalk::Environment' Properties: OptionSettings: - Namespace: 'aws:elasticbeanstalk:application:environment' OptionName: ENV_VAR_1 Value: !If [[!Equals [ !Ref var1,"" ]], !Ref 'AWS::NoValue', !Ref var1] |
及其许多排列组合。结果相同:当
的情况下创建Elastic Beanstalk
条件将在资源级别应用...当前,您不能将条件应用于特定属性。
要满足这些确切要求(这有点难看),您可以做的是创建两个条件,一个条件否定另一个条件。然后使用这两个条件,让它们有条件地创建特定资源。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | Parameters: var1: Type: String Conditions: isVar1Empty: !Equals [ !Ref var1,"" ] isVar1NonEmpty: !Not [ !Equals [ !Ref var1,"" ] ] Resources: ElasticBeanstalkEnvironmentWithVar1: Type: 'AWS::ElasticBeanstalk::Environment' Condition: isVar1NonEmpty Properties: OptionSettings: - Namespace: 'aws:elasticbeanstalk:application:environment' OptionName: ENV_VAR_1 Value: !Ref var1 ElasticBeanstalkEnvironmentWithoutVar1: Type: 'AWS::ElasticBeanstalk::Environment' Condition: isVar1Empty Properties: OptionSettings: - Namespace: 'aws:elasticbeanstalk:application:environment' |
就像我说的...有点难看。请注意,只有当您拥有一个或两个这样的变量时,这才真正有效。一旦添加了第二个或第三个"可选"参数,该参数很快就会开始失去控制。
一个更好的选择可能是使用诸如胡子之类的模板库来生成您的CloudFormation模板。
在选项级别处理条件的另一种解决方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | Conditions: CreateProdResources: !Equals [!Ref Env,"prod"] EBEnvironment: Type: AWS::ElasticBeanstalk::Environment Properties: OptionSettings: - Namespace :"aws:elasticbeanstalk:command" OptionName: Timeout Value : 1200 - Namespace : !If [CreateProdResources,"aws:elbv2:listener:443","aws:elasticbeanstalk:command"] OptionName: !If [CreateProdResources, Protocol, Timeout] Value : !If [CreateProdResources, HTTPS, 1200] - Namespace : !If [CreateProdResources,"aws:elbv2:listener:443","aws:elasticbeanstalk:command"] OptionName: !If [CreateProdResources, SSLPolicy, Timeout] Value : !If [CreateProdResources,"ELBSecurityPolicy-2016-08", 1200] - Namespace : !If [CreateProdResources,"aws:elbv2:listener:443","aws:elasticbeanstalk:command"] OptionName: !If [CreateProdResources, SSLCertificateArns, Timeout] Value : !If [CreateProdResources, !Ref ACMCertificate, 1200] |
重复的选项在Elastic Beanstalk中仅被考虑一次。