L’objectif est d’établir une connexion entre jconsole et JBoss AS 7 déployé sur une instance Amazon EC2.
Environnement
L’environnement dans lequel j’ai mis en place la solution est le suivant :
-
JBoss AS 7.1 ou 7.0
-
Amazon EC 2 t1.micro instance, Amazon Linux
-
IP publique fixe (Elastic IP), avec un nom DNS personnalisé (aws1.sewatech.net)
-
Client jconsole (JDK 6) sur MacOS X, derrière un pare-feu
Configuration de JBoss
Dans JBoss AS 7.1, les accès distants à JMX sont désactivés. L’activation de l’accès distant se fait en deux parties.
Activation des connecteurs
Tout d’abord, il faut associer des connecteurs au sous-système JMX, en changeant, dans le fichier standalone/configuration/standalone.xml, la portion :
<subsystem xmlns="urn:jboss:domain:jmx:1.1" show-model="true"/>
en :
<subsystem xmlns="urn:jboss:domain:jmx:1.1" show-model="true">
<jmx-connector registry-binding="jmx-connector-registry"
server-binding="jmx-connector-server"/>
</subsystem>
Cette opération est inutile avec les versions 7.0.
Connexion distante
Ensuite, il faut mettre ces connecteurs à l’écoute de connexions distantes. Par défaut, ils n’acceptent que les connexions locales. Ceci peut se faire grâce à un paramètre au lancement de JBoss (-Djboss.bind.address.management=0.0.0.0). J’ai préféré modifier la configuration de l’interface réseau management utilisée par les connecteurs JMX.
<interfaces>
<interface name="management">
<inet-address value="0.0.0.0"/>
</interface>
...
</interfaces>
Dans cette partie de la configuration, il n’y a aucune spécificité liée à Amazon EC2. La première spécificité est due au firewall et à la translation d’adresse pour accéder au serveur. Le nom (public) utilisé pour atteindre le serveur n’est pas celui du serveur lui-même, appelé nom privé. Il en est de même pour les adresses IP : une IP publique et une IP privée.
Avec JBoss AS 7.1.0.CR1
Attention : cette partie est obsolète. La technique présentée ici n’est valable qu’en version 7.1.0.CR1. Elle ne fonctionnait pas dans les versions précédentes et ne fonctionne plus à partir de la 7.1.0.Final.
Pour que la translation d’adresse ne pause pas de problème à l’accès JMX, il faut ajouter un paramètre au lancement de JBoss. En fin du fichier bin/standalone.conf, j’ai ajouté la ligne suivante :
JAVA_OPTS="$JAVA_OPTS -Djava.rmi.server.hostname=aws1.sewatech.net"
Cette option ne fonctionne qu’à partir de la version 7.1.0.CR1 ; cf. AS7-3120.
Configuration du firewall Amazon
JBoss utilise deux ports fixes pour JMX : 1090, pour la connexion initiale et 1091 pour la communication ultérieure. Il faut donc autoriser le client à accéder à ces ports.
ec2-authorize quicklaunch-1 -P tcp -p 1090-1091 -s xxx.yyy.zzz.www/32
JConsole
Pour finir, on peur démarrer jconsole normalement.
jconsole aws.sewatech.net:1090
Avec JBoss AS 7.0
Ceci est aussi valable avec la version AS 7.1.beta1, avant que le ticket AS7-3120 ne soit résolu.
Configuration du client
L’accès direct au serveur n’est pas possible. Il faut mettre en place un proxy SOCKS.
ssh -vfND 9999 -i .ec2/aws1.pem ec2-user@aws1.sewatech.net
Configuration du firewall Amazon
Dernière étape, il faut autoriser la connexion au serveur. Du fait du proxy SOCKS, il faut autoriser le serveur lui-même à accéder au port.
ec2-authorize quicklaunch-1 -P tcp -p 1090 -s 107.20.184.81/32
C’est l’adresse IP publique qui est spécifiée ici.
JConsole
On démarre JConsole en lui indiquant le proxy SOCKS.
jconsole -J-DsocksProxyHost=localhost -J-DsocksProxyPort=9999 aws1.sewatech.net:1090
Il y a un peu de latence au démarrage, mais ça fonctionne.