2016-02-19 2 views
3

J'essaie d'amener une application Java à l'intérieur d'un conteneur AWS ECS et Java est incapable de rechercher le nom d'hôte.Java incapable de résoudre le nom d'hôte

ECS définit le nom d'hôte et configure correctement/etc/hosts et /etc/resolv.conf. Si je fais nslookup `hostname` j'obtiens une résolution très bien. Je peux également résoudre cela par rapport au serveur de noms défini dans /etc/resolv.conf

Mais si je démarre l'application Java qui tente de résoudre le nom d'hôte, j'obtiens une exception indiquant que le nom d'hôte ne peut pas être résolu.

java sortie -version:

bash# java -version 
java version "1.8.0_45" 
Java(TM) SE Runtime Environment (build 1.8.0_45-b14) 
Java HotSpot(TM) 64-Bit Server VM (build 25.45-b02, mixed mode) 

J'ai donc écrit un petit programme de test:

import java.net.InetAddress; 
import java.net.UnknownHostException; 
import java.io.PrintWriter; 
import java.io.StringWriter; 

public class DomainResolutionTest { 

    public static void main(String[] args) { 

     try { 
      InetAddress ip = InetAddress.getLocalHost(); 
      System.out.println(ip.toString()); 
     }catch (UnknownHostException uhx) { 
      System.out.println("ERROR: " + uhx.getMessage() + "\n" + getStackTrace(uhx)); 
      Throwable cause = uhx.getCause(); 
      if (cause != null) System.out.println("CAUSE: " + cause.getMessage()); 
     } 

    } 

    public static String getStackTrace(Throwable t) 
    { 
     StringWriter sw = new StringWriter(); 
     PrintWriter pw = new PrintWriter(sw, true); 
     t.printStackTrace(pw); 
     pw.flush(); 
     sw.flush(); 
     return sw.toString(); 
    } 

} 

qui jette l'erreur suivante lorsque le nom d'hôte est 'f17a0bdca449':

ERROR: f17a0bdca449: f17a0bdca449: unknown error 
java.net.UnknownHostException: f17a0bdca449: f17a0bdca449: unknown error 
    at java.net.InetAddress.getLocalHost(InetAddress.java:1484) 
    at DomainResolutionTest.main(DomainResolutionTest.java:11) 
Caused by: java.net.UnknownHostException: f17a0bdca449: unknown error 
    at java.net.Inet6AddressImpl.lookupAllHostAddr(Native Method) 
    at java.net.InetAddress$2.lookupAllHostAddr(InetAddress.java:907) 
    at java.net.InetAddress.getAddressesFromNameService(InetAddress.java:1302) 
    at java.net.InetAddress.getLocalHost(InetAddress.java:1479) 
    ... 1 more 

CAUSE: f17a0bdca449: unknown error 

Si je change java pour utiliser la pile ipv4 en utilisant -Djava.net.preferIPv4Stack=true je reçois:

$> java -Djava.net.preferIPv4Stack=true DomainResolutionTest 
ERROR: f17a0bdca449: f17a0bdca449: unknown error 
java.net.UnknownHostException: f17a0bdca449: f17a0bdca449: unknown error 
    at java.net.InetAddress.getLocalHost(InetAddress.java:1484) 
    at DomainResolutionTest.main(DomainResolutionTest.java:11) 
Caused by: java.net.UnknownHostException: f17a0bdca449: unknown error 
    at java.net.Inet4AddressImpl.lookupAllHostAddr(Native Method) 
    at java.net.InetAddress$2.lookupAllHostAddr(InetAddress.java:907) 
    at java.net.InetAddress.getAddressesFromNameService(InetAddress.java:1302) 
    at java.net.InetAddress.getLocalHost(InetAddress.java:1479) 
    ... 1 more 

CAUSE: f17a0bdca449: unknown error 

Si je force à utiliser la mise en œuvre du soleil et de préciser NAMESERVER et SEARCH_DOMAIN je reçois toujours la même chose:

$> export NAMESERVER=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}') 
$> export SEARCH_DOMAIN=$(cat /etc/resolv.conf | grep search | awk '{print $2}') 
$> java -Dsun.net.spi.nameservice.provider.1=dns,sun -Dsun.net.spi.nameservice.nameservers=${NAMESERVER} -Dsun.net.spi.nameservice.domain=${SEARCH_DOMAIN} -Djava.net.preferIPv4Stack=true DomainResolutionTest 
ERROR: f17a0bdca449: DNS name not found [response code 3] 
java.net.UnknownHostException: f17a0bdca449: DNS name not found [response code 3] 
    at java.net.InetAddress.getLocalHost(InetAddress.java:1484) 
    at DomainResolutionTest.main(DomainResolutionTest.java:11) 
Caused by: java.net.UnknownHostException: DNS name not found [response code 3] 
    at sun.net.spi.nameservice.dns.DNSNameService.resolve(DNSNameService.java:180) 
    at sun.net.spi.nameservice.dns.DNSNameService.lookupAllHostAddr(DNSNameService.java:351) 
    at java.net.InetAddress.getAddressesFromNameService(InetAddress.java:1302) 
    at java.net.InetAddress.getLocalHost(InetAddress.java:1479) 
    ... 1 more 

CAUSE: DNS name not found [response code 3] 

Je suis à la fin de mon esprit. Aucune suggestion?

+0

Qu'est-ce que 'hôtes getent f17a0bdca449' vous donner? – delephin

+0

L'adresse correcte. Je pense que le problème est en fait la version de Linux sur laquelle je cours. Reconstruire sur une plate-forme différente. –

Répondre

1

Les informations d'hôte que vous obtenez sont nom d'hôte du conteneur docker. Ce problème n'est pas unique à ecs, cela est vrai pour toute application Java s'exécutant dans le conteneur docker.

Avec ECS, vous n'avez pas la possibilité d'injecter le nom d'hôte en tant que configuration d'exécution.

Une meilleure solution lors de l'exécution dans l'environnement AWS consistera à utiliser le service de métadonnées AWS pour obtenir le nom d'hôte.

Une requête http GET au service de métadonnées AWS devrait vous fournir les détails de l'hôte.

http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html

Si vous avez java aws sdk inclus dans votre application, vous pouvez tirer parti de la classe suivante http://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/util/EC2MetadataUtils.InstanceInfo.html