7

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

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-########),但我会收到一条错误消息,指出安全组不存在(这是错误的,它确实存在)。其中,根据 API doc,如果使用非默认 VPC,您应该传递实际的 groupid,但我会收到如下错误:

InvalidGroup.NotFound, AWS Error Message: The security group 'sg-########' does not exist

如果我使用“默认”作为setSecurityGroups它将使用默认 VPC。尽管它是准确的,但它看起来不像我正在传递的 groupid。

此外,如果我注释掉setSecurityGroups代码,并setSubnetId改用并传递子网 ID,它将创建实例就好了,但它进入“默认”安全组,而不是像我想要的“testdefault”。

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

4

4 回答 4

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 中启动我的 EC2 实例,subnet-e881bd63并将 VPC 安全组 IDsg-fd53bf5e应用于其0网络接口。此外,它还会为我的实例分配一个公共 IP 地址。(默认情况下,当您在 VPC 中启动实例时,它不会分配公共 IP 地址)。
  3. 供参考。在 VPC 中启动实例时,您必须提供安全组 ID 而不是安全组名称。
于 2014-03-13T06:35:29.777 回答
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
于 2014-07-23T09:45:53.983 回答
1

您不能为 VPC 启动 ( setSecurityGroups) 指定安全组名称。对于非默认 VPC,您必须改用安全组 ID。请参阅 EC2运行实例页面(withSecurityGroupIds--security-group-ids来自 CLI)。

当您为 CLI 或 API 操作指定非默认 VPC 的安全组时,您必须使用安全组 ID 而不是安全组名称来标识安全组。

请参阅:EC2-VPC 的安全组

有关的:

于 2016-06-12T12:40:22.323 回答
0

感谢@slayedbylucifer提供的ruby代码,以下是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"));
于 2016-06-12T12:32:11.113 回答