我正在尝试通过 aws java api 以编程方式列出我的 ec2 实例。
public static void main(String[] args) {
AWSCredentials awsCredentials = new BasicAWSCredentials(awsAccessKey, awsSecretKey);
AmazonEC2AsyncClient amazonEC2AsyncClient = new AmazonEC2AsyncClient(awsCredentials);
DescribeAvailabilityZonesRequest describeAvailabilityZonesRequest = new DescribeAvailabilityZonesRequest();
Future<DescribeAvailabilityZonesResult> describeAvailabilityZonesResultFuture = amazonEC2AsyncClient.describeAvailabilityZonesAsync(describeAvailabilityZonesRequest);
try {
DescribeAvailabilityZonesResult describeAvailabilityZonesResult = describeAvailabilityZonesResultFuture.get();
System.out.println(describeAvailabilityZonesResult);
} catch (Exception e) {
e.printStackTrace();
}
}
这会打印出如下内容:
{AvailabilityZones: [
{ZoneName: us-east-1a,State: available,RegionName: us-east-1,Messages: []},
{ZoneName: us-east-1b,State: available,RegionName: us-east-1,Messages: []},
{ZoneName: us-east-1c,State: available,RegionName: us-east-1,Messages: []}]}
但是,我知道我在 us-west-2 中有实例。当我通过
将其添加到我的 api 查询时describeAvailabilityZonesRequest.withZoneNames("us-west-2");
我收到这个错误
java.util.concurrent.ExecutionException: com.amazonaws.AmazonServiceException: Status Code: 400, AWS Service: AmazonEC2, AWS Request ID: 38956486-2686-4466-b9e0-45ef12395676, AWS Error Code: InvalidParameterValue,
AWS Error Message: Invalid availability zone: [us-west-2]
at java.util.concurrent.FutureTask.report(FutureTask.java:122)
at java.util.concurrent.FutureTask.get(FutureTask.java:188)
at com.pledgeling.platform.system.SystemAdmin.main(SystemAdmin.java:25)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
Caused by: com.amazonaws.AmazonServiceException: Status Code: 400, AWS Service: AmazonEC2, AWS Request ID: 38956486-2686-4466-b9e0-45ef12395676, AWS Error Code: InvalidParameterValue, AWS Error Message: Invalid availability zone: [us-west-2]
at com.amazonaws.http.AmazonHttpClient.handleErrorResponse(AmazonHttpClient.java:767)
at com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.java:414)
at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:228)
at com.amazonaws.services.ec2.AmazonEC2Client.invoke(AmazonEC2Client.java:7918)
我应该怎么做才能解决这个问题?为什么我的 us-west 实例没有显示?
最佳答案
us-west-2
不是可用区,它是一个区域。 us-west-2a
是可用区。看起来您收到了错误,因为在您当前编写的代码中,您正在向 us-east-1 询问那里不存在的可用区。不过,解决方法不仅仅是将最后一个字母指示符放入字符串中。
EC2 是有意分散的,因此每个区域都独立于其他区域以实现生存能力,因此,每个区域都有自己的 API 端点。您的请求必须发送到您想要的区域的适当端点。
我不是 Java 专家,所以我不确定以下内容是否正是您需要的信息,但它至少应该能为您指明正确的方向。
Each AWS client can be configured to use a specific endpoint by calling the
setEndpoint(String endpointUrl)
method.
http://docs.aws.amazon.com/AWSSdkDocsJava/latest/DeveloperGuide/java-dg-region-selection.html
上面的链接还解释了为什么您目前正在与 us-east-1
通话而没有实际指定端点。
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.
关于java - AWS/Java : How to Get EC2 Instances From AWS Java API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20724588/