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

Java 启动实例:VPC安全组不能用于非VPC启动,java,amazon-web-services,amazon-ec2,amazon-vpc,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

我试图在另一个区域中创建实例,但出现以下错误:

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);
如果我使用“default”作为
设置安全组
它将使用默认VPC。它看起来不像我通过的groupid,尽管它是准确的

另外,如果我注释掉
setSecurityGroups
代码,使用
setSubnetId
并传递子网id,它将创建一个实例,但它会进入“default”安全组,而不是我想要的“testdefault”


我所要做的就是创建一个实例,并让它使用已经存在的VPC组。

我的答案将集中在以下陈述上:

我所要做的就是创建一个实例,让它使用已经存在的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 SDK都轮询相同的web服务api

我想,在上面的代码中,您应该关注的是:

  :region => 'us-west-2'

  • 请确保明确指定区域
  • 检查我如何定义子网ID和安全组ID。此代码将在我的VPC的
    子网-e881bd63
    中启动我的EC2实例,并将VPC安全组ID
    sg-fd53bf5e
    应用于其
    0
    th网络接口。此外,它还将为我的实例分配一个公共IP地址。(默认情况下,在VPC中启动实例时不会分配公共IP地址)
  • 仅供参考。在VPC中启动实例时,必须提供安全组ID而不是安全组名称

  • 使用命令行程序时也会出现同样的错误,因此我添加了一个由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
    
    感谢他的
    ruby
    code,以下是
    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"));
    

    无法为VPC启动指定安全组名称(
    setSecurityGroups
    )。对于非默认VPC,必须使用安全组ID。请参阅EC2页(
    带有安全组ID
    ,或CLI中的
    --安全组ID

    在CLI或API操作中为非默认VPC指定安全组时,必须使用安全组ID和安全组名称来标识安全组

    见:

    相关的:


    这让我找到了一个解决方案,感谢您抽出时间。我犯的错误是在你提供的代码中发现的。我需要使用“SetSecurityGroupID”来传递安全组ID(例如“sg-1234567”)setSecurityGroups'是一种传统方法,仅在未指定子网id时才能使用,其值应为安全组名称列表(例如“default”)。使用Java解决方案更新了原始帖子。@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
    
    // 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"));