CloudFormation创建EC2实例报未解析子网资源依赖错误
报错根因
Unresolved resource dependencies报错的触发逻辑是CloudFormation解析模板时,在Ref/!Ref函数的引用目标里,找不到当前模板内定义的对应逻辑资源或参数。
你模板里的错误写法:
SubnetId: Ref: "subnet-057ba3df40f87da4e"
Ref函数仅支持引用当前模板内Resources块定义的逻辑资源、Parameters块定义的参数,你传入的是AWS侧已经存在的实体子网ID,不是模板内定义的逻辑ID,CloudFormation会尝试在模板里找叫subnet-057ba3df40f87da4e的逻辑资源,找不到就抛出该错误。你之前写VpcId: "vpc-09495a820716bff3b"是直接传字符串值,没有套Ref,所以不会触发这个报错。
另外你的模板还有一处隐性配置冲突:你已经在NetworkInterfaces块里通过GroupSet绑定了安全组,外层的SecurityGroupIds字段必须删除——自定义网络接口时,安全组配置只能声明在网络接口属性内,同时写两处会触发新的部署校验错误。
修复方法
二选一即可:
- 快速修复(硬编码现有资源ID):直接给SubnetId传字符串值,去掉
Ref包裹,同时删除冗余的SecurityGroupIds配置,修改后的EC2资源段如下:
EC2Instance: Type: AWS::EC2::Instance Properties: ImageId: "ami-0022f774911c1d690" InstanceType: t3.micro NetworkInterfaces: - AssociatePublicIpAddress: "true" DeviceIndex: "0" GroupSet: - Ref: "accessSecurityGroup" SubnetId: "subnet-057ba3df40f87da4e" UserData: Fn::Base64: !Sub | #!/bin/bash sudo yum update -y sudo yum install -y httpd sudo systemctl start httpd sudo systemctl enable httpd
- 规范写法(参数化可变配置,推荐):在模板顶部新增Parameters块,把VPC、子网、AMI这类随环境变化的资源ID定义为参数,通过
Ref引用参数值,既符合CloudFormation最佳实践,也不会出现引用错误。完整修正模板如下:
Parameters: DeployVpcId: Type: AWS::EC2::VPC::Id Description: 部署资源所属的VPC ID DeploySubnetId: Type: AWS::EC2::Subnet::Id Description: 启动EC2实例所属的子网ID EC2AmiId: Type: AWS::EC2::Image::Id Description: EC2实例使用的AMI ID Default: "ami-0022f774911c1d690" Resources: accessSecurityGroup: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: "new EC2 security group for HTTP and SHH ports" SecurityGroupIngress: - IpProtocol: tcp FromPort: 80 ToPort: 80 CidrIp: 0.0.0.0/0 SecurityGroupEgress: - IpProtocol: -1 FromPort: -1 ToPort: -1 CidrIp: 0.0.0.0/0 VpcId: !Ref DeployVpcId EC2Instance: Type: AWS::EC2::Instance Properties: ImageId: !Ref EC2AmiId InstanceType: t3.micro NetworkInterfaces: - AssociatePublicIpAddress: "true" DeviceIndex: "0" GroupSet: - !Ref accessSecurityGroup SubnetId: !Ref DeploySubnetId UserData: Fn::Base64: !Sub | #!/bin/bash sudo yum update -y sudo yum install -y httpd sudo systemctl start httpd sudo systemctl enable httpd
使用参数化模板执行部署时,可以在CLI命令中追加--parameters参数传入VPC、子网的实际ID,也可以直接把参数默认值改成你当前环境的资源ID。
内容的提问来源于stack exchange,提问作者Mohammed Salah
相关产品推荐
相关产品推荐

