【问题标题】:AWS/Java: How to Get EC2 Instances From AWS Java APIAWS/Java:如何从 AWS Java API 获取 EC2 实例
【发布时间】:2013-12-22 10:09:20
【问题描述】:

我正在尝试通过 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 实例没有显示?

【问题讨论】:

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


    【解决方案1】:

    us-west-2 不是可用区,它是一个区域。 us-west-2a 是一个可用区。看起来您遇到了错误,因为在您当前编写代码时,您正在向 us-east-1 询问那里不存在的可用区。不过,解决方法不仅仅是将最后一个字母指示符放入字符串中。

    EC2 是有意去中心化的,因此每个区域都独立于其他区域以实现生存性,因此,每个区域都有自己的 API 端点。您的请求必须发送到您想要的区域的适当端点。

    我不是 Java 人,所以我不确定以下是否正是您需要的信息,但它至少应该能让您找到正确的方向。

    可以通过调用setEndpoint(String endpointUrl) 方法将每个 AWS 客户端配置为使用特定端点。

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

    上面的链接还解释了为什么您当前正在与us-east-1 交谈而没有实际指定端点。

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

    【讨论】:

    • 迈克尔,非常感谢您的回答和链接。完全清晰且正确。
    • 我这样做了,但它仍然只显示 us-east-1
    • EndpointConfiguration endpointConfiguration = new EndpointConfiguration("ec2.us-west-2.amazonaws.com","us-west-2"); ec2 = AmazonEC2ClientBuilder.standard() .withEndpointConfiguration(endpointConfiguration) .build();
    猜你喜欢
    • 2011-08-22
    • 2019-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-03
    • 1970-01-01
    • 2020-04-09
    • 1970-01-01
    相关资源
    最近更新 更多