Connexion de JConsole à JBoss AS 7 sur Amazon EC2

Cette page a été rédigée il y a fort fort longtemps, et n'a pas tellement été mise à jour.

 

Vous savez, moi je ne crois pas qu'il y ait de bonne ou de mauvaise page. Moi, si je devais résumer mon wiki aujourd'hui avec vous, je dirais que c'est d'abord des rencontres. Des gens qui m'ont tendu la main, peut-être à un moment où je ne pouvais pas, où j'étais seul chez moi. Et c'est assez curieux de se dire que les hasards, les rencontres forgent une destinée... Parce que quand on a le goût de la chose, quand on a le goût de la chose bien faite, le beau geste, parfois on ne trouve pas l'interlocuteur en face je dirais, le miroir qui vous aide à avancer. Alors ça n'est pas mon cas, comme je disais là, puisque moi au contraire, j'ai pu ; et je dis merci au wiki, je lui dis merci, je chante le wiki, je danse le wiki... je ne suis qu'amour ! Et finalement, quand des gens me disent « Mais comment fais-tu pour avoir cette humanité ? », je leur réponds très simplement que c'est ce goût de l'amour, ce goût donc qui m'a poussé aujourd'hui à entreprendre une construction logicielle... mais demain qui sait ? Peut-être simplement à me mettre au service de la communauté, à faire le don, le don de soi.

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

Jb7-ec2.png.png

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.