实例ID不存在

时间:2014-02-28 18:32:18

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

我正在尝试创建一个EC2实例,我遇到的问题是在我创建这样的实例之后:

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控制台中的新实例启动。

如果我使用默认区域,我没有问题,但是当涉及到区域和端点时,我没有做正确的事情。任何建议/指导都会很棒。

2 个答案:

答案 0 :(得分:0)

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

因此,如果您的实例位于其他区域,则必须在代码中传递region参数。

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

  

如果您未在代码中指定区域,则AWS SDK for Java会将美国东部(弗吉尼亚北部)区域用作默认区域。

此外,在同一链接中,以下是如何在Java中设置区域的示例:

例如,要配置Amazon EC2客户端以使用EU(爱尔兰)区域,请使用以下代码:

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

答案 1 :(得分: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客户端对象,而是在线程中多次更改端点,而是将我的一些类切换为使用特定于我所在类的私有ec2客户端。解决问题。