amazon-cloudformation - 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 不在模板中的其他任何地方使用。
有没有办法将导出的值用作默认值(默认值不能硬编码,它们是从另一个堆栈的运行中导出的值),同时为用户提供一个选项来提供自己的值(以创建资源)。
谢谢。
解决方案
这也可能是由于内部Fn::ImportValue
对参数的引用命名错误。例如,如果我定义了以下参数并且我在语句(as )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"
推荐阅读
- html - 如何将垂直滚动条添加到第一列始终固定的表中
- spring-boot - UserDetailsService 被安全配置忽略
- java - 如何将数组中的数据写入文本文件?
- flutter - 使用 Firebase 登录 Twitter - Flutter
- java - Hbase mapreduce 作业:所有列值为空
- c# - “Startup.Configuration”和“Startup.Configuration”之间的歧义
- google-dfp - 如何在 Google AdManager/DFP 中设置展示级别的键值?
- android - SwipeRefreshLayout 的 onRefreshListener 不适用于数据绑定 mvvm android
- swift - 菜单 indexpath 快速保存 UserDefaults
- xcode - Xcode 在通过 PID 或名称附加到进程后不打印任何调试日志