首页 > 解决方案 > AWS CloudFormation 函数调用失败:Fn::ImportValue 不得依赖于任何资源、导入的值或 Fn::GetAZs

问题描述

我有一个云形成模板 (mainVPC),它在 VPC 中创建几个子网并导出名称为“PrivateSubnetA”、“PrivateSubnetB”的子网......我有一个不同的云形成模板来创建 DBSubnetGroup。如果用户不提供数据,我想使用“PrivateSubnetA”、“PrivateSubnetB”作为默认值。CloundFormation 不支持在参数中导入值。所以我放了一些默认值(XXXX)并有一个条件部分来查看用户是否提供了一些输入

Conditions:
  userNotProvidedSubnetA: !Equals 
    - !Ref PrivateSubnetA
    - XXXX
  userNotProvidedSubnetB: !Equals 
    - !Ref PrivateSubnetB
    - XXXX

这有助于我确定用户是否提供了数据。现在我想使用默认值,如果用户没有提供值,否则使用用户提供的值。下面是代码

 DBSubnetGroup:
    Type: 'AWS::RDS::DBSubnetGroup'
    Properties:
      DBSubnetGroupDescription: RDS Aurora Cluster Subnet Group
      SubnetIds:
        - !If 
          - userNotProvidedSubnetA
          - Fn::ImportValue:
                !Sub  '${fmMainVpc}-PrivateSubnetA'
          - !Ref PrivateSubnetA
        - !If 
          - userNotProvidedSubnetB
          - Fn::ImportValue:
                !Sub '${fmMainVpc}-PrivateSubnetB'
          - !Ref PrivateSubnetB

这将失败并显示错误“模板错误:Fn::ImportValue 中的属性不得依赖于任何资源、导入的值或 Fn::GetAZs”。ImportValue 不在模板中的其他任何地方使用。

有没有办法将导出的值用作默认值(默认值不能硬编码,它们是从另一个堆栈的运行中导出的值),同时为用户提供一个选项来提供自己的值(以创建资源)。

谢谢。

标签: amazon-cloudformation

解决方案


这也可能是由于内部Fn::ImportValue对参数的引用命名错误。例如,如果我定义了以下参数并且我在语句(as )NetworkStackName中错误地引用了它,我会得到这个错误。我需要更改以匹配参数中的值,以修复错误。Fn::ImportValueNetworkNameNetworkNameNetworkStackName

Parameters:
  NetworkStackName:
      Type: String
      Default: happy-network-topology
Resources:
  MySQLDatabase:
    Type: AWS::RDS::DBInstance
    Properties:
      Engine: MySQL
      DBSubnetGroupName:
        Fn::ImportValue:
          !Sub "${NetworkName}-DBSubnetGroup"

推荐阅读