2014-03-12 48 views
6

我試圖在另一個區域創建一個實例,但我得到這個錯誤:啓動實例:VPC安全組可能不被用於非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但我會得到這樣的錯誤:如果我使用「默認」爲setSecurityGroups它會使用默認的VPC

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

。它看起來不像我通過的groupid,儘管它是準確的。另外,如果我註釋掉setSecurityGroups代碼,並使用setSubnetId代替並傳遞子網ID,它會創建實例,但它會進入「默認」安全組,而不是「testdefault」,就像我想要的那樣。

我所要做的就是創建一個實例並讓它使用已經存在的VPC組。

回答

11

我的回答將側重於以下語句:

All I'm trying to accomplish is creating an instance and having it use the already existing VPC group.

所以,據我瞭解,你要在非默認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' 

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. 僅供參考。在VPC中啓動實例時,您必須提供安全組ID而不是安全組名稱。
+3

這導致我的解決方案,感謝您的時間。我所做的錯誤是在您提供的代碼中發現的。我需要使用'setSecurityGroupIds'來傳遞安全組ID(例如'sg-1234567')。 'setSecurityGroups'是一種傳統方法,只有在沒有指定子網ID時才能使用,並且其值應該是安全組名稱列表(例如「默認」)。用Java解決方案更新原始帖子。 – QuickNull

+0

@QuickNull,很高興它幫助你。 – slayedbylucifer

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 
0

感謝@slayedbyluciferruby代碼,這裏是供參考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")); 
1

您不能指定VPC推出安全組的名稱(setSecurityGroups)。對於非默認VPC,您必須改用安全組ID。參見EC2 run-instances頁(來自CLI的withSecurityGroupIds--security-group-ids)。

When you specify a security group for a nondefault VPC to the CLI or the API actions, you must use the security group ID and not the security group name to identify the security group.

參見:Security Groups for EC2-VPC

相關: