Как настроить экземпляр GlassFish, работающий на AWS/ElasticBeanstalk / Docker?

Я использую GlassFish для обслуживания веб-приложения Java EE. Все отлично работает на моей локальной машине dev. У меня

  • скопировал библиотеки postgres JDBC в нужное место
  • настроил пул соединений и ресурс JDBC в консоли администратора Glassfish
  • развернуто веб-приложение, которое использует указанное соединение
  • видел результаты в моем браузере

Я пытаюсь развернуть это же приложение на AWS Elastic Beanstalk Экземпляр в GlassFish. AWS-EB использует Docker для развертывания экземпляра Glassfish. Я могу сделать только третий шаг выше (развернуть веб-приложение), и я полностью в недоумении, как сделать первые два.

Что я хотел бы сделать, это иметь веб-доступ к консоли администратора Glassfish через, Но это, похоже, не работает на любом уровне. Альтернативой было бы использовать стеклянную рыбу "asadmin" на моей локальной машине для настройки удаленной стеклянной рыбы, но я не могу этого сделать.

Как настройка экземпляра Glassfish, размещенного на AWS EB? Это вообще возможно?

Я сделал несколько замечаний, но я был бы признателен подтверждение или иначе:

  • похоже, что у AWS есть команда в их CLI под названием "asadmin", которая касается автомасштабирования и имеет то же имя, что и "asadmin", который поставляется с glassfish. Помимо того, что поиски google трудно, два, кажется, не имеют ничего общего друг с другом
  • Если я подключусь к экземпляру AWS EC2, содержащему пример Docker и Glassfish, следующие вещи происходят
    • sudo docker ps возвращает, что есть порты 4848 / tcp, 8080 / tcp, 8181 / tcp, и что ни один не сопоставлены
    • wget localhost: 8080 - соединение отклонено
    • то же самое для 8181 и 4848
    • wget localhost: 80 возвращает веб-страницу домашней страницы Glassfish
  • в том же экземпляре работает докер проверить я получаю внутренний IP-адрес (назовите его 1.2.3.4), затем на этом экземпляре EC
    • wget 1.2.3.4: 8080 (и 4848, 8181) все возвращаемые html-файлы
    • wget 1.2.3.4: 80 - соединение отклонено
  • Если я запускаю оболочку bash в контейнере docker, следующие вещи кажутся истинными
    • wget localhost: 8080 (и 4848, 8181) все возвращение хорошо сформировано страницы
    • wget localhost: 80 - соединение отклонено

поэтому, возможно, мне нужно сказать экземпляру EC2, чтобы он перешел с localhost на 1.2.3.4, но как я могу это сделать, когда балансировщик нагрузки EB масштабирует его.

любой совет был бы весьма признателен.

2 ответов


то, что следует, - это то, что работает для меня, но у меня такое чувство, что я что-то упускаю. Любые изменения/комментарии будут приветствоваться.

в развертывании EB/Docker есть различные крючки, которые позволяют выполнять крючки после развертывания в экземпляре glassfish, в контейнере docker, в экземпляре EB. Я использовал крючки после развертывания для настройки пула соединений. Вот как выглядит окончательная установка, просто для справки:

|  | |  \_WAR_/  | | |
|  | \_Glassfish_/ | |
|  \____Docker____/  |
\____EC2 Instance____/

в общий желаемый результат заключается в том, что после развертывания приложения в экземпляре Docker asadmin выполняются команды для создания пула соединений JDBC и превращения этого пула соединений в ресурс jdbc. На моей локальной машине, команды будут

asadmin create-jdbc-connection-pool 
    --datasourceclassname org.postgresql.ds.PGConnectionPoolDataSource 
    --restype javax.sql.ConnectionPoolDataSource 
    --property user=USERNAME:password=PASSWORD:serverName=DBHOST:portNumber=5432:databaseName=DBNAME 
    poolName

asadmin create-jdbc-resource --connectionpoolid poolName jdbc/dev

где "jdbc / dev" - это имя, которое код java должен знать, чтобы получить соединение обычным способом, т. е.

InitialContext ctx = new InitialContext();
ds = (DataSource)ctx.lookup("jdbc/dev");

мы хотим, чтобы команды выполнялись внутри экземпляра docker, потому что экземпляр docker имеет доступ к переменным среды, которые вы объявляете в консоли администратора AWS, поэтому я могу передавать информацию о конфигурации, не имея ее в сценариях сборки.

для достижения этого результата мы требуем, чтобы файл был создан в экземпляре EC2 во время установки, в моем случае называется /opt/elasticbeanstalk/hooks/appdeploy/post/99_configure_jdbc.sh. Этот файл будет выполняться после развертывания, как root, в экземпляре EC2. Я буду называть его ec2-post-deploy-hook.

мы собираемся создать этот файл с помощью .ebextensions/.конфигурационный файл, как описано здесь

