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

Qui*_*ull 6 java amazon-ec2 amazon-web-services amazon-vpc

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

AWS Error Code: InvalidParameterCombination, AWS Error Message: VPC security groups may not be used for a non-VPC launch
Run Code Online (Sandbox Code Playgroud)

这是我正在执行的代码.

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);
Run Code Online (Sandbox Code Playgroud)

我也试过,而不是使用名称"testdefault",使用实际的groupid (sg-########),但我会得到一个错误,说安全组不存在(这是错误的,它确实).其中,基于API文档,如果使用非默认VPC,你应该通过实际GROUPID,但我会得到这样的错误:

InvalidGroup.NotFound, AWS Error Message: The security group 'sg-########' does not exist
Run Code Online (Sandbox Code Playgroud)

如果我使用"默认",setSecurityGroups它将使用默认的VPC.尽管它准确无误,但它似乎并不像我正在传递的那种.

此外,如果我注释掉setSecurityGroups代码,然后使用setSubnetId并传递子网ID,它将创建实例,但它会进入"默认"安全组,而不是像我想要的那样"testdefault".

我想要完成的只是创建一个实例并让它使用已经存在的VPC组.

sla*_*fer 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
Run Code Online (Sandbox Code Playgroud)

虽然这是一个Ruby代码,但它非常简单,并且应该为您提供一些明确的提示,Java因为所有这些AWS开发工具包都在轮询相同的Web服务API.

我想,你应该专注于上面代码的事情是:

  :region => 'us-west-2'
Run Code Online (Sandbox Code Playgroud)

placement: {
  availability_zone: 'us-west-2a'
},
network_interfaces: [
  {
    subnet_id: 'subnet-e881bd63',
    groups: ['sg-fd53bf5e'],
    device_index: 0,
    associate_public_ip_address: true
  }
],
Run Code Online (Sandbox Code Playgroud)
  1. 确保明确指定区域.
  2. 检查我如何定义子网ID和安全组ID.此代码将在subnet-e881bd63我的VPC中启动我的EC2实例,并将VPC安全组ID sg-fd53bf5e应用于其0网络接口.此外,它还将为我的实例分配一个公共IP地址.(默认情况下,在VPC中启动实例时,它不会分配公共IP地址).
  3. 仅供参考.在VPC中启动实例时,必须提供安全组ID而不是安全组名称.

  • 这引出了我的解决方案,谢谢你的时间.我所犯的错误是在你提供的代码中发现的.我需要使用'setSecurityGroupIds'来传递安全组ID(例如'sg-1234567').'setSecurityGroups'是一种遗留方法,只能在未指定子网ID时使用,并且其值应为安全组名称列表(例如'default').使用Java解决方案更新原始帖子. (3认同)