使用CloudFormation创建EC2实例报错求解决方案及ap-south-1模板
问题分析与解决办法
嘿,我来帮你搞定这个CloudFormation模板的问题!
1. 核心错误原因:缺少Resources顶层节点
CloudFormation模板有严格的结构要求,必须包含顶层的Resources字段,所有要创建的云资源(比如你的EC2实例)都得嵌套在这个字段下面,用自定义的资源名称作为键。你直接写了EC2实例的配置,没有把它包裹在Resources里,这就是触发Template format error: At least one Resources member must be defined错误的根本原因。
另外你的模板还有两个小细节需要修正:
InstanceType的值后面多了个空格:"t2.micro "→ 要改成"t2.micro",不然可能会被识别为无效实例类型SecurityGroupIds和SecurityGroups不能同时指定:前者用于VPC环境,后者用于经典网络,二者互斥,选一个符合你环境的即可,避免冲突
2. 修正后的完整模板
这里是修复后的JSON模板,包含了正确的CloudFormation结构:
{ "AWSTemplateFormatVersion": "2010-09-09", "Resources": { "MyEC2Instance": { "Type": "AWS::EC2::Instance", "Properties": { "ImageId": "ami-08ddb3f251a88cf33", "InstanceType": "t2.micro", "KeyName": "Stagingkey", "LaunchTemplate": { "LaunchTemplateId": "jen1", "LaunchTemplateName": "Launchinstance", "Version": "V1" }, "SecurityGroupIds": [ "sg-055f49a32efd4238b" ] } } } }
几点说明:
- 新增了
AWSTemplateFormatVersion(必填的顶层字段,指定模板遵循的版本规范) - 把EC2实例配置嵌套在
Resources下,用MyEC2Instance作为资源的逻辑名称(你可以改成自己喜欢的名字) - 移除了冲突的
SecurityGroups字段,保留SecurityGroupIds(如果你的实例在经典网络,就换成SecurityGroups并删掉SecurityGroupIds) - 去掉了
InstanceType后面的多余空格
3. 适用于ap-south-1(孟买区域)的可用模板
下面是一个针对ap-south-1区域的完整示例模板,使用该区域的Amazon Linux 2 AMI(你可以替换成Ubuntu、Windows等其他系统的AMI):
{ "AWSTemplateFormatVersion": "2010-09-09", "Description": "EC2 Instance Provisioning Template for ap-south-1 Region", "Resources": { "MumbaiEC2Instance": { "Type": "AWS::EC2::Instance", "Properties": { "ImageId": "ami-02a0f373e66f89c85", // 2024年Amazon Linux 2的ap-south-1 AMI,建议确认最新版本 "InstanceType": "t2.micro", "KeyName": "Stagingkey", "SecurityGroupIds": [ "sg-055f49a32efd4238b" ], "Tags": [ { "Key": "Name", "Value": "Mumbai-Worker-Instance" } ] } } } }
小提示:
- AMI ID会定期更新,你可以通过AWS控制台的EC2实例启动页面,或者运行AWS CLI命令获取最新的Amazon Linux 2 AMI:
aws ec2 describe-images --owners amazon --filters "Name=name,Values=amzn2-ami-hvm-*-x86_64-gp2" --region ap-south-1 - 如果需要保留你原来的LaunchTemplate配置,直接把对应的字段加回
Properties里就可以了
内容的提问来源于stack exchange,提问作者dave Miller
相关产品推荐
相关产品推荐