мой .файл конфигурации имеет следующий содержание:

files:
  "/opt/elasticbeanstalk/hooks/appdeploy/post/99_configure_jdbc.sh":
    mode: "000755"
    owner: root
    group: root
    content: |
      #!/bin/bash
      date > /tmp/post 2>&1
      dockerid=`docker ps | grep latest | cut -d" " -f1`
      echo $dockerid >> /tmp/post 2>&1
      docker ps >> /tmp/post 2>&1
      docker exec $dockerid /var/app/WEB-INF/classes/setup_pool.sh >> tmp/post 2>&1

все, что после содержание: | заканчивается в ec2-post-deploy-hook.

я узнал эту идею от http://junkheap.net/blog/2013/05/20/elastic-beanstalk-post-deployment-scripts.

только последняя строка и 4-я последняя строка необходимы, но другие строки полезны для отладки. Вывод заканчивается в /tmp / post на экземпляре EC2.

один трюк в этом файле что мы всегда можем получить идентификатор контейнера Docker по

sudo docker ps | grep latest | cut -d" " -f1

потому что после развертывания будет запущен только один контейнер Docker, и в его имени будет "последний".

последняя строка ec2-post-deploy-hook использует docker для запуска внутри экземпляра docker тех команд, которые я изначально хотел запустить, то есть команды asadmin. Я развернуть файл setup_pool.sh внутри моей .файл war, поэтому он попадает в известное место во время развертывание. Мой setup_pool.sh выглядит так (и я называю это docker-post-deploy-hook):

dbuser=$PARAM1
dbpass=$PARAM2
dbhost=$PARAM3
dbname=$PARAM4

date > /tmp/setup_connections
echo '*********' >> /tmp/setup_connections
asadmin create-jdbc-connection-pool --datasourceclassname org.postgresql.ds.PGConnectionPoolDataSource --restype javax.sql.ConnectionPoolDataSource --property user=${dbuser}:password=${dbpass}:serverName=${dbhost}:portNumber=5432:databaseName=${dbname} ei-connection-pool >>   /tmp/setup_connections 2>&1
echo '*********' >> /tmp/setup_connections
asadmin create-jdbc-resource --connectionpoolid ei-connection-pool jdbc/dev >> /tmp/setup_connections 2>&1
echo '*********' >> /tmp/setup_connections

этот файл запускается в экземпляре docker. Два asadmin команды-это мясо, но опять же, есть некоторая отладка в /tmp/setup_connections в экземпляре docker

пароли и т. д. получены из среды AWS.

единственное, что я не могу сделать на данный момент, это иметь переменные среды AWS в первом развертывания. Я понятия не имею, почему, но, похоже, я могу установить их только после запуска экземпляра. Это означает, что я должен развернуть дважды, фиктивное развертывание, затем редактирование среды, а затем реальное развертывание.

Итак, подводя итоги,

  • при развертывании
    • a .файл конфигурации генерирует файл ec2-post-deploy-hook,
    • система AWS развертывает docker-post-deploy-hook как часть .война, что развернут в glassfish
  • на развертывание поста ,
    • система эластичного бобового стебля запускает ec2-post-deploy-hook
    • контроллер EC2-пост-развернуть-крючок запускает докер-пост-развернуть-крюк
    • docker-post-deploy-hook запускает asadmin для настройки соответствующих пулов соединений
  • во время выполнения код Java в веб-приложении использует пулы соединений

и все работает. Это, конечно, некрасиво, но, знаешь, я тоже.--7-->


после борьбы с этим сам на некоторое время, я думаю, что я, наконец, нашел приемлемое обходное решение (по крайней мере для меня) следующим образом :-

создайте DockerFile и упакуйте его непосредственно в WAR (на самом высоком уровне, а не в какой-либо папке). Файла Docker -

# Use the AWS Elastic Beanstalk Glassfish image
FROM        amazon/aws-eb-glassfish:4.1-jdk8-onbuild-3.5.1

# Exposes port 8080
EXPOSE      8080 4848 8181

# Install Datasource dependencies
RUN         curl -L -o /tmp/connectorj.zip https://server/path/connectorj.zip && \
            unzip /tmp/connectorj.zip -d /tmp && \
            cp /tmp/connectorj/mysql-connector-java-5.1.36-bin.jar /usr/local/glassfish4/glassfish/domains/domain1/lib/ && \
            mv /var/app/WEB-INF/classes/domain.xml /usr/local/glassfish4/glassfish/domains/domain1/config/

теперь, когда эта война развернута (я использую 'EB deploy'). Этот файл DockerFile выполняется.

в простом примере выше-первый драйвер mysql JDBC загружается и настраивается в справочник lib glassfish. Затем я упаковал домен.xml (все ресурсы и т. д. уже настроены) внутри самой войны перемещается в папку конфигурации домена glassfish для загрузки при запуске glassfish.