草庐IT

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

coder 2023-05-27 原文

我正在使用 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/

有关amazon-web-services - 如何配置在 AWS/ElasticBeanstalk/Docker 上运行的 GlassFish 实例?的更多相关文章

  1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

    我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

  2. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  3. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  4. ruby-on-rails - 如何验证 update_all 是否实际在 Rails 中更新 - 2

    给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru

  5. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

  6. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  7. ruby - 如何指定 Rack 处理程序 - 2

    Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack

  8. ruby - 如何每月在 Heroku 运行一次 Scheduler 插件? - 2

    在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/

  9. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

  10. ruby - 如何使用文字标量样式在 YAML 中转储字符串? - 2

    我有一大串格式化数据(例如JSON),我想使用Psychinruby​​同时保留格式转储到YAML。基本上,我希望JSON使用literalstyle出现在YAML中:---json:|{"page":1,"results":["item","another"],"total_pages":0}但是,当我使用YAML.dump时,它不使用文字样式。我得到这样的东西:---json:!"{\n\"page\":1,\n\"results\":[\n\"item\",\"another\"\n],\n\"total_pages\":0\n}\n"我如何告诉Psych以想要的样式转储标量?解

随机推荐