【问题标题】:AWS ElasticBeanstalk Play Framework 2.8.8 deployment issue with CheckProcfileForJavaApplicationCheckProcfileForJavaApplication 的 AWS ElasticBeanstalk Play Framework 2.8.8 部署问题
【发布时间】:2021-12-14 23:24:38
【问题描述】:

尝试使用 ELB 容器部署基于 Play 框架的应用程序

最近,AWS 似乎对 ELB 的工作方式进行了更改,就像我们之前所做的那样,没有问题。

我们目前得到的错误是:

2021/12/14 23:00:15.705423 [INFO] Executing instruction: CheckProcfileForJavaApplication
2021/12/14 23:00:15.705468 [ERROR] An error occurred during execution of command [app-deploy] - [CheckProcfileForJavaApplication]. Stop running the command. Error: there is no Procfile and no .jar file at root level of your source bundle 
2021/12/14 23:00:15.705474 [INFO] Executing cleanup logic
2021/12/14 23:00:15.705598 [INFO] CommandService Response: {"status":"FAILURE","api_version":"1.0","results":[{"status":"FAILURE","msg":"Engine execution has encountered an error.","returncode":1,"events":[{"msg":"Instance deployment failed. For details, see 'eb-engine.log'.","timestamp":1639522815,"severity":"ERROR"}]}]}

如果这是实际问题,我当然不会在这里

# cd /var/app/staging/server-xxxxxxxxxxx/
# ls -l 
total 16
-rw-r--r-- 1 webapp webapp  135 Dec 14 20:39 Procfile
drwxr-xr-x 2 webapp webapp   82 Dec 14 22:21 bin
drwxr-xr-x 2 webapp webapp  113 Dec 14 22:21 conf
drwxr-xr-x 2 webapp webapp 8192 Dec 14 22:21 lib
drwxr-xr-x 3 webapp webapp   17 Dec 14 22:21 share

所以 Procfile 存在

嗯,它有效吗?

让我们检查一下:

# cat Procfile 
web:  bin/server -v -J-Xms512M -J-Xmx2048m -J-server -Dhttp.port=5000 -Dhttps.port=8443 -Dconfig.resource=application.conf

看起来很正常——但它真的有效吗?

简短的回答是肯定的——如果我复制并粘贴该命令(当然减去“web:”前缀)系统就会出现没有任何问题(但 ELB 仍然没有意识到......)

我尝试了一些命令变体,认为它可能与更严格的正则表达式 ^[A-Za-z0-9_-]+:\s*[^\s].*$ 的 yaml 格式有关(来源:https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/platforms-linux-extend.html

web:  bin/server
web:  ./bin/server
web: bin/server
web: ./bin/server
web:bin/server
web:./bin/server

没有区别(在没有或没有前导 ./ btw 的情况下手动启动时两者都有效)

不确定我将如何前进?

我们如何找到真正的问题,以便我们有机会解决它?

是的——上面的初始跟踪已经是eb-engine.log的输出

使用(如果这是相关的)

  • Coretto Java 11
  • 播放 2.8.8
  • Scala 2.13.6
  • SBT 1.5.2

将回答任何有助于改进此问题的相关问题以及解决问题的任何机会。 我挖掘的大多数 Google 搜索都与其他环境相关,只是缺少 Procfile...

【问题讨论】:

  • 我暗自怀疑编写CheckProcfileForJavaApplication 例程的人会在Procifle 中的那一行字面上检查Java。当然,Play Framework 使用了一个中间启动器,该启动器随后调用 Java。我们的 GitHub 日志显示我们至少从 2015 年中期开始就成功使用了上述技术,所以这对 AWS 来说是“新”的。
  • 从字面上理解最初的错误:Error: there is no Procfile AND no .jar file at root level 我创建了一个dummy.jar 并将其放在 dist[ribution] 文件夹的根目录下,以防万一我们越过了目标。再次没有这样的运气......
  • 我已经制定了一个解决方法,并在我通过一些正常的 ELB 操作确认它运行稳定后将其发布。

标签: java amazon-web-services scala playframework amazon-elb


【解决方案1】:

我已经制定了以下解决方法,以便能够直接在 AWS ELB Java 容器中使用标准(稍作修改)Play Framework dist

我们从典型的sbt dist 进程开始创建一个zip“分发”文件

该文件无法以当前的格式工作(我一直在研究,我将提出具体问题,看看是否可以直接使其工作)但是只需要进行一些小的调整即可它可以工作

第一步:修改Procfile(您手动创建并放置在项目的dist目录中的文件)如下:

   web: chmod 700 bin/server; bin/server -v -J-Xms512M -J-Xmx2048m -J-server -Dpidfile.path=/dev/null -Dhttp.port=5000 -Dconfig.resource=application.conf

注意chmod 700 bin/server;,这是完成这项工作所需的最后秘诀!我有点震惊,它确实有效。我认为这不会超过他们用来解析Procfile的正则表达式

由于 zip 文件与权限无关,一旦我终于通过 elb 安装过程克服了第一个“缺少 jar”的障碍,我注意到 bin/server 上的权限只是 rw。 ec2 实例的/var/log/eb-engine.log 并没有清楚地说明这一点,但是我确认每当我手动修改这些权限(在 ec2 实例上)然后运行bin/server 命令(以验证它)时,Play 服务器都会正确启动离开(但是 elb 容器仍然未能将其视为合法进程并继续将其报告为无数据状态,也不允许负载均衡器向其发送流量,因此此“修复”是在黑暗中的真实镜头! )

第二步:解压缩该 zip 文件并 cd 到它创建/分配的目录中

   cd server-vxxxxxxxxxxxxxx 
   touch placeholder.jar 

第二个秘诀是placeholder.jar 文件只是满足CheckProcfileForJavaApplication 的一种方法,它只是在捆绑目录的根目录中查找任何名为*.jar 的文件的存在。如果该文件不存在,则 elb 安装脚本将停止运行。

注意:如果您愿意,您可以简单地将这个空的 placeholder.jar 文件放在 Play dist 文件夹中

第三步:新建一个zip文件elb.zip

   zip --exclude share/doc/api/\* -r elb.zip . 

现在将 elb.zip 上传到 AWS ELB 容器,然后瞧瞧它(终于)复活了!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-16
    • 2014-03-02
    • 1970-01-01
    • 2016-09-05
    • 2020-07-01
    • 2017-08-02
    • 1970-01-01
    相关资源
    最近更新 更多