Amazon cloudformation AWS CloudFormation函数调用失败:Fn::ImportValue不能依赖于任何资源、导入的值或Fn::GetAZs

Amazon cloudformation AWS CloudFormation函数调用失败:Fn::ImportValue不能依赖于任何资源、导入的值或Fn::GetAZs,amazon-cloudformation,Amazon Cloudformation,我有一个云形成模板(mainVPC),它在VPC中创建几个子网,并导出名为“PrivateSubnetA”、“PrivateSubnetB”的子网。。。 我有一个创建DBSubnetGroup的不同云形成模板。如果用户不提供数据,我想使用“PrivateSubnetA”、“PrivateSubnetB”作为默认值。CloundFormation不支持在参数中导入值。因此,我输入了一些默认值(XXXX),并有一个条件部分来查看用户是否提供了一些输入 Conditions: userNotPro

我有一个云形成模板(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不在模板中的任何其他位置使用

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


谢谢。

目前,Cloudformation不支持动态默认值。不可能为CloudFormation设置动态默认值。由于模板在收集所有参数时未执行。但是,您可以使用的SSM参数作为解决方法,如下所示

Parameters
    PagerDutyUrl:
        Type: AWS::SSM::Parameter::Value<String>
        Description: The Pagerduty url
参数
PagerDutyUrl:
类型:AWS::SSM::参数::值
Description:Pagerduty url

回到您当前的cloudformation,我认为值${fmMainVpc}可能没有正确初始化。

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

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

我遇到了一个问题,我需要从我的先决条件堆栈中获取我的工件桶名称,我尝试了以下方法:

Fn::ImportValue:
    - 'arn:aws:s3:::${ArtifactStore}/*'
事实证明,你可以做到这一点,它将工作。希望有一天他能帮助别人

    - !Sub

        - 'arn:aws:s3:::${BucketName}/*'

        - BucketName : !ImportValue 'ArtifactStore'

谢谢你的更新。我没有得到“value${fmMainVpc}可能未正确初始化”,请详细说明,这可以帮助我解决问题。我创建了一个简单的测试。
AWSTemplateFormatVersion:2010-09-09参数:stagefrmsm:Type:'AWS::SSM::Parameter::Value'Default:PParamName001资源:StageName:Type:AWS::SSM::参数属性:描述:字段管理器数据库名称-开发人员名称:PParamName002类型:字符串默认值:!Ref StageFrmSSM
测试通过了验证,但由于消息属性验证失败而失败:[在{/}:[默认]]中遇到了不受支持的属性]未正确初始化-我遇到了类似的问题,结果证明我的参数名称中的小写和大写字符不匹配!