amazon-web-services - 选择具有工作区的 AZ
问题描述
我们有部署到 3 个区域的 CloudFromation 模板,我们使用 !GetAZs 内部函数,如下所示:
PrivateSubnet2:
Type: AWS::EC2::Subnet
Properties:
CidrBlock: !Ref 'PrivateSubnetCIDR2'
AvailabilityZone: !Select
- '1'
- !GetAZs ''
Tags:
- Key: Name
Value: Private-Subnet-2
VpcId: !Ref 'VPC'
我们设置了 2 个子网,首先将索引设置为 0,第二个将其设置为 1。我们这样做是因为工作区在特定的可用区域中可用。到目前为止,我们正在部署的 3 个区域在索引 0 和 1 的可用区中都有可用的工作区。
但现在我们要添加另一个可用区,其工作区在 1 和 2 索引处可用。
我有一个 PoC,可以!Equals
在该特定区域的条件下使用,但随后它将为该可用区设置一个额外的子网、路由表等整个网络设置。这并不理想。BTW 我的!Equals
情况如下:
WorkspaceSubnet: !Equals
- !Ref 'AWS::Region'
- 'us-east-1'
我想要的是可以在!Equals
条件为真/假的基础上设置索引的东西,如下所示:
PrivateSubnet1:
Type: AWS::EC2::Subnet
Properties:
CidrBlock: !Ref 'PrivateSubnetCIDR1'
AvailabilityZone: !if
- WorkspaceSubnet
- !Select
- '2'
- !GetAZs ''
- !Select
- '0'
- !GetAZs ''
Tags:
- Key: Name
Value: Private-Subnet-1
VpcId: !Ref 'VPC'
但这给了我错误:[cfn-lint] E3002: Property Resources/PrivateSubnet1/Properties/AvailabilityZone has an illegal function Fn::if
解决方案
有时我们会犯一些肉眼无法发现的愚蠢错误,当您将其发布到 StackOverflow 上时,您的一些同行会开始审查,而有些人会非常关心以深入挖掘。
感谢我的学员Mehdi Azhar指出这只是一个小写问题。内在功能!if
以大写字母开头!If
。
所以正确的代码应该是:
PrivateSubnet1:
Type: AWS::EC2::Subnet
Properties:
CidrBlock: !Ref 'PrivateSubnetCIDR1'
AvailabilityZone: !If
- WorkspaceSubnet
- !Select
- '2'
- !GetAZs ''
- !Select
- '0'
- !GetAZs ''
Tags:
- Key: Name
Value: Private-Subnet-1
VpcId: !Ref 'VPC'
推荐阅读
- openshift - OpenShift CronJob 可以从 ImageStream 中受益吗?
- c# - 使用 Newtonsoft 反序列化只有 getter 的抽象类
- c++ - 为什么 c++ 模板在被多个源文件包含时不会生成重复的符号?
- reactjs - 在组件中映射道具时如何为道具的孩子编写排除项?
- java - 如何使用 FileDialog 读取文件的数据?
- r - 如何对R函数中的变量进行操作
- reactjs - 渲染函数的结果
- .net - nsubstitute 模拟对任何 XMLNode 值的方法的调用
- excel - Excel 2013 VBA - 用与某个键相关的另一个工作表中的数据填充一系列单元格
- visual-studio-code - 在 VSCode (NodeJs) 中调试时未跳过外部文件