CloudFormation创建双网卡EC2并绑定EIP时生成额外网卡问题求解
问题根因
你当前模板出现额外网卡的核心原因是:在AWS::EC2::Instance资源的根属性中指定SubnetId、PrivateIpAddress、SecurityGroupIds参数时,AWS会自动为实例创建一块默认主网卡(设备索引0),加上你后续单独定义挂载的网卡,最终超过实例规格配额。同时你要获取主网卡ID时,调用!GetAtt InstanceName.PrimaryPrivateIpAddress只能拿到私网IP,拿不到网卡ID,自然会报错触发回滚。
调整方案
直接显式定义两块网卡,完全避免AWS自动创建默认网卡,既能精准匹配你的配置需求,也可以直接通过资源引用获取任意网卡的ID,具体修改如下:
- 删除原来
AWS::EC2::Instance资源根属性下的SubnetId、PrivateIpAddress、SecurityGroupIds参数 - 预先定义两块独立的网卡资源,分别对应私有子网、公网子网的配置要求
- 在EC2实例的
NetworkInterfaces属性中直接挂载预定义的两块网卡 - EIP直接绑定公网网卡的资源ID,避免绑错
- 删除原来单独的
WANInterfaceAttachment资源,网卡挂载已经在实例属性中完成
注意:EC2实例挂载的多网卡必须属于同一可用区,你当前两个子网都配置在eu-south-1c,符合要求无需调整
修改后的核心资源代码片段
############### VPN EC2 相关资源 ############### # 主网卡(索引0):对应私有子网PrivateVPNSubnet,IP 10.0.3.10 PFSenseLANInterface: Type: AWS::EC2::NetworkInterface Properties: GroupSet: - !Ref PFSenseSecurityGroup PrivateIpAddress: 10.0.3.10 SourceDestCheck: false SubnetId: !Ref PrivateVPNSubnet Tags: - Key: Name Value: PFSense-LAN-Interface # 第二块网卡(索引1):对应公网子网PublicVPNSubnet,IP 10.0.30.10 PFSenseWANInterface: Type: AWS::EC2::NetworkInterface Properties: GroupSet: - !Ref PFSenseSecurityGroup PrivateIpAddress: 10.0.30.10 SourceDestCheck: false SubnetId: !Ref PublicVPNSubnet Tags: - Key: Name Value: PFSense-WAN-Interface # 调整后的EC2实例定义 PFSense: Type: AWS::EC2::Instance Properties: KeyName: PFSenseOK ImageId: ami-0b6e3e1bfb36528fd InstanceType: t3.micro SourceDestCheck: false # 直接挂载预定义的两块网卡 NetworkInterfaces: - DeviceIndex: 0 NetworkInterfaceId: !Ref PFSenseLANInterface - DeviceIndex: 1 NetworkInterfaceId: !Ref PFSenseWANInterface # EIP绑定公网网卡,不要绑定实例ID IPAssoc: Type: AWS::EC2::EIPAssociation Properties: NetworkInterfaceId: !Ref PFSenseWANInterface EIP: XX:XX:XX:XX
如果你需要获取主网卡的ID,直接用!Ref PFSenseLANInterface即可,无需调用实例属性,不会再出现报错。
内容的提问来源于stack exchange,提问作者Jeremie
相关产品推荐
相关产品推荐

