部署在 CodePipeline 中的 Laravel Elastic Beanstalk 应用程序给出 500 SERVER ERROR

Posted

技术标签:

【中文标题】部署在 CodePipeline 中的 Laravel Elastic Beanstalk 应用程序给出 500 SERVER ERROR【英文标题】:Laravel Elastic Beanstalk app deployed in CodePipeline giving 500 SERVER ERROR 【发布时间】:2021-03-28 02:20:36 【问题描述】:

我在本地创建了一个 Laravel 应用程序。 (这工作正常)

之后,使用 .zip 文件将该应用程序部署到 AWS Elastic Beanstalk。 (这工作正常)

然后,创建了一个simple pipeline using AWS CodePipeline 以从特定的 GitHub 存储库中获取数据并部署到该特定的 AWS Elastic Beanstalk 环境。我看到我对该特定存储库所做的任何推送,CodePipeline 都会部署到该特定 AWS Elastic Beanstalk 环境。

问题是实例现在有

以下近期活动

环境健康状况已从“警告”转变为“严重”。 100.0 % 请求因 HTTP 5xx 而失败。 ELB 进程不健康 在所有情况下。应用程序重新启动已在 42 秒前完成,并且 花了7秒。 ELB 运行状况失败或不适用于所有人 实例。与环境关联的一个或多个 TargetGroup 处于降低的健康状态: - awseb-AWSEB-CVIEEN5EVRFC - 警告

如果我访问它的 URL,我会得到一个

500 |服务器错误

从存储库的根目录中删除了 .zip 文件,因为这可能会导致冲突。没有解决。

检查了完整日志,但没有发现任何有用的信息。

【问题讨论】:

您能否将 CP 部署的工件/zip 下载到您的 EB 并检查它以检查它是否包含您需要的所有文件? @Marcin 如果我转到应用程序版本可以看到该版本标签,但单击源代码中除了名为S40pAMw 的文件之外没有任何内容,其中没有任何可读内容。 CP 工件中也没有任何内容 S40pAMw 可能是 zip 文件。只需添加 zip 扩展名。也可以到CP神器桶。 @Marcin 对,它是一个 .zip 文件。我可以立即看到它没有 .env 文件 @Marcin 现在可以使用了。请写作为答案,我将包括相关的额外信息+屏幕截图。 【参考方案1】:

基于 cmets。

问题是由 CodePipeline 部署的部署包/工件中缺少 .env 文件引起的。这是由于文件未提交到 GitHub 存储库引起的。

为了确定原因,检查了 CodePipeline 的工件。该工件可以在 CodePipeline 的存储桶或 EB 应用程序版本(在 Source 列中)中找到,它是一个没有扩展名的随机名称的对象。在 OP 的情况下,它是S40pAMw。需要注意的是,这个对象只是一个没有扩展名的zip文件。要检查其内容,请将扩展名添加到允许直接打开 zip 存档的下载对象。

(有关处理环境变量的替代方法,请参阅@JackPrice-Burns 答案)。

解决方案是将丢失的文件提交到存储库中。完成后,触发 CodePipeline

部署完成后,Elastic Beanstalk 实例的运行状况变为正常

和 500 | SERVER ERROR 现在消失了

【讨论】:

您不应该将 .env 或任何机密提交到 GitHub,AWS 有一种方法可以在不这样做的情况下添加环境变量。此外,您也不应该将 composer vendor 文件夹提交到 GitHub,您可以在管道中添加一个构建步骤,在将其发送到弹性 beanstalk 之前,您可以在其中运行 composer install。 @JackPrice-Burns 我不质疑架构,而是回答发布的问题 - 为什么 CP 部署不起作用。 好吧,很抱歉,但是如果有人带着类似的问题来到这个帖子,他们会看到一个回答说提交 .env(也许调整你的帖子) @JackPrice-Burns 没问题。我更新了我的答案以参考您的答案。 让我接受这个答案的另一件事是有助于发现问题的真正原因。这也可以包含在此答案中。【参考方案2】:

这个问题具体是由缺少环境变量引起的。

将 .env 或任何包含机密的文件提交到 GitHub 或任何其他源代码控制系统是不好的做法。

首先,如果该存储库以任何方式公开,那么所有机密现在也是公开的,包括数据库凭证、加密密钥、AWS 访问凭证。 其次,常见的攻击媒介是 .git 文件夹和底层源代码控制存储库。如果您的 GitHub(或其他帐户)遭到入侵,恶意用户(如果他们发现源代码控制详细信息)可能会访问您的机密。 第三,如果您想为您的代码设置多个环境,例如生产/开发/本地环境。您现在无法轻松地在每个环境的基础上更改这些环境变量,因为它们直接提交到存储库。

在 ElasticBeanstalk 控制台中,您可以转到配置 -> 软件并在页面底部添加环境变量(附屏幕截图)。这些环境变量将被 Laravel 拾取。在该设置页面上设置 .env 中的所有变量,并且不要提交 .env。

另一个要遵循的好习惯是不提交您的供应商文件夹。 AWS CodePipeline 允许您创建另一个可以构建源代码的步骤。此构建步骤可以获取您的源代码控制代码,运行 composer install(以生成供应商文件夹),然后将其发送到 Elastic Beanstalk 进行部署。

首先,提交供应商文件夹会大大增加存储库的大小以及克隆存储库所需的时间。 其次,如果您还要处理整个供应商文件夹,那么合并来自不同分支的代码可能会变得很困难,这可能会变成数千个文件和数百万行代码。 第三,如果您想跟踪每个贡献者为您的存储库实际完成了多少工作,这会变得很困难,因为如果有人提交了供应商文件夹更改,他们将提交他们没有编码的整个包自己。

【讨论】:

有一点需要注意。我无法立即将所有变量都存在于 .env 文件中。必须删除MAIL_ENCRYPTION, APP_ENV=local, PUSHER_APP_CLUSTER=mt1, DB_PORT=3306, MAIL_HOST=mailhog, PUSHER_APP_KEY=, AWS_SECRET_ACCESS_KEY=,然后才能应用更改。 不知道为什么必须删除这些环境变量,弹性beantalk不应该保留这些变量。我唯一能建议的是确保值字段没有任何不兼容的字符。您可以在 aws.training 上免费找到如何使用每个 AWS 服务(ElasticBeanstalk、CodePipeline、CodeBuild)的单独教程 也不确定,但出现了一个错误,最终包含Not a List of Key/Value pairs.

以上是关于部署在 CodePipeline 中的 Laravel Elastic Beanstalk 应用程序给出 500 SERVER ERROR的主要内容,如果未能解决你的问题,请参考以下文章

使用 AWS CDK 在 AWS Codepipeline 中部署 Python Lambda 函数

CodePipeline - 由于权限不足导致部署失败

如何停止 aws codepipeline 部署阶段

CodePipeline:ECR 源 + ECS 部署配置

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

AWS Elastic Beanstalk - CodePipeline 部署不工作 - 健康状况 - 严重