我想为公共子网中的单个Linux EC2实例编写完整的CloudFormation模板。我以AWS CloudFormation template for creating an EC2 Instance with a Security Group为起点。此模板将实例启动到默认VPC中。
我的目标是拥有一个自包含的模板,该模板可以在新堆栈中创建所需的所有内容,而不是在默认VPC中创建所有内容。我想要一个新的VPC,安全组,路由表,Internet网关,子网并启动一个新的Linux EC2实例。
因此,我使用了上面的模板,并添加了所需的资源,并使用Ref
链接了它们。一切正常:VPC,子网,安全组,Internet GW,RouteTables等。但是我的EC2会出错,并且堆栈会回滚。
状态原因是:
Value () for parameter groupId is invalid. The value cannot be empty (Service: AmazonEC2; Status Code: 400; Error Code: InvalidParameterValue; Request ID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx)
CloudFormation模板中的EC2资源如下:
"EC2Instance" : {
"Type" : "AWS::EC2::Instance",
"Properties" : {
"InstanceType" : { "Ref" : "InstanceType" },
"SecurityGroups" : [ { "Ref" : "InstanceSecurityGroup" } ],
"KeyName" : { "Ref" : "KeyName" },
"ImageId" : { "Fn::FindInMap" : [ "AWSRegionArch2AMI", { "Ref" : "AWS::Region" },
{ "Fn::FindInMap" : [ "AWSInstanceType2Arch", { "Ref" : "InstanceType" }, "Arch" ] } ] }
}
}
该错误消息不清楚该怎么办。
答案 0 :(得分:0)
搜索错误消息后,我遇到许多人抱怨这个模糊的错误消息,但是在CloudFormation模板中没有针对EC2资源的特定修复程序。
有人提到,当您不将EC2启动到默认VPC时,需要指定安全组ID而不是安全组名称。
检查reference for the EC2 CloudFormation Resource type,是这样的:
安全组
[EC2-Classic,默认VPC]安全组的名称。对于非默认VPC,必须使用安全组ID。
在页面顶部,为EC2指定安全组ID,如下所示:
"SecurityGroupIds" : [ String, ... ],
因此我将EC2资源更改为以下内容:
"EC2Instance" : {
"Type" : "AWS::EC2::Instance",
"Properties" : {
"InstanceType" : { "Ref" : "InstanceType" },
"SecurityGroupIds" : [
{ "Fn::GetAtt" : [ "InstanceSecurityGroup", "GroupId" ] }
],
"SubnetId" : {"Ref":"TestSubnet"},
"KeyName" : { "Ref" : "KeyName" },
"ImageId" : { "Fn::FindInMap" : [ "AWSRegionArch2AMI", { "Ref" : "AWS::Region" },
{ "Fn::FindInMap" : [ "AWSInstanceType2Arch", { "Ref" : "InstanceType" }, "Arch" ] } ] }
}
},
它奏效了。
答案 1 :(得分:0)
当我在 EC2 实例资源声明中使用属性 SecurityGroups
时,尝试在默认 VPC 内创建 EC2 实例时遇到此错误。切换到 SecurityGroupIds
为我解决了这个问题。