使用 CloudFormation 有条件地定义 Elastic Beanstalk 环境变量

Kas*_*yap 5 environment-variables amazon-web-services aws-cloudformation amazon-elastic-beanstalk

我想使用 CloudFormation 模板创建 Elastic Beanstalk。我想定义一个环境变量ENV_VAR_1并将其值设置为模板参数的值var1。但如果是空字符串,ENV_VAR_1则根本 不想存在。var1即我不想要ENV_VAR_1没有价值的东西。

首先我尝试了Conditions,但我"Encountered unsupported property Condition"在创建ElasticBeanstalkEnvironment资源期间得到了。

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
Run Code Online (Sandbox Code Playgroud)

然后我尝试了AWS::NoValue

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]
Run Code Online (Sandbox Code Playgroud)

以及它的许多排列组合。具有相同的结果:当var1为空时,将创建 Elastic Beanstalk,并将其ENV_VAR_1设置为""

nic*_*ild 5

条件将应用于资源级别...目前,您无法将条件应用于特定属性。

为了满足这些确切的要求(这有点难看),您可以做的是创建两个条件,一个条件否定另一个条件。然后根据这两个条件,让他们有条件地创建特定资源。

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'
Run Code Online (Sandbox Code Playgroud)

就像我说的……有点丑。请注意,只有当您有一个或两个这样的变量时,这才真正有效。一旦添加第二个或第三个“可选”参数,这种情况很快就会开始失控。

更好的选择可能是使用Mustache等模板库生成 CloudFormation 模板。