Amazon web services AWS代码管道成功,但未正确部署到Elastic Beanstalk

Amazon web services AWS代码管道成功,但未正确部署到Elastic Beanstalk,amazon-web-services,amazon-elastic-beanstalk,aws-codepipeline,aws-codebuild,Amazon Web Services,Amazon Elastic Beanstalk,Aws Codepipeline,Aws Codebuild,将WAR文件(成功)部署到Elastic Beanstalk后,我在调用应用程序URL时找到了一个404。我可以在/var/lib/tomcat8/webapps/ROOT/中看到application.war文件,而不是META-INF和WEB-INF文件,当我手动部署时,它们就在那里 当我从S3中提取WAR文件并手动将其部署到Elastic Beanstalk时,它就像一个符咒。注意:这与我的管道中的CodeBuild生成的WAR文件相同。更好的是,如果我将文件安全复制(scp)到本地计算机

将WAR文件(成功)部署到Elastic Beanstalk后,我在调用应用程序URL时找到了一个404。我可以在/var/lib/tomcat8/webapps/ROOT/中看到application.war文件,而不是META-INF和WEB-INF文件,当我手动部署时,它们就在那里

当我从S3中提取WAR文件并手动将其部署到Elastic Beanstalk时,它就像一个符咒。注意:这与我的管道中的CodeBuild生成的WAR文件相同。更好的是,如果我将文件安全复制(scp)到本地计算机并将其上载到Elastic Beanstalk,它也可以工作

似乎在部署之前一切都正常,一个工作的WAR文件甚至被部署到Elastic Beanstalk

通过查看
eb activity.log
,我可以看到它识别WAR文件,并将其从临时目录部署到
/var/lib/tomcat8/webapps/ROOT
,但它没有解压缩,容器/webserver也没有重新启动


如何使用CodePipeline正确部署WAR文件?

我试图复制您面临的问题。我认为在创建“war”文件时,您将包含“META-INF”和“WEB-INF”文件夹的文件夹作为“war”输出文件的根


相反,您应该将所有文件(在上面的文件夹中)放在“war”文件中,而不放在根级文件夹中。

近三年后,AWS代码管道似乎还不是“war文件部署友好型”的。正如标准Elastic Beanstalk部署过程在评论中指出的,它不会解压缩war文件,也不会真正部署任何东西。CodePipeline报告成功,因为复制文件时没有错误,但Tomcat不会解压缩war文件

解决方案是以分解形式(已经解压)提供您的工件。为此,请修改CodeBuild buildspec.yml的构建后阶段和工件定义:

version: 0.2

phases:
    install:
        runtime-versions:
            java: openjdk8
    pre_build:
        commands:
            - echo CODEBUILD_RESOLVED_SOURCE_VERSION $CODEBUILD_RESOLVED_SOURCE_VERSION
    build:
        commands:
            - mvn compile
    post_build:
        commands:
            - mvn package
            - mkdir artifact    <-- create folder to extract war file content
            - unzip target/my.war -d artifact/    <-- unzip to that folder
artifacts:
    files:
        - artifact/**/*   <-- reference all those files as the artifact
    name: artifact
cache:
    paths:
        - '/root/.m2/**/*'
版本:0.2
阶段:
安装:
运行时版本:
java:openjdk8
预构建:
命令:
-echo代码生成\解析\源\版本$code生成\解析\源\版本
建造:
命令:
-mvn编译
后期构建:
命令:
-mvn包

-mkdir工件我也为此挣扎了一段时间。最后,我能够通过让buildspec.yml从post_build部分的构建war文件中提取WEB-INF目录来解决这个问题

因为AWS在您的工件周围放置了一个zip包装,所以它在elasticbeanstalk实际需要的东西周围添加了另一个文件夹级别

version: 0.2

phases:
  install:
    runtime-versions:
      java: corretto11
  build:
    commands:
       - mvn compile
  post_build:
    commands:
      - mvn package
      - mkdir artifact
      - unzip target/demo-0.0.1-SNAPSHOT.war -d artifact/
      - mv artifact/WEB-INF WEB-INF
artifacts:
  files:
   - WEB-INF/**/*
  name: artifact 

我以为战争档案有问题。然而,当我从S3(由CodeBuild生成)下载WAR文件并手动将其部署到Elastic Beanstalk时,它就工作了。我也有同样的问题,并在AWS论坛上询问为什么WAR没有被“解压缩”就放在根文件夹中: