gpt4 book ai didi

amazon-web-services - 如何配置在 AWS/ElasticBeanstalk/Docker 上运行的 GlassFish 实例?

转载 作者:IT老高 更新时间:2023-10-28 21:22:31 25 4
gpt4 key购买 nike

我正在使用 GlassFish 来提供 Java EE Web 应用程序。在我的本地开发机器上一切正常。我有

  • 将 postgres JDBC 库复制到正确的位置
  • 在 Glassfish 管理控制台中配置了连接池和 JDBC 资源
  • 部署了一个使用上述连接的网络应用
  • 在我的浏览器中查看结果

我正在尝试将相同的应用程序部署到 AWS Elastic Beanstalk 托管的 Glassfish 实例。 AWS-EB 使用 Docker 部署 Glassfish 实例。我只能做上面的第三步(部署一个网络应用程序),完全不知道如何做前两步。

我想做的是通过网络访问 Glassfish 管理控制台,但这似乎在任何级别都不起作用。另一种方法是在我的本地机器上使用 Glassfish “asadmin”来配置远程 Glassfish ,但我也无法做到这一点。

如何配置托管在 AWS EB 上的 Glassfish 实例?甚至可能吗?

我已经做了一些观察,但我希望得到确认或其他情况:

  • AWS 的 CLI 中似乎有一个名为“asadmin”的命令,该命令与自动缩放有关,并且与 glassfish 附带的“asadmin”同名。除了让谷歌搜索困难之外,这两者似乎没有任何关系
  • 如果我连接到包含 Docker 和 Glassfish 实例的 AWS EC2 实例,会发生以下情况
    • sudo docker ps 返回有端口 4848/tcp、8080/tcp、8181/tcp,并且没有映射
    • wget localhost:8080 - 连接被拒绝
    • 8181 和 4848 相同
    • wget localhost:80 返回 Glassfish 主页的网页
  • 在运行 docker inspect 的同一实例中,我得到一个内部 IP 地址(称为 1.2.3.4),然后在该 EC 实例上
    • wget 1.2.3.4:8080(和4848、8181)都返回html文件
    • wget 1.2.3.4:80 - 连接被拒绝
  • 如果我在 docker 容器中运行 bash shell,以下情况似乎是正确的
    • wget localhost:8080(和 4848、8181)都返回格式良好的页面
    • wget localhost:80 - 连接被拒绝

所以也许我需要告诉 EC2 实例从 localhost 转发到 1.2.3.4,但是当 EB 负载均衡器向外扩展时,我怎样才能做到这一点。

任何建议将不胜感激。

最佳答案

接下来的内容对我有用 - 但我觉得我错过了一些东西。欢迎任何编辑/评论。

EB/Docker 部署中有各种 Hook ,允许在 glassfish 实例、docker 容器和 EB 实例中运行部署后 Hook 。我使用部署后 Hook 来设置连接池。这是最终安装的样子,仅供引用:

|  | |  \_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。该文件将在 EC2 实例中以 root 身份在部署后执行。我将其称为 ec2-post-deploy-hook

我们将使用 .ebextensions/.config 文件创建该文件,如此处所述

我的 .config 文件有以下内容:

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

content: | 之后的所有内容都在 ec2-post-deploy-hook 中结束。

我从 http://junkheap.net/blog/2013/05/20/elastic-beanstalk-post-deployment-scripts 那里学到了这个想法.

只需要最后一行和倒数第四行,但其他行对调试很有用。输出在 EC2 实例上的/tmp/post 中结束。

该文件中的一个技巧是我们总是可以通过

获取 docker 容器的 ID
sudo docker ps | grep latest | cut -d" " -f1

因为部署后只会运行一个 Docker 容器,并且它的名称中会带有“latest”。

ec2-post-deploy-hook 的最后一行使用 docker 在 docker 实例中运行我最初想要运行的那些命令 - 即 asadmin 命令。我在我的 .war 文件中部署了一个名为 setup_pool.sh 的文件,因此在部署期间它最终位于一个已知位置。我的 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 命令很重要,但同样,在 docker 实例中对/tmp/setup_connections 进行了一些调试

密码等都是从AWS环境中获取的。

此时我唯一不能做的就是让 AWS 环境变量在首次部署时可用。我不知道为什么,但我似乎只能在实例启动并运行后设置它们。这意味着我必须部署两次,一次是虚拟部署,然后是编辑环境,然后是真正的部署。

所以,总结一下,

  • 部署时
    • .config 文件生成 ec2-post-deploy-hook 文件,
    • AWS 系统将 docker-post-deploy-hook 作为部署到 glassfish 的 .war 的一部分进行部署
  • 在部署后,
    • 弹性 beanstalk 系统运行 ec2-post-deploy-hook
    • ec2-post-deploy-hook 运行 docker-post-deploy-hook
    • docker-post-deploy-hook 以管理员身份运行以设置适当的连接池
  • 在运行时,网络应用中的 Java 代码会使用连接池

这一切都有效。看起来有点难看,但是,你知道,我也是。

关于amazon-web-services - 如何配置在 AWS/ElasticBeanstalk/Docker 上运行的 GlassFish 实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27351833/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com