Reputation: 8654
I am trying to programmatically list my ec2 instances via the aws java api.
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();
}
}
This prints something like:
{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: []}]}
However, I know I have instance in us-west-2. When I add that to my api query via
describeAvailabilityZonesRequest.withZoneNames("us-west-2");
I get this error
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)
What should I do to fix this? Why are my us-west instances not showing up?
Upvotes: 1
Views: 3112
Reputation: 178956
us-west-2
is not an availability zone, it's a region. us-west-2a
is an availability zone. It looks like you're getting the error because, as your code is currently written, you're asking us-east-1 about an availability zone that doesn't exist there. The fix, though, is not just a matter of putting the final letter designator in the string.
EC2 is deliberately decentralized so that each region is independent of the others for survivability, and as such, each region has its own API endpoint. Your requests have to be sent to the appropriate endpoint for the region you want.
I'm not a Java person, so I'm not sure if the following is precisely the information you need, but it should at least get you pointed in the right direction.
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
The link above also explains why you're currently talking to us-east-1
without actually specifying an endpoint.
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.
Upvotes: 5