【问题标题】:Launching Instance: VPC security groups may not be used for a non-VPC launch启动实例:VPC 安全组不能用于非 VPC 启动
【发布时间】:2014-04-17 09:51:45
【问题描述】:

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

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。尽管它是准确的,但它看起来不像我传递的 groupid。

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

我想要完成的只是创建一个实例并让它使用现有的 VPC 组。

【问题讨论】:

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


    【解决方案1】:

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

    我想要完成的只是创建一个实例并让它使用现有的 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 应用于其 0th 网络接口。此外,它还会为我的实例分配一个公共 IP 地址。 (默认情况下,当您在 VPC 中启动实例时,它不会分配公共 IP 地址)。
    3. 仅供参考。在 VPC 中启动实例时,您必须提供安全组 ID 而不是安全组名称。

    【讨论】:

    • 这让我找到了解决方案,感谢您抽出宝贵时间。我犯的错误是在您提供的代码中发现的。我需要使用“setSecurityGroupIds”来传递安全组 ID(例如“sg-1234567”)。 'setSecurityGroups' 是一种传统方法,只能在未指定子网 id 时使用,其值应为安全组名称列表(例如,'default')。使用 Java 解决方案更新了原始帖子。
    • @QuickNull,很高兴它帮助了你。
    【解决方案2】:

    使用命令行程序也会出现同样的错误,因此我添加了 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
    

    【讨论】:

      【解决方案3】:

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

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

      见:Security Groups for EC2-VPC

      相关:

      【讨论】:

        【解决方案4】:

        感谢@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-11-23
          • 2015-10-12
          • 2015-07-22
          • 1970-01-01
          • 2021-03-02
          • 1970-01-01
          • 2020-10-28
          • 2014-05-15
          • 2018-12-19
          相关资源
          最近更新 更多