启动实例:VPC安全组不能用于非VPC启动

时间:2014-03-12 22:44:18

标签: java amazon-web-services amazon-ec2 amazon-vpc

我正在尝试在另一个区域创建一个实例,但是我收到了这个错误:

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组。

4 个答案:

答案 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
  }
],
  1. 确保明确指定区域。
  2. 检查我如何定义子网ID和安全组ID。此代码将在我的VPC的subnet-e881bd63中启动我的EC2实例,并将VPC安全组ID sg-fd53bf5e应用于其0网络接口。此外,它还将为我的实例分配一个公共IP地址。 (默认情况下,在VPC中启动实例时,它不会分配公共IP地址。)
  3. FYI。在VPC中启动实例时,必须提供安全组ID而不是安全组名称。

答案 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"));