我有一个模板,用于创建 ELB 并附加 VPC 内的现有子网。这创建得很好,但是当我更新堆栈并添加一个具有 VpcId 属性的安全组(其值等于我附加的子网所属的现有 VPC ID)时,堆栈失败并出现以下错误:
“您指定了属于不同网络的两个资源”
如果我从安全组中删除 VpcId 属性,它会在我的默认 VPC 中创建该属性,并且堆栈创建工作正常。我无法理解为什么会出现这种情况,因为安全组与指定入口规则中的 ELB 存在关系 -
"IpProtocol": "tcp",
"FromPort": "8000",
"ToPort": "8010",
"SourceSecurityGroupOwnerId": {
"Fn::GetAtt": [
"ElasticLoadBalancer",
"SourceSecurityGroup.OwnerAlias"
]
},
我无法明确说明 ELB 上的 VPC ID,因为它没有此类属性,只有子网或可用区。
谢谢你们的帮助。我发现了问题并解决了问题。
问题是我试图在安全组定义内的安全组入口定义中引用一个安全组。正如文档所说:
如果您想要在这些安全组的入口和出口规则中交叉引用两个安全组,请使用 AWS::EC2::SecurityGroupEgress 和 AWS::EC2::SecurityGroupIngress 资源来定义您的规则。不要使用 AWS::EC2::SecurityGroup 中嵌入的入口和出口规则。如果这样做,则会导致循环依赖,这是 AWS CloudFormation 不允许的。
因此,我指定了两个安全组,然后在单独的资源中指定了 SecurityGroupIngress。必须手动将其输入到模板中,因为左侧菜单中没有该资源的 CloudFormation 图标。我花了一段时间才弄清楚,因为我创建堆栈时生成的错误消息并不明显。
"InstanceIngress": {
"Type": "AWS::EC2::SecurityGroupIngress",
"Properties": {
"GroupId": {
"Fn::GetAtt": [
"InstanceSecurityGroup",
"GroupId"
]
},
"IpProtocol": "tcp",
"FromPort": "7997",
"ToPort": "8100",
"SourceSecurityGroupId": {
"Fn::GetAtt": [
"ELBSecurityGroup",
"GroupId"
]
}
},
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)