2013-12-21 16 views
1

aws java api를 통해 프로그래밍 방식으로 ec2 인스턴스를 나열하려고합니다.AWS/Java : 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: []}]} 

을, 나는 우리 서쪽-2의 인스턴스가 알고있다. 내가

describeAvailabilityZonesRequest.withZoneNames("us-west-2"); 

를 통해 내 API 쿼리에 그를 추가 할 때이 오류

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) 

나는이 문제를 해결하기 위해 어떻게해야 하는가를 얻을? 왜 우리 서쪽의 사례가 나타나지 않는거야?

답변

5

us-west-2는 사용 가능한 영역이 아닙니다. 영역입니다. us-west-2a은 사용 가능성 영역입니다. 코드가 현재 작성되었으므로 거기에 존재하지 않는 가용성 영역에 대해 우리에게 east-1을 요청하고 있기 때문에 오류가 발생하는 것 같습니다. 그러나이 수정은 문자열에 최종 문자 지정자를 넣는 문제 만이 아닙니다.

EC2는 각 영역이 생존 성을 위해 다른 영역과 독립적으로되도록 의도적으로 분산되어 있으므로 각 영역마다 고유 한 API 끝점이 있습니다. 요청한 지역의 해당 엔드 포인트로 요청을 보내야합니다.

저는 자바 사람이 아니므로 다음 정보가 필요한 정보인지 정확하게 알 수는 없지만 적어도 올바른 방향으로 지적해야합니다.

각 AWS 클라이언트는 setEndpoint(String endpointUrl) 메서드를 호출하여 특정 끝점을 사용하도록 구성 할 수 있습니다. 현재 실제로 엔드 포인트를 지정하지 않고 us-east-1 이야기하는 이유 http://docs.aws.amazon.com/AWSSdkDocsJava/latest/DeveloperGuide/java-dg-region-selection.html

위의 링크

도 설명합니다.

코드에 지역을 지정하지 않으면 Java 용 AWS SDK는 미국 동부 (북부 버지니아) 지역을 기본 지역으로 사용합니다.

+1

마이클, 답변과 링크에 대해 매우 감사드립니다. 완벽하게 명확하고 올바르게. –

+0

나는 이것을했지만 그래도 항상 우리만을 보여줍니다. – user3217883

+0

EndpointConfiguration endpointConfiguration = new EndpointConfiguration ("ec2.us-west-2.amazonaws.com", "us-west-2"); \t \t EC2 AmazonEC2ClientBuilder.standard =() \t \t \t \t .withEndpointConfiguration (endpointConfiguration) .build(); – user3217883

관련 문제