CloudFormation 在启动 EC2 实例时抛出“Value () for parameter groupId is invalid. The value cannot be empty”

Posted

技术标签:

【中文标题】CloudFormation 在启动 EC2 实例时抛出“Value () for parameter groupId is invalid. The value cannot be empty”【英文标题】:CloudFormation throws "Value () for parameter groupId is invalid. The value cannot be empty" when launching EC2 instance 【发布时间】:2019-11-02 16:35:59 【问题描述】:

我想为公共子网中的单个 Linux EC2 实例编写完整的 CloudFormation 模板。我使用AWS CloudFormation template for creating an EC2 Instance with a Security Group 作为我的起点。此模板会在您的默认 VPC 中启动一个实例。

我的目标是拥有一个独立的模板,该模板可以在新堆栈中创建所需的所有内容,但不会在默认 VPC 中创建。我想要一个新的 VPC、安全组、路由表、互联网网关、子网并启动一个新的 Linux EC2 实例。

所以我使用上面的模板并添加了所需的资源并使用Ref s 链接它们。一切都创建得很好: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" ]  ] 
          
      

错误信息不清楚该怎么做。

【问题讨论】:

【参考方案1】:

在搜索错误消息后,我发现很多人抱怨错误消息含糊不清,但没有针对 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" ]  ] 
          
      ,

它成功了。

【讨论】:

【参考方案2】:

当我在 EC2 实例资源声明中使用属性 SecurityGroups 时,尝试在默认 VPC 中创建 EC2 实例时遇到此错误。切换到SecurityGroupIds 为我解决了这个问题。

【讨论】:

是的,我使用 java SDK 1.11.1000 从 SecurityGroups 更改为 SecurityGroupIds 为我工作

以上是关于CloudFormation 在启动 EC2 实例时抛出“Value () for parameter groupId is invalid. The value cannot be empty”的主要内容,如果未能解决你的问题,请参考以下文章

EC2 终止时启动 CloudFormation 创建堆栈

无法使用 CloudFormation 模板通过 SSH 连接到 EC2 实例

CloudFormation 在启动 EC2 实例时抛出“Value () for parameter groupId is invalid. The value cannot be empty”

cfn-init 用于 cloudformation 启动模板

如何在更新参数时强制 CloudFormation 堆栈更新?

如何通过 CloudFormation 设置 EC2 实例根卷的标签