2014-04-15 9 views
8

Ho un'istanza AWS EC2 distribuita e devo trovare il suo IP pubblico. Comunque, per sapere che devo prima conoscere l'istanza-ist della mia istanza.Ottieni istanza dell'istanza EC2 tramite Java

Obiettivo:

  • Ho un codice Java in esecuzione nel mio esempio, e voglio che il codice capire il IP corrente o Istanza-ID dell'istanza in cui è in esecuzione.

Dopo aver letto la documentazione Amazon mi si avvicinò con un metodo Java che restituisce l'IP di tutte le istanze, , ma questo non è quello che voglio, voglio un metodo che restituisce solo l'istanza-id o del pubblico IP indirizzo dell'istanza in esecuzione.

/** 
    * Returns a list with the public IPs of all the active instances, which are 
    * returned by the {@link #getActiveInstances()} method. 
    * 
    * @return a list with the public IPs of all the active instances. 
    * @see  #getActiveInstances() 
    * */ 
    public List<String> getPublicIPs(){ 
     List<String> publicIpsList = new LinkedList<String>(); 

     //if there are no active instances, we return immediately to avoid extra 
     //computations. 
     if(!areAnyActive()) 
      return publicIpsList; 

     DescribeInstancesRequest request = new DescribeInstancesRequest(); 
     request.setInstanceIds(instanceIds); 

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

     List<Instance> instances; 
     for(Reservation res : reservations){ 
      instances = res.getInstances(); 
      for(Instance ins : instances){ 
       LOG.info("PublicIP from " + ins.getImageId() + " is " + ins.getPublicIpAddress()); 
       publicIpsList.add(ins.getPublicIpAddress()); 
      } 
     } 

     return publicIpsList; 
    } 

In questo codice che ho un allineamento con l'istanza-ID di tutte le istanze attive, ma non so se sono "me" o no. Quindi presumo che il mio primo passo sarebbe sapere chi sono, e poi chiedere il mio indirizzo IP pubblico.

C'è un cambiamento che posso fare con il metodo precedente per darmi quello che voglio? C'è un modo più efficiente di farlo?

+2

qui la soluzione: http://codeflex.co/java -get-ec2-private-public-ip-and-instance-id/ –

risposta

3

io non sono un tipo Java. Tuttavia, il mio codice Ruby al di sotto fa stampare il Instance ID e Public IP delle running casi come avevi bisogno:

ec2.describe_instances(
    filters:[ 
    { 
     name: "instance-state-name", 
     values: ["running"] 
    } 
    ] 
).each do |resp| 
    resp.reservations.each do |reservation| 
    reservation.instances.each do |instance| 
     puts instance.instance_id + " ---AND--- " + instance.public_ip_address 
    end 
    end 
end 

Tutto quello che dovete fare è scoprire rispettivi metodi/chiamate nella documentazione JAVA SDK. Il codice che si dovrebbe essere guardando è:

