在AWS CloudFormation模板的If Condition中使用importValue

时间:2019-02-14 23:56:17

标签: amazon-web-services yaml amazon-cloudformation

我正在尝试找到一种在If函数中使用ImportValue的方法,但是找不到合适的语法。任何帮助表示赞赏。

在我正在尝试的代码下面:

SomeTaskdefinition:
  Type: AWS::ECS::TaskDefinition
  Properties:
    Family: 'FamilyName'
    ContainerDefinitions:
    - Name: ContainerName
      Image: 'imagename:net/v2/
      Environment:
      - Name: ENV_VARIABLE_1
        Value:
          Fn::If:
            Fn::Equals:
              Fn::ImportValue:
                !Sub "${ImportStackname}-ECSCluster"
              ''
            'notpresent'
            'present'

3 个答案:

答案 0 :(得分:2)

我在这里遇到了类似的问题..我的想法是能够指定 DatabaseHost 作为参数,如果留空 - 值应该从 DatabaseStack 导出。这是我的示例代码 - 它在 !ImportValue 函数中使用 !If。你会得到这个想法(而不是只构造 Value - 构造整个 Name Value 列表对象)

Conditions:
  DatabaseHostPresent: !Not [ !Equals [ !Ref DatabaseHost, ""]]

Resources:
 ...
       ContainerDefinitions:
        - Name: !Sub ${ApplicationName}-web-${EnvironmentName}
          Environment:
            - !If
              - DatabaseHostPresent
              - Name: DB_HOST
                Value: !Ref DatabaseHost
              - Name: DB_HOST
                Value: !ImportValue
                  Fn::Sub: ${DatabaseStack}-EndpointAddress

答案 1 :(得分:0)

我认为这是不可能的。您不能在ImportValue函数内使用Equals

答案 2 :(得分:0)

解决此问题的另一种方法是使用嵌套模板:

  • 向子模板添加参数
  • 在“父”模板中,使用“导入”来填充参数
  • 在“子级”模板中,您可以做所有想做的事情,包括在Conditions部分中使用它

未经测试的示例:

# in Parent
Resources:
  ChildStack:
    Type: 'AWS::CloudFormation::Stack'
    Properties:
      Parameters:
        Stackname: {'Fn::ImportValue': !Sub "${ImportStackname}-ECSCluster"}
      TemplateURL: './child.yaml'

# in Child
Parameters:
  Stackname:
    Type: String
    Default: ''
Conditions:
  HasStack: !Not [!Equals [!Ref Stackname, '']]
Resources:
  SomeTaskdefinition:
    Type: AWS::ECS::TaskDefinition
    Properties:
      Family: 'FamilyName'
      ContainerDefinitions:
      - Name: ContainerName
        Image: 'imagename:net/v2/
        Environment:
        - Name: ENV_VARIABLE_1
          Value: !If [HasStack, 'present', 'notpresent']