Laravel 在 CodePipeline 中部署的 Elastic Beanstalk 应用出现 500 服务器错误
Laravel Elastic Beanstalk app deployed in CodePipeline giving 500 SERVER ERROR
我在本地创建了一个 Laravel 应用程序。 (这工作正常)
之后,使用 .zip 文件将该应用程序部署到 AWS Elastic Beanstalk。 (这工作正常)
然后,创建了一个 simple pipeline using AWS CodePipeline 以从特定的 GitHub 存储库中获取数据并部署到该特定的 AWS Elastic Beanstalk 环境。我看到我对那个特定的存储库所做的任何推送,CodePipeline 都会部署到那个特定的 AWS Elastic Beanstalk 环境。
问题是实例现在有
具有以下近期事件
Environment health has transitioned from Warning to Severe. 100.0 % of
the requests are failing with HTTP 5xx. ELB processes are not healthy
on all instances. Application restart completed 42 seconds ago and
took 7 seconds. ELB health is failing or not available for all
instances. One or more TargetGroups associated with the environment
are in a reduced health state: - awseb-AWSEB-CVIEEN5EVRFC - Warning
如果我去 URL 我会得到
500 | SERVER ERROR
- 从存储库的根目录中删除了 .zip 文件,因为这可能会导致冲突。没解决。
- 检查了完整日志,但没有发现任何有用的信息。
根据评论。
问题是由 CodePipeline 部署的部署 package/artifact 中 缺少 .env
文件引起的。这是由于文件未提交到 GitHub 存储库造成的。
为了确定原因,检查了 CodePipeline 的工件。该工件可以在 CodePipeline 的存储桶或 EB 应用程序版本(在“源”列中)中找到,它是一个没有扩展名的随机名称的对象。在 OP 的例子中是 S40pAMw
。需要注意的是,这个对象只是一个没有扩展名的 zip
文件。要检查它的内容,将扩展名添加到下载对象允许直接打开 zip
存档。
(请参阅@JackPrice-Burns 的回答以了解处理环境变量的替代方法)。
解决方案 是将丢失的文件提交到存储库中。完成后,CodePipeline 被触发
部署完成后,Elastic Beanstalk 实例的运行状况变为正常
和 500 |服务器错误现在消失了
这个问题特别是由缺少环境变量引起的。
将 .env 或任何包含秘密的文件提交到 GitHub 或任何其他源代码控制系统是错误的做法。
- 首先,如果该存储库在任何方面都是 public,那么所有机密现在也是 public、数据库凭据、加密密钥、AWS 访问凭据。
- 其次,常见的攻击媒介是 .git 文件夹和底层源代码控制存储库。如果您的 GitHub(或其他帐户)遭到破坏,潜在的恶意用户(如果他们找到了源代码控制详细信息)可能会访问您的秘密。
- 第三,如果您想为代码设置多个环境,例如生产/开发/本地环境。您现在无法在每个环境的基础上轻松更改这些环境变量,因为它们直接提交到存储库。
在 ElasticBeanstalk 控制台中,您可以转到配置 -> 软件并在页面底部添加环境变量(附上屏幕截图)。这些环境变量将由 Laravel 选取。在该设置页面上设置 .env 中的所有变量,不要提交 .env。
要遵循的另一个良好做法是不提交供应商文件夹。 AWS CodePipeline 允许您创建另一个步骤来构建您的源代码。此构建步骤可以采用您的源代码控制代码,运行 composer install(以生成供应商文件夹),然后将其发送到 Elastic Beanstalk 进行部署。
- 首先,提交 vendor 文件夹会大大增加存储库的大小以及克隆存储库所需的时间。
- 其次,如果您还要处理整个供应商文件夹,那么合并来自不同分支的代码会变得很困难,因为整个供应商文件夹可能包含数千个文件和数百万行代码。
- 第三,如果您想跟踪每个贡献者为您的回购实际完成了多少工作,这会变得很困难,因为如果有人提交供应商文件夹更改,他们将提交他们没有提交的整个包'不要自己编码。
我在本地创建了一个 Laravel 应用程序。 (这工作正常)
之后,使用 .zip 文件将该应用程序部署到 AWS Elastic Beanstalk。 (这工作正常)
然后,创建了一个 simple pipeline using AWS CodePipeline 以从特定的 GitHub 存储库中获取数据并部署到该特定的 AWS Elastic Beanstalk 环境。我看到我对那个特定的存储库所做的任何推送,CodePipeline 都会部署到那个特定的 AWS Elastic Beanstalk 环境。
问题是实例现在有
具有以下近期事件
Environment health has transitioned from Warning to Severe. 100.0 % of the requests are failing with HTTP 5xx. ELB processes are not healthy on all instances. Application restart completed 42 seconds ago and took 7 seconds. ELB health is failing or not available for all instances. One or more TargetGroups associated with the environment are in a reduced health state: - awseb-AWSEB-CVIEEN5EVRFC - Warning
如果我去 URL 我会得到
500 | SERVER ERROR
- 从存储库的根目录中删除了 .zip 文件,因为这可能会导致冲突。没解决。
- 检查了完整日志,但没有发现任何有用的信息。
根据评论。
问题是由 CodePipeline 部署的部署 package/artifact 中 缺少 .env
文件引起的。这是由于文件未提交到 GitHub 存储库造成的。
为了确定原因,检查了 CodePipeline 的工件。该工件可以在 CodePipeline 的存储桶或 EB 应用程序版本(在“源”列中)中找到,它是一个没有扩展名的随机名称的对象。在 OP 的例子中是 S40pAMw
。需要注意的是,这个对象只是一个没有扩展名的 zip
文件。要检查它的内容,将扩展名添加到下载对象允许直接打开 zip
存档。
(请参阅@JackPrice-Burns 的回答以了解处理环境变量的替代方法)。
解决方案 是将丢失的文件提交到存储库中。完成后,CodePipeline 被触发
部署完成后,Elastic Beanstalk 实例的运行状况变为正常
和 500 |服务器错误现在消失了
这个问题特别是由缺少环境变量引起的。
将 .env 或任何包含秘密的文件提交到 GitHub 或任何其他源代码控制系统是错误的做法。
- 首先,如果该存储库在任何方面都是 public,那么所有机密现在也是 public、数据库凭据、加密密钥、AWS 访问凭据。
- 其次,常见的攻击媒介是 .git 文件夹和底层源代码控制存储库。如果您的 GitHub(或其他帐户)遭到破坏,潜在的恶意用户(如果他们找到了源代码控制详细信息)可能会访问您的秘密。
- 第三,如果您想为代码设置多个环境,例如生产/开发/本地环境。您现在无法在每个环境的基础上轻松更改这些环境变量,因为它们直接提交到存储库。
在 ElasticBeanstalk 控制台中,您可以转到配置 -> 软件并在页面底部添加环境变量(附上屏幕截图)。这些环境变量将由 Laravel 选取。在该设置页面上设置 .env 中的所有变量,不要提交 .env。
要遵循的另一个良好做法是不提交供应商文件夹。 AWS CodePipeline 允许您创建另一个步骤来构建您的源代码。此构建步骤可以采用您的源代码控制代码,运行 composer install(以生成供应商文件夹),然后将其发送到 Elastic Beanstalk 进行部署。
- 首先,提交 vendor 文件夹会大大增加存储库的大小以及克隆存储库所需的时间。
- 其次,如果您还要处理整个供应商文件夹,那么合并来自不同分支的代码会变得很困难,因为整个供应商文件夹可能包含数千个文件和数百万行代码。
- 第三,如果您想跟踪每个贡献者为您的回购实际完成了多少工作,这会变得很困难,因为如果有人提交供应商文件夹更改,他们将提交他们没有提交的整个包'不要自己编码。