shamaz
Goto Top

Amazon AWS java SDK describeInstances für eu-west-1 Region

Ich habe jetzt schon so einige Beiträge gelesen. Alle machen sie auch ungefähr das selbe, aber keiner dieser Beiträge konnte mein Problem lösen.

Bei amazon habe ich in der Region eu-west-1 (Irland) einige Instanzen. Diese sind teils angeschaltet oder auch aus. Beim einschalten über das Webinterface (Amazon AWS Console) kann man leider nicht gleich fest mit geben, welche elastic ip auf der instanze liegen soll. Also wollte ich mir ein Java programm schreiben, was einfach das nach einem start macht.

Dafür holte ich mir die AWS java SDK mit den tools für Eclipse (Juno). Über diese AWS Tools legte ich ein neues Projekt an wodurch gleich das richtige "Credential File" im Projekt mit den richtigen werten angelegt wurde.

Nun dachte ich, lass dir erst mal die Instanz IDs geben, mit denen gehts dann weiter. Nüscht ist. Mein Programm, was das machen soll sieht folgendermaßen aus:
import java.io.IOException;
import java.util.List;

import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.PropertiesCredentials;
import com.amazonaws.services.ec2.AmazonEC2Client;
import com.amazonaws.services.ec2.model.DescribeInstancesRequest;
import com.amazonaws.services.ec2.model.DescribeInstancesResult;
import com.amazonaws.services.ec2.model.Instance;
import com.amazonaws.services.ec2.model.Reservation;

/**
 * 
 */

/**
 * @author shamaz
 * 
 */
public class Main {
	private static AWSCredentials credentials = null;
	private static AmazonEC2Client ec2 = null;

	/**
	 * @param args
	 */
	public static void main(String args) {

		init();

		DescribeInstancesRequest request = new DescribeInstancesRequest();
		DescribeInstancesResult result = ec2.describeInstances(request);
		List<Reservation> reservations = result.getReservations();

		
		System.out.println("Die InstanzenIDs sind:");  
		for (Reservation reservation : reservations) {
			List<Instance> instances = reservation.getInstances();
			for (Instance instance : instances) {
				System.out.println(instance.getInstanceId());
			}
		}

	}

	public static void init() {
		try {
			credentials = new PropertiesCredentials(
					Main.class.getResourceAsStream("AwsCredentials.properties"));  
			ec2 = new AmazonEC2Client(credentials);

		} catch (IOException e) {
			e.printStackTrace();
		}

	}
}
Es kommt einfach nichts in das result.Reservation zurück. Dann habe ich mir gedacht, dass könnte an den Zonen und/oder Regionen liegen. Gib mir diese also mal aus. Das mache ich mit diesem Programm:
import java.io.IOException;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import com.amazonaws.AmazonServiceException;
import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.PropertiesCredentials;
import com.amazonaws.services.ec2.AmazonEC2Client;
import com.amazonaws.services.ec2.model.DescribeAvailabilityZonesResult;
import com.amazonaws.services.ec2.model.DescribeInstancesRequest;
import com.amazonaws.services.ec2.model.DescribeInstancesResult;
import com.amazonaws.services.ec2.model.Instance;
import com.amazonaws.services.ec2.model.Reservation;

/**
 * 
 */

/**
 * @author shamaz
 * 
 */
public class Main {
	private static AWSCredentials credentials = null;
	private static AmazonEC2Client ec2 = null;

	/**
	 * @param args
	 */
	public static void main(String args) {

		init();

		try {
            DescribeAvailabilityZonesResult availabilityZonesResult = ec2.describeAvailabilityZones();
            System.out.println("You have access to " + availabilityZonesResult.getAvailabilityZones().size() +  
                    " Availability Zones.");  
            System.out.println("These are: " + availabilityZonesResult.getAvailabilityZones());  

            DescribeInstancesResult describeInstancesRequest = ec2.describeInstances();
            List<Reservation> reservations = describeInstancesRequest.getReservations();
            Set<Instance> instances = new HashSet<Instance>();

            for (Reservation reservation : reservations) {
                instances.addAll(reservation.getInstances());
            }

            System.out.println("You have " + instances.size() + " Amazon EC2 instance(s) running.");  
        } catch (AmazonServiceException ase) {
                System.out.println("Caught Exception: " + ase.getMessage());  
                System.out.println("Reponse Status Code: " + ase.getStatusCode());  
                System.out.println("Error Code: " + ase.getErrorCode());  
                System.out.println("Request ID: " + ase.getRequestId());  
        }

	}

	public static void init() {
		try {
			credentials = new PropertiesCredentials(
					Main.class.getResourceAsStream("AwsCredentials.properties"));  
			ec2 = new AmazonEC2Client(credentials);

		} catch (IOException e) {
			e.printStackTrace();
		}

	}
}
Heraus kommt:

You have access to 3 Availability Zones.
These are: [{ZoneName: us-east-1b, State: available, RegionName: us-east-1, }, {ZoneName: us-east-1c, State: available, RegionName: us-east-1, }, {ZoneName: us-east-1d, State: available, RegionName: us-east-1, }]
You have 0 Amazon EC2 instance(s) running.

Da fehlt einfach meine Zone und Region. Ich habe die Instanzen in "eu-west-1". Und deshalb denke ich, dass deshalb keine "Reservations" zurück geliefert werden.

Meine Frage also, was muss ich machen um das Problem zu lösen?

mfg

Shamaz


EDIT:

Kaum gibt man das richtige bei Google ein, schon gehts. Dieser Artikel war die Lösung: http://aws.amazon.com/articles/3604
Der Trick war einfach noch beim "init" diese Zeile einzufügen:

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

Schade, dass es so viel Nerven gekostet hat, was passendes für den Europäischen Raum zu finden. Da finde ich gibt es noch Nachholungsbedarf.

Somit ist die Sache erst mal für mich erledigt.

mfg Shamaz

Content-Key: 190925

Url: https://administrator.de/contentid/190925

Printed on: April 19, 2024 at 02:04 o'clock