AWS CloudFormation中!GetAtt获取NetworkAclAssociationId报错求助
解决CloudFormation修改默认NACL规则的GetAtt报错问题
问题原因
你遇到的报错根源在于:
NetworkAclAssociationId并非AWS::EC2::Subnet资源的有效输出属性,无法通过!GetAtt CSETrainingSubnet.NetworkAclAssociationId获取;- VPC资源没有
DefaultNetworkAcl这个可通过!GetAtt调用的属性——默认NACL是VPC自动生成的隐式资源,不能直接通过VPC的属性引用。
解决方案
要修改VPC的默认NACL规则,需先在模板中引用默认NACL,再通过AWS::EC2::NetworkAclEntry资源添加/调整规则,具体实现如下:
- 引用默认NACL
通过AWS::EC2::NetworkAcl资源,指定目标VPC的ID并设置IsDefault: true,CloudFormation会自动匹配该VPC下的默认NACL,而非创建新的NACL:
Resources: # 已定义的VPC和子网资源 CSETrainingVPC: Type: AWS::EC2::VPC Properties: CidrBlock: 10.0.0.0/16 Tags: - Key: Name Value: CSETrainingVPC CSETrainingSubnet: Type: AWS::EC2::Subnet Properties: VpcId: !Ref CSETrainingVPC CidrBlock: 10.0.1.0/24 Tags: - Key: Name Value: CSETrainingSubnet # 引用VPC的默认NACL DefaultVpcNetworkAcl: Type: AWS::EC2::NetworkAcl Properties: VpcId: !Ref CSETrainingVPC IsDefault: true
- 添加/修改入站规则
创建AWS::EC2::NetworkAclEntry资源,关联上述引用的默认NACL,配置入站规则:
DefaultNaclInboundRule: Type: AWS::EC2::NetworkAclEntry Properties: NetworkAclId: !Ref DefaultVpcNetworkAcl RuleNumber: 100 # 规则优先级,数值越小优先级越高 Protocol: -1 # 代表匹配所有协议 RuleAction: allow Egress: false # false标识为入站规则 CidrBlock: 0.0.0.0/0 # 可根据实际需求调整CIDR范围
- 添加/修改出站规则
同理创建出站规则:
DefaultNaclOutboundRule: Type: AWS::EC2::NetworkAclEntry Properties: NetworkAclId: !Ref DefaultVpcNetworkAcl RuleNumber: 100 Protocol: -1 RuleAction: allow Egress: true # true标识为出站规则 CidrBlock: 0.0.0.0/0
注意事项
- 默认NACL初始规则为拒绝所有入站/出站流量,添加允许规则时需确保规则编号(RuleNumber)小于默认拒绝规则的编号(默认是32767),否则允许规则不会生效;
- 子网默认自动关联VPC的默认NACL,无需手动创建
AWS::EC2::NetworkAclAssociation资源,除非你需要将子网切换到自定义NACL。
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