filters:[ 
    { 
     name: "instance-state-name", 
     values: ["running"] 
    } 

Nel blocco di cui sopra, sto filtrando solo le esecuzione istanze.

E

resp.reservations.each do |reservation| 
     reservation.instances.each do |instance| 
      puts instance.instance_id + " ---AND--- " + instance.public_ip_address 

Nel blocco di codice di cui sopra, io sono in esecuzione 2 for loop e tirando instance.instance_id così come instance.public_ip_address.

Poiché JAVA SDK e Ruby SDK stanno entrambi utilizzando le stesse API di AWS EC2, è necessario che ci siano impostazioni simili in JAVA SDK.

Inoltre, La tua domanda è vaga nel senso, stai eseguendo il codice JAVA dall'istanza di cui è necessario l'id di istanza? OPPURE Stai eseguendo il codice java da un'istanza diversa e vuoi estrarre gli id ​​di istanza di tutte le istanze in esecuzione?

UPDATE:

Aggiornamento delle risposte come la questione è cambiato:

AWS offre un servizio di meta-dati su ogni istanza che viene lanciato. È possibile eseguire il polling del servizio di metadati localmente per trovare le informazioni necessarie.

Modulo bash promp, sotto il comando fornito l'istanza-id e l'indirizzo IP pubblico dell'istanza

$ curl -L http://169.254.169.254/latest/meta-data/instance-id 

$ curl -L http://169.254.169.254/latest/meta-data/public-ipv4 

È necessario capire come si intende estrarre i dati da sopra gli URL in Java. A questo punto, hai abbastanza informazioni e questa domanda è irrilevante rispetto a AWS perché ora questa è più una domanda JAVA su come eseguire il polling sopra gli URL.

+0

Quel codice mi dà gli IP e gli ID di tutte le mie istanze in esecuzione, quindi fa esattamente quello che fa il mio codice. Non è quello che voglio però, quello che voglio è l'IP pubblico o l'ID istanza della mia istanza, quindi posso identificarlo. –

+0

Ho modificato la mia domanda per essere il più chiara possibile. Spero che tutti i tipi di vaghezza siano spariti ora! –

+0

@Flame_Phoenix, vedere l'aggiornamento. – slayedbylucifer

1

È possibile utilizzare il servizio di metadati per andare a prendere questo tramite HTTP: http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AESDG-chapter-instancedata.html

es:

GET http://169.254.169.254/latest/meta-data/instance-id 
+0

Questo non utilizza Java SDK, non è la soluzione che sto cercando e non risolve nessuno dei problemi che sto affrontando. Sry. –

+1

Sembra che la risposta sia stata corretta dopotutto. Questo è l'unico modo per risolvere questo problema, poiché l'API AWS EC2 non supporta questa funzionalità in nessun altro modo. kudos ++ Signore. –

2

Il seguente metodo restituirà l'ID istanza EC2.

public String retrieveInstanceId() throws IOException { 
    String EC2Id = null; 
    String inputLine; 
    URL EC2MetaData = new URL("http://169.254.169.254/latest/meta-data/instance-id"); 
    URLConnection EC2MD = EC2MetaData.openConnection(); 
    BufferedReader in = new BufferedReader(new InputStreamReader(EC2MD.getInputStream())); 
    while ((inputLine = in.readLine()) != null) { 
     EC2Id = inputLine; 
    } 
    in.close(); 
    return EC2Id; 
} 

Da qui, è possibile effettuare le seguenti operazioni per ottenere informazioni come l'indirizzo IP (in questo esempio, il privateIP):

try { 
    myEC2Id = retrieveInstanceId(); 
} catch (IOException e1) { 
    e1.printStackTrace(getErrorStream()); 
} 
DescribeInstancesRequest describeInstanceRequest = new DescribeInstancesRequest().withInstanceIds(myEC2Id); 
DescribeInstancesResult describeInstanceResult = ec2.describeInstances(describeInstanceRequest); 
System.out.println(describeInstanceResult.getReservations().get(0).getInstances().get(0).getPrivateIPAddress()); 

È inoltre possibile utilizzare questo per ottenere tutti i tipi di informazioni rilevanti sull'istanza corrente su cui è in esecuzione il programma Java; basta sostituire .getPrivateIPAddress() con il comando get appropriato per le informazioni che cerchi. L'elenco dei comandi disponibili può essere trovato here.

Modifica: per coloro che potrebbero evitare di utilizzare questo a causa dell'URL "sconosciuto"; consultare la documentazione di Amazon sull'argomento, che punta direttamente a questo stesso URL; l'unica differenza è che lo stanno facendo tramite cli piuttosto che all'interno di Java. http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html

25

Suggerirei/raccomandare l'uso di AWS SDK per Java.

// Resolve the instanceId 
String instanceId = EC2MetadataUtils.getInstanceId(); 

// Resolve (first/primary) private IP 
String privateAddress = EC2MetadataUtils.getInstanceInfo().getPrivateIp(); 

// Resolve public IP 
AmazonEC2 client = AmazonEC2ClientBuilder.defaultClient(); 
String publicAddress = client.describeInstances(new DescribeInstancesRequest() 
                .withInstanceIds(instanceId)) 
          .getReservations() 
          .stream() 
          .map(Reservation::getInstances) 
          .flatMap(List::stream) 
          .findFirst() 
          .map(Instance::getPublicIpAddress) 
          .orElse(null); 

A meno che Java8 non sia disponibile, questo richiederà più boilercode. Ma in poche parole, è così.

https://stackoverflow.com/a/30317951/525238 ha già menzionato l'EC2MetadataUtils, ma questo include anche codice di lavoro.

+0

Grazie. Risposta perfetta – Anuj

2

di rispondere alla domanda iniziale di

Ho un'istanza AWS EC2 distribuito, e ho bisogno di trovare il suo IP pubblico.

Si può fare in Java utilizzando l'API AWS:

EC2MetadataUtils.getData("/latest/meta-data/public-ipv4"); 

Questo vi direttamente dare al pubblico IP, se ne esiste uno

Problemi correlati