我正在尝试在另一个区域创建一个实例,但是我收到了这个错误:
AWS Error Code: InvalidParameterCombination, AWS Error Message: VPC security groups may not be used for a non-VPC launch
这是我正在执行的代码。
RunInstancesRequest instancereq = new RunInstancesRequest();
instancereq.setInstanceType("m3.medium");
instancereq.setImageId("ami-37b1b45e");
instancereq.setMinCount(1);
instancereq.setMaxCount(1);
ArrayList<String> secgroup = new ArrayList<String>();
instancereq.setKeyName("testkey");
secgroup.add("testdefault");
instancereq.setSecurityGroups(secgroup);
instancereq.setPlacement(getAzPlacement());
RunInstancesResult instanceresult = ec2.runInstances(instancereq);
我也试过,而不是使用名称“testdefault”,使用实际的groupid (sg-########)
,但我会收到一个错误,说安全组不存在(这是错误的,它确实)。哪个,based on the API doc,如果使用非默认的VPC,你应该传递实际的groupid,但我会得到这样的错误:
InvalidGroup.NotFound, AWS Error Message: The security group 'sg-########' does not exist
如果我使用“默认”作为setSecurityGroups
,它将使用默认的VPC。尽管它是准确的,但它似乎并不像我正在传递的那个群体。
另外,如果我注释掉setSecurityGroups
代码,并使用setSubnetId
代替并传递子网ID,它将创建实例,但它会进入“默认”安全组,不像我想的那样“测试失败”。
我想要完成的只是创建一个实例并让它使用已经存在的VPC组。
答案 0 :(得分:13)
我的回答将集中于以下声明:
我试图完成的只是创建一个实例并让它使用已经存在的VPC组。
因此,据我所知,您希望在非默认VPC中启动实例,并为其分配现有的VPC安全组。
我不是java
人,但我可以在ruby
中执行您想要的操作,如下所示。
require 'aws-sdk-core'
Aws.config = {
:access_key_id => "my_access_key",
:secret_access_key => "my_secret_key",
:region => 'us-west-2'
}
ec2 = Aws::EC2.new
ec2.run_instances(
min_count: 1,
max_count: 1,
image_id: 'ami-8635a9b6',
instance_type: 't1.micro',
placement: {
availability_zone: 'us-west-2a'
},
network_interfaces: [
{
subnet_id: 'subnet-e881bd63',
groups: ['sg-fd53bf5e'],
device_index: 0,
associate_public_ip_address: true
}
],
key_name: 'my-key'
).each do |resp|
resp.instances.each do |x|
puts x.instance_id
end
end
虽然这是一个Ruby
代码,但它非常简单,并且应该在Java
中为您提供一些明确的提示,因为所有这些AWS开发工具包都在轮询相同的Web服务的API。
我想,你应该专注于上面代码的事情是:
:region => 'us-west-2'
和
placement: {
availability_zone: 'us-west-2a'
},
network_interfaces: [
{
subnet_id: 'subnet-e881bd63',
groups: ['sg-fd53bf5e'],
device_index: 0,
associate_public_ip_address: true
}
],
subnet-e881bd63
中启动我的EC2实例,并将VPC安全组ID sg-fd53bf5e
应用于其0
网络接口。此外,它还将为我的实例分配一个公共IP地址。 (默认情况下,在VPC中启动实例时,它不会分配公共IP地址。)答案 1 :(得分:3)
使用命令行程序发生同样的错误,因此我在QuickNull的帮助下添加了一个单独的答案。只需确保指定安全组和子网。例如:
aws ec2 run-instances --image-id ami-XXXXXXXX --count 1 --instance-type t1.micro --key-name XXXXXXXX --security-group-ids sg-XXXXXXXX --subnet-id subnet-XXXXXXXX
答案 2 :(得分:1)
您无法为VPC启动指定安全组名称(setSecurityGroups
)。对于非默认VPC,必须使用安全组ID 。请参阅EC2 run-instances页面(withSecurityGroupIds
或CLI中的--security-group-ids
)。
为CLI或API操作指定非默认VPC的安全组时,必须使用安全组ID和不安全组名称来标识安全组。
请参阅:Security Groups for EC2-VPC
相关:
答案 3 :(得分:0)
感谢他ruby
代码的@slayedbylucifer,这里提供了java
解决方案供参考:
// Creates an instance in the specified subnet of a non-default VPC and using the
// security group with id sg-1234567
ec2.runInstances(new RuntInstancesRequest()
...
.withSubnetId("subnet-1234abcd")
.withSecurityGroupIds("sg-1234567"));