CloudFormation 在启动 EC2 实例时抛出“参数 groupId 的值 () 无效。该值不能为空”

Tat*_*ead 9 aws-cloudformation amazon-vpc aws-security-group

我想为公共子网中的单个 Linux EC2 实例编写一个完整的 CloudFormation 模板。我使用AWS CloudFormation 模板创建了一个以安全组为起点的 EC2 实例。此模板在您的默认 VPC 中启动一个实例。

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

所以我使用了上面的模板并添加了所需的资源并使用Refs链接它们。一切都很好: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" ] } ] }
          }
      }
Run Code Online (Sandbox Code Playgroud)

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

Tat*_*ead 15

在搜索错误消息后,我遇到很多人抱怨错误消息含糊不清,但没有针对 CloudFormation 模板中的 EC2 资源进行特定修复。

有人提到,当您不将 EC2 启动到默认 VPC 时,您需要指定安全组 id 而不是安全组名称。

检查EC2 CloudFormation Resource type参考,有:

安全组

[EC2-Classic,默认 VPC] 安全组的名称。对于非默认 VPC,您必须改用安全组 ID。

在页面顶部,为 EC2 指定了安全组 ID,如下所示:

"SecurityGroupIds" : [ String, ... ],
Run Code Online (Sandbox Code Playgroud)

所以我将我的 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" ] } ] }
          }
      },
Run Code Online (Sandbox Code Playgroud)

它奏效了。