2014-02-28 37 views
3

我试图创建一个EC2实例,我碰到这个问题后,我创建这样的实例:实例ID不存在

SOURCE_REGION = Region.getRegion(Regions.US_WEST_2); 
ec2.setRegion(SOURCE_REGION); 
ec2.setEndpoint("ec2.us-west-1.amazonaws.com"); 

RunInstancesRequest instancereq = new RunInstancesRequest(); 
instancereq.setInstanceType(instancearray.get(i).getInstanceType()); 
instancereq.setImageId(defaultAmi); 
instancereq.setMinCount(1); 
instancereq.setMaxCount(1); 

ArrayList<String> groupid = new ArrayList<String>(); 
groupid.add(secgroup.get(0).getGroupName());   

instancereq.setSecurityGroupIds(groupid); 
instancereq.setKeyName("testkey"); 

Placement place = new Placement(); 
place.setAvailabilityZone((String) target.getValueAt(row, column)); 

instancereq.setPlacement("ec2.us-west-1.amazonaws.com"); 

RunInstancesResult instanceresult = ec2.runInstances(instancereq); 

此代码不正是我想要的,创建实例在正确的区域和AZ。我能够捕获新实例ID instanceresult的名称。不过,后来我在同样的方法执行下一条线(这些标签变量包含字符串,不包括)我得到一个错误:

CreateTagsRequest createTagsRequest = new CreateTagsRequest(); 
createTagsRequest.withResources(newinstance.getInstanceId()) 
       .withTags(new Tag("Name", tagName)).withTags(new Tag("Application", tagApplication)) 
       .withTags(new Tag("Env", tagEnv)).withTags(new Tag("Function", tagFunction)); 

ec2.createTags(createTagsRequest); 

我得到的错误是这样的:

Error Code: InvalidInstanceID.NotFound, AWS Error Message: The instance ID 'i-xxxxxxxx' does not exist 

现在,我知道它存在的事实,不仅instanceresult告诉我,我可以看到AWS控制台中的新实例启动。

如果我使用默认区域,我没有任何问题,但在涉及区域和端点时我没有做正确的事情。任何建议/指导将是美好的。

回答

0

更多的研究和测试后,我意识到警告是在API一直以来,我只是英里选中它。

This method is not threadsafe. Endpoints should be configured when the client is created and before any service requests are made. Changing it afterwards creates inevitable race conditions for any service requests in transit. 

而不是使用一个公共静态EC2的客户对象,我用的是和跨线程改变端点AA几次,我换了几个我的类来使用特定的类我是一个私人EC2客户端这似乎解决了这个问题。

0

对于Java SDK,默认区域为us-east-1。所以,如果你没有在你的代码中指定任何区域,那么你正在轮询我们 - 东1。

因此,如果您的实例位于另一个区域,那么您必须在代码中传递区域参数。

http://docs.aws.amazon.com/AWSSdkDocsJava/latest/DeveloperGuide/java-dg-region-selection.html

The AWS SDK for Java uses the US East (Northern Virginia) Region as the default region if you do not specify a region in your code.

此外,从相同的链接,下面是HOWTO样品中的Java设置的区域:

例如,配置Amazon EC2的客户端使用欧盟(爱尔兰)地区,使用下面的代码:

AmazonEC2 ec2 = new AmazonEC2(myCredentials); 
ec2.setEndpoint("https://ec2.eu-west-1.amazonaws.com"); 
+0

我很欣赏这种回应,但是我不太清楚你是否彻底地阅读了我的问题,因为我不仅包括在前两行代码中设置端点,而且还指出在区域/ AZ中创建实例是成功,并在相同的方法使用相同的EC2客户端对象,我得到该错误。 – QuickNull