AWS CloudFormation安全组typeNameList约束错误排查请求
错误原因分析
从报错信息可以看到,typeNameList中包含了非法的资源类型AWS::EC2::SecurityGroup::Id,违反了CloudFormation资源类型的正则约束[A-Za-z0-9]{2,64}::[A-Za-z0-9]{2,64}::[A-Za-z0-9]{2,64}(::MODULE){0,1}。AWS::EC2::SecurityGroup::Id是参数类型,仅能用于Parameters块定义参数,不能作为Resources里的资源类型。
错误定位与修复步骤
1. 修正SSHSecurityGroup的资源类型
模板中SSHSecurityGroup错误使用参数类型作为资源Type,需改为合法的资源类型AWS::EC2::SecurityGroup:
原错误代码:
SSHSecurityGroup: Type: AWS::EC2::SecurityGroup::Id Properties: VpcId: !Ref VPC GroupDescription: Security group egress SecurityGroupEgress: - CidrIp: 127.0.0.1/32 IpProtocol: "-1"
修复后:
SSHSecurityGroup: Type: AWS::EC2::SecurityGroup Properties: VpcId: !Ref VPC GroupDescription: Security group egress SecurityGroupEgress: - CidrIp: 127.0.0.1/32 IpProtocol: "-1"
2. 移除重复的S3Bucket定义
模板中重复定义了两次S3Bucket资源,保留带BucketName配置的版本即可,删除无Properties的重复项:
# 删除该行 S3Bucket: Type: 'AWS::S3::Bucket'
3. 清理S3BucketPolicy的无效属性
S3BucketPolicy不支持SecurityGroupIds和KeyName属性,需删除这两个无效配置:
原错误代码:
S3BucketPolicy: Type: 'AWS::S3::BucketPolicy' Properties: Bucket: !Ref S3Bucket SecurityGroupIds: - !Ref EC2SecurityGroup KeyName: S3BucketPolicy PolicyDocument: ...
修复后:
S3BucketPolicy: Type: 'AWS::S3::BucketPolicy' Properties: Bucket: !Ref S3Bucket PolicyDocument: ...
4. 移除MyRDS的无效KeyName属性
AWS::RDS::DBInstance没有KeyName属性,删除该行冗余配置:
原错误代码:
MyRDS: Type: 'AWS::RDS::DBInstance' Properties: ... SecurityGroupIds: - !Ref EC2SecurityGroup KeyName: MyRDS
修复后:
MyRDS: Type: 'AWS::RDS::DBInstance' Properties: ... SecurityGroupIds: - !Ref EC2SecurityGroup
5. 移除EC2SecurityGroup的冗余DependsOn
EC2SecurityGroup的配置已关联VPC相关资源,CloudFormation会自动处理依赖关系,无需手动添加DependsOn: !Ref VPC:
原错误代码:
EC2SecurityGroup: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: EC2 Security Group DependsOn: !Ref VPC ...
修复后:
EC2SecurityGroup: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: EC2 Security Group ...
验证修复
完成上述修改后,重新提交CloudFormation模板即可解决typeNameList约束错误,同时修复了其他资源属性的无效配置问题。
内容的提问来源于stack exchange,提问作者Data Science Analytics Manager

