Terraform 抛出 "groupName cannot be used with the parameter subnet" 或 "VPC security groups may not be used for a non-VPC launch"

Terraform throws "groupName cannot be used with the parameter subnet" or "VPC security groups may not be used for a non-VPC launch"

当试图找出如何使用 AWS VPC 配置 aws_instance 时,出现以下错误:

* Error launching source instance: InvalidParameterCombination: The parameter groupName cannot be used with the parameter subnet
    status code: 400, request id: []

* Error launching source instance: InvalidParameterCombination: VPC security groups may not be used for a non-VPC launch
    status code: 400, request id: []

配置 AWS VPC 时,确保仅使用子网 ID 和组 ID。

示例:

resource "aws_instance" "forms_selenium_hub_dev" {
  ...
  subnet_id = "subnet-1a2b3c4d5e" # Subnet - Subnet ID 
  vpc_security_group_ids = ["sg-a1b2c3d4e5"] # Security Groups - Group ID
}

这是由于安全组与实例的关联方式所致。

如果没有子网,可以使用安全组的名称关联它:

resource "aws_instance" "server" {
  ...
  security_groups = [ "${aws_security_group.my_security_group.name}" ]
}

如果还关联了子网,则不能使用该名称,而应使用安全组的 ID:

security_groups = [ "${aws_security_group.my_security_group.id}" ]
subnet_id = "${aws_subnet.my_subnet.id}"

以上假设您已经创建了一个名为 my_security_group 的安全组和一个名为 my_subnet

的子网

我遇到了类似的问题。

Security Group 和 Subnets 之间存在关系,即都链接到一个 VPC。因此,如果您命令在 "subnet1" 中创建实例(例如 EC2 实例),您的实例将在子网 1 所在的 "vpc1" 中创建。当您未定义安全组时,它将使用VPC 中的 "default" 安全组。

当您定义子网时为什么不允许安全组是有道理的,因为如果您尝试分配与子网不在同一 vpc 中的安全组,它会很复杂。

但如果 AWS 允许至少在与子网相同的 VPC 中定义安全组,那就更好了。

tl;博士

When you specify a security group for a nondefault VPC to the CLI or the API actions, you must use the security group ID and not the security group name to identify the security group.

参见:Security Groups for EC2-VPC


换句话说,如果您尝试配置 VPC 启动,但错误提示是非 VPC 启动,请检查以下内容。

  • 如果您指定了subnet_id,那么您不能同时使用security_groups。对于非默认 VPC,您必须使用安全组 ID

  • 请指定右边的subnet_id,表示将实例启动到的子网(仅适用于VPC)。如果您未在请求中指定子网,将从您的默认 VPC 为您分配一个默认子网(仅限 EC2-VPC 账户)。

  • 确保您选择了正确的实例类型(例如 c4、m4、t2),请参阅:Instance Types Available Only in a VPC

另请参阅:run-instances 文档页面:

  • Some instance types can only be launched into a VPC. If you do not have a default VPC, or if you do not specify a subnet ID in the request, run-instances fails.

  • --security-groups - [EC2-Classic, default VPC] One or more security group names. For a nondefault VPC, you must use security group IDs instead.

AWS 文档中的相关页面: