Wie konfiguriert man eine GlassFish-Instanz, die auf AWS / ElasticBeanstalk / Docker läuft?

8

Ich verwende GlassFish, um eine Java EE-Webanwendung zu erstellen. Die Dinge funktionieren gut auf meiner lokalen Dev-Maschine. Ich habe

  • hat postgres JDBC-Bibliotheken an den richtigen Ort kopiert
  • konfigurierte einen Verbindungspool und eine JDBC-Ressource in der Glassfish-Verwaltungskonsole
  • hat eine Web-App bereitgestellt, die diese Verbindung verwendet
  • habe die Ergebnisse in meinem Browser gesehen

Ich versuche, dieselbe App auf der von AWS Elastic Beanstalk gehosteten Glassfish-Instanz bereitzustellen. AWS-EB verwendet Docker zum Bereitstellen der Glassfish-Instanz. Ich kann nur den dritten Schritt oben (Bereitstellen einer Web-App) tun, und bin völlig ratlos, wie man die ersten beiden macht.

Was ich gerne tun würde, ist über die Web-Zugriffe auf die Glassfish Admin-Konsole, aber das scheint auf keiner Ebene zu funktionieren. Eine Alternative wäre, den Glasfisch "asadmin" auf meiner lokalen Maschine zu verwenden, um die entfernten Glasfische zu konfigurieren, aber das kann ich auch nicht machen.

Wie konfiguriert man eine Glassfish-Instanz, die auf AWS EB gehostet wird? Ist es überhaupt möglich?

Ich habe einige Beobachtungen gemacht, aber ich würde mich über eine Bestätigung oder auf andere Weise freuen:

  • es scheint, dass AWS einen Befehl in ihrer CLI namens 'asadmin' hat, der sich mit Autoscaling beschäftigt und den gleichen Namen wie 'asadmin' hat, der mit Glassfish ausgeliefert wird. Abgesehen davon, dass Google-Suche schwierig ist, scheinen die beiden nichts miteinander zu tun zu haben
  • Wenn ich eine Verbindung mit der AWS EC2-Instanz herstellen, die die Docker- und Glassfish-Instanz enthält, geschieht Folgendes
    • sudo docker ps gibt zurück, dass die Ports 4848 / tcp, 8080 / tcp, 8181 / tcp vorhanden sind und dass keine zugeordnet sind
    • wget localhost: 8080 - Verbindung abgelehnt
    • gleich für 8181 und 4848
    • wget localhost: 80 gibt die Webseite der Glassfish-Startseite
    • zurück
  • in derselben Instanz läuft docker inspect Ich bekomme eine interne IP-Adresse (nennen Sie es 1.2.3.4), dann auf dieser EC-Instanz
    • wget 1.2.3.4:8080 (und 4848, 8181) geben alle HTML-Dateien
    • zurück
    • wget 1.2.3.4:80 - Verbindung verweigert
  • Wenn ich eine Bash-Shell im Andock-Container starte, scheinen die folgenden Dinge wahr zu sein
    • wget localhost: 8080 (und 4848, 8181) geben alle wohlgeformten Seiten
    • zurück
    • wget localhost: 80 - Verbindung verweigert

Vielleicht muss ich der EC2-Instanz mitteilen, dass sie von localhost zu 1.2.3.4 weiterleitet, aber wie kann ich das erreichen, wenn der EB Load Balancer es skaliert?

Jeder Rat würde sehr geschätzt werden.

    
Burleigh Bear 08.12.2014, 05:18
quelle

2 Antworten

6

Was folgt, ist etwas, das für mich funktioniert - aber ich habe das Gefühl, dass mir etwas fehlt. Alle Bearbeitungen / Kommentare wären sehr willkommen.

Es gibt verschiedene Hooks in der EB / Docker-Implementierung, mit denen die Ausführung von Post-Deployment-Hooks in einer Glassfish-Instanz innerhalb eines Docker-Containers innerhalb einer EB-Instanz ausgeführt werden kann. Ich habe Post-Deployment-Hooks verwendet, um einen Verbindungspool einzurichten. So sieht die endgültige Installation aus, nur als Referenz:

%Vor%

Das insgesamt gewünschte Ergebnis besteht darin, dass nach der Bereitstellung der App in der Docker-Instanz die Befehle asadmin ausgeführt werden, um einen JDBC-Verbindungspool zu erstellen und diesen Verbindungspool zu einer jdbc-Ressource zu machen . Auf meinem lokalen Rechner wären die Befehle

%Vor%

Dabei ist "jdbc / dev" der Name, den der Java-Code wissen muss, um eine Verbindung in der üblichen Weise zu erhalten, d. h.

%Vor%

Wir möchten, dass die Befehle in der Docker-Instanz ausgeführt werden, da die Docker-Instanz Zugriff auf die Umgebungsvariablen hat, die Sie in der AWS-Verwaltungskonsole deklarieren, sodass ich Konfigurationsinformationen ohne sie in meinen Build-Skripten übergeben kann.

>

Um dieses Ergebnis zu erreichen, benötigen wir während der Installation eine Datei in der EC2-Instanz, in meinem Fall /opt/elasticbeanstalk/hooks/appdeploy/post/99_configure_jdbc.sh . Diese Datei wird nach der Bereitstellung als Root in der EC2-Instanz ausgeführt. Ich werde es als ec2-post-deploy-hook bezeichnen.

Wir werden diese Datei mit einer .exextensions / .config-Datei erstellen, wie hier dokumentiert

Meine .config Datei hat folgenden Inhalt:

%Vor%

Alles nach dem Inhalt: | endet im ec2-post-deploy-hook .

Ich habe diese Idee von Ссылка gelernt.

Nur die letzte Zeile und die viertletzte Zeile werden benötigt, aber die anderen Zeilen sind für das Debuggen nützlich. Die Ausgabe endet in / tmp / post auf der EC2-Instanz.

Der einzige Trick in dieser Datei ist, dass wir die ID des Andock-Containers immer mit

erhalten können %Vor%

, da nach der Bereitstellung nur ein Docker-Container ausgeführt wird und der Name "neustes" hat.

Die letzte Zeile des ec2-post-deploy-Hooks verwendet das Andockfenster, um in der Docker-Instanz diejenigen Befehle auszuführen, die ich ursprünglich ausführen wollte - das sind die asadmin-Befehle. Ich stelle eine Datei namens setup_pool.sh in meiner WAR-Datei bereit, sodass sie während der Bereitstellung an einem bekannten Speicherort landet. Mein setup_pool.sh sieht so aus (und ich nenne es einen docker-post-deploy-hook ):

%Vor%

Diese Datei wird in der Docker-Instanz ausgeführt. Die beiden asadmin -Befehle sind das Fleisch, aber auch hier gibt es Debugging in / tmp / setup_connections innerhalb der Docker-Instanz

Passwörter usw. werden von der AWS-Umgebung erhalten.

Das einzige, was ich zu diesem Zeitpunkt nicht tun kann, ist, dass die AWS-Umgebungsvariablen bei der ersten Bereitstellung verfügbar sind. Ich habe keine Ahnung warum, aber ich kann sie nur einstellen, nachdem die Instanz läuft. Das bedeutet, dass ich zweimal bereitstellen muss, eine Dummy-Bereitstellung, gefolgt von einer Bearbeitung der Umgebung, gefolgt von einer tatsächlichen Bereitstellung.

Also, zusammenfassend,

  • bei der Bereitstellung
    • Eine .config-Datei generiert eine ec2-Post-Deploy-Hook-Datei
    • Das AWS-System implementiert den Docker-Post-Deploy-Hook als Teil von .war, das für glassfish
    • bereitgestellt wird
  • bei der Post-Bereitstellung,
    • Das elastische Bean-System führt den ec2-post-deploy-hook
    • aus
    • Der ec2-post-deploy-Hook führt den docker-post-deploy-hook
    • aus
    • Der docker-post-deploy-Hook führt asadmin aus, um die entsprechenden Verbindungspools einzurichten
  • Zur Laufzeit verwendet der Java-Code in der Webanwendung die Verbindungspools

Und alles funktioniert. Es ist irgendwie hässlich zu sehen, aber, weißt du, ich auch.

    
Burleigh Bear 09.12.2014, 05:42
quelle
3

Nachdem ich mich einige Zeit mit diesem Problem herumgeschlagen habe, denke ich, dass ich endlich eine akzeptable Problemumgehung (zumindest für mich) gefunden habe: -

Erstellen Sie DockerFile und packen Sie es direkt in den WAR (auf der höchsten Ebene, nicht in einem Ordner). DockerFile -

%Vor%

Jetzt, wenn diese WAR bereitgestellt wird (ich verwende 'eb deploy'). Diese DockerFile wird ausgeführt.

Im obigen einfachen Beispiel wird zuerst der mysql jdbc-Treiber heruntergeladen und in das lib-Verzeichnis von glassfish gesetzt. Als nächstes habe ich domain.xml verpackt (alle Ressourcen, usw. bereits eingerichtet) innerhalb der WAR selbst, wird in den Domain-Konfigurationsordner von Glassfish verschoben, um geladen zu werden, wenn Glassfish gestartet wird.

    
A. Agarwal 10.08.2015 12:14
quelle