Amazon cloudformation AWS CloudFormation函数调用失败:Fn::ImportValue不能依赖于任何资源、导入的值或Fn::GetAZs
我有一个云形成模板(mainVPC),它在VPC中创建几个子网,并导出名为“PrivateSubnetA”、“PrivateSubnetB”的子网。。。 我有一个创建DBSubnetGroup的不同云形成模板。如果用户不提供数据,我想使用“PrivateSubnetA”、“PrivateSubnetB”作为默认值。CloundFormation不支持在参数中导入值。因此,我输入了一些默认值(XXXX),并有一个条件部分来查看用户是否提供了一些输入Amazon cloudformation AWS CloudFormation函数调用失败:Fn::ImportValue不能依赖于任何资源、导入的值或Fn::GetAZs,amazon-cloudformation,Amazon Cloudformation,我有一个云形成模板(mainVPC),它在VPC中创建几个子网,并导出名为“PrivateSubnetA”、“PrivateSubnetB”的子网。。。 我有一个创建DBSubnetGroup的不同云形成模板。如果用户不提供数据,我想使用“PrivateSubnetA”、“PrivateSubnetB”作为默认值。CloundFormation不支持在参数中导入值。因此,我输入了一些默认值(XXXX),并有一个条件部分来查看用户是否提供了一些输入 Conditions: userNotPro
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
测试通过了验证,但由于消息属性验证失败而失败:[在{/}:[默认]]中遇到了不受支持的属性]未正确初始化-我遇到了类似的问题,结果证明我的参数名称中的小写和大写字符不匹配!