【问题标题】:Using importValue inside If Condition in aws cloudformation templates在 aws cloudformation 模板中的 If Condition 中使用 importValue
【发布时间】:2019-07-09 02:22:06
【问题描述】:

我正在尝试找到一种在 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'

【问题讨论】:

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


    【解决方案1】:

    我不相信这是可能的。您不能在 Equals 函数中使用 ImportValue

    【讨论】:

    • 我不确定 Equals 函数,但我绝对不能在“条件”部分使用它。目前唯一的解决方法是 lambda。
    • 4 年后依然如此。感谢 AWS!
    • 我的解决方案正在运行,看起来不错,恕我直言
    【解决方案2】:

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

    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
    

    【讨论】:

      【解决方案3】:

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

      • 向子模板添加参数
      • 在父模板中,使用导入来填充参数
      • 在子模板中,您可以做任何您想做的事情,包括在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']
      

      【讨论】:

        【解决方案4】:

        使用内在函数的组合我得到了结果:

        parameter1: !If
            - condition1
            - !ImportValue 
              Fn::Sub: "${name}-dev-parameter"
            - AWS::NoValue
        

        确保使用我列出的内在函数序列。这似乎是唯一的方法。

        【讨论】:

          猜你喜欢
          • 2018-05-09
          • 1970-01-01
          • 2020-08-06
          • 2021-04-19
          • 1970-01-01
          • 2021-08-10
          • 1970-01-01
          • 1970-01-01
          • 2019-03-21
          相关资源
          最近更新 更多