如何配置 AWS CodePipeline、CodeBuild 和 Elastic Beanstalk 以正确部署 Laravel 8 应用程序?

Posted

技术标签:

【中文标题】如何配置 AWS CodePipeline、CodeBuild 和 Elastic Beanstalk 以正确部署 Laravel 8 应用程序?【英文标题】:How do I configure AWS CodePipeline, CodeBuild, and Elastic Beanstalk to deploy a Laravel 8 application correctly? 【发布时间】:2021-11-20 06:26:31 【问题描述】:

我似乎无法找出 3 项服务的正确设置来完成这项工作。我有一个 Laravel 8 应用程序,它通过 Github 推送触发 AWS CodePipeline,该应用程序使用 CodePipeline 构建应用程序并将其部署到 Elastic Beanstalk。

一切都成功构建和部署,但是当我在浏览器中访问应用程序端点时(打开调试),我得到:

意外值异常 “/codebuild/output/src078727356/src/storage/logs”中没有现有目录,无法创建:权限被拒绝

我的 CodeBuild buildspec 是:

version: 0.2
phases:
   install:
     runtime-versions:
         php: 7.4
         nodejs: 12.x
     commands:
         - apt-get update -y
         - apt-get install -y libpq-dev libzip-dev
         - apt-get install -y php-pgsql
         - curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
         - chown -R www-data:www-data $CODEBUILD_SRC_DIR/storage
         - chmod -R 755 $CODEBUILD_SRC_DIR/storage
   pre_build:
     commands:
         - cp .env.staging .env
         - composer install
         - npm install
   build:
     commands:
         - pwd
         - ls -l
         - ls -l ./storage
         - ls -l ./storage/logs
         - npm run production
         - php artisan migrate --force
         - php artisan db:seed
         - php artisan route:clear
         - php artisan config:clear
         - php artisan cache:clear
   post_build:
     commands:
         - printenv
artifacts:
   files:
         - '**/*'
   name: $(date +%Y-%m-%dT%H:%M:%S).zip
proxy:
   upload-artifacts: yes
   logs: yes

您可以看到build 部分中有一些调试命令,它们确认确实有一个目录错误表明它们不是:

[Container] 2021/09/27 22:54:11 Running command ls -l
727 total 688
728 -rw-rw-r--   1 root     root        174 Sep 27 22:34 README.md
729 drwxr-xr-x   7 root     root       4096 Sep 27 22:53 app
730 -rwxrwxr-x   1 root     root       1686 Sep 27 22:34 artisan
731 drwxr-xr-x   3 root     root       4096 Sep 27 22:53 bootstrap
732 -rw-rw-r--   1 root     root       1735 Sep 27 22:34 composer.json
733 -rw-r--r--   1 root     root     285508 Sep 27 22:53 composer.lock
734 drwxr-xr-x   2 root     root       4096 Sep 27 22:53 config
735 drwxr-xr-x   5 root     root       4096 Sep 27 22:53 database
736 drwxr-xr-x 529 root     root      20480 Sep 27 22:54 node_modules
737 -rw-r--r--   1 root     root     323761 Sep 27 22:54 package-lock.json
738 -rw-rw-r--   1 root     root        473 Sep 27 22:34 package.json
739 -rw-rw-r--   1 root     root       1202 Sep 27 22:34 phpunit.xml
740 drwxr-xr-x   2 root     root       4096 Sep 27 22:53 public
741 drwxr-xr-x   6 root     root       4096 Sep 27 22:53 resources
742 drwxr-xr-x   2 root     root       4096 Sep 27 22:53 routes
743 -rw-rw-r--   1 root     root        563 Sep 27 22:34 server.php
744 drwxr-xr-x   5 www-data www-data   4096 Sep 27 22:53 storage
745 drwxr-xr-x   4 root     root       4096 Sep 27 22:53 tests
746 drwxr-xr-x  44 root     root       4096 Sep 27 22:53 vendor
747 -rw-rw-r--   1 root     root        559 Sep 27 22:34 webpack.mix.js
748 
749 [Container] 2021/09/27 22:54:11 Running command ls -l ./storage
750 total 12
751 drwxr-xr-x 3 www-data www-data 4096 Sep 27 22:53 app
752 drwxr-xr-x 6 www-data www-data 4096 Sep 27 22:53 framework
753 drwxrwxrwx 2 www-data www-data 4096 Sep 27 22:53 logs
754 
755 [Container] 2021/09/27 22:54:11 Running command ls -l ./storage/logs
756 total 0

您甚至可以看到logs/ 目录在该日志 sn-p 中是可写的777(根据buildspec 将其改回755)。

更新

根据第一条评论,我查看了 EB 实例以进一步调查,看起来它使用 CodeBuild 路径进行日志记录和存储(以及基本上所有其他内容),即使应用程序用完 @987654329 @ 在 EB 实例中。我要么需要告诉 Laravel 它在哪里,要么在 CodeBuild 中的同一 /var/app/current 目录中构建它,或者其他什么?

【问题讨论】:

您能否通过 ssh 进入您的 EB 实例并手动验证发生了什么? /var/app 中的应用程序是否正确安装?你能手动让它工作吗? 我刚刚检查了 EB 实例并找到了问题的根源:CodeBuild 在 /codebuild/output/src078727356/src 中构建应用程序,然后将其交给 EB。 EB 将其部署到 /var/app/current 但 Laravel 仍然使用构建期间创建的路径。如何告诉 Laravel 新的工作路径? 遗憾的是我对laravel不太熟悉,所以不知道该换谁的路径。 【参考方案1】:

好的,经过更多的反复试验,我想通了。正如 cmets 和更新所说,我意识到构建的人工制品正在按原样部署到 beantalk 中,其中 CodeBuild 环境已烧入代码中。为了解决这个问题,我不得不配置 beanstalk 环境以独立获取它的环境变量,因为我错误地认为 CodeBuild 中设置的环境变量会继承。

【讨论】:

以上是关于如何配置 AWS CodePipeline、CodeBuild 和 Elastic Beanstalk 以正确部署 Laravel 8 应用程序?的主要内容,如果未能解决你的问题,请参考以下文章

AWS CodePipeline:如何使 CodeBuild 构建的 ECR 映像作为剩余阶段的工件?

AWS CloudFormation CodePipeline:无法从 GitHub 获取存储库的内容

通过 AWS CodePipeline 构建 Docker 映像时 HTTPS 失败

如何使用 AWS CodeDeploy/CodePipeline/S3 将 Gitlab-Ci 部署到 EC2

由于权限错误,无法在 AWS CodePipeline 中完成部署阶段

AWS:帮助在 Codepipeline 中设置 CodeDeploy