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 文档中的相关页面:
当试图找出如何使用 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 文档中的相关页面: