如何使用外部 RDS 数据库在 AWS Elastic Beanstalk 中设置 Laravel 应用程序

Posted

技术标签:

【中文标题】如何使用外部 RDS 数据库在 AWS Elastic Beanstalk 中设置 Laravel 应用程序【英文标题】:How to setup Laravel application in AWS Elastic Beanstalk using external RDS database 【发布时间】:2020-06-14 06:12:47 【问题描述】:

我想开始将我的 laravel 应用部署到生产环境。为了避免在不久的将来更改 AWS 配置,我决定尝试添加持续集成。为此,我使用弹性 beanstalk 并使用另一个 AWS 工具将代码推送到那里。这一切都完美无缺。我在 /public/index.php 中放置了一条测试消息以输出“hello world”,它在访问 URL 时按预期工作。当我删除此文本并正常运行我的 laravel 应用程序时,我收到 500 内部服务器错误。我不确定弹性 beantalk 在部署 laravel 应用程序时所做的一切。因此,我不确定此错误是否是由于数据库连接错误或 laravel 应用程序尚未完全设置引起的。

我在弹性 beanstalk 之外创建了一个 RDS 数据库实例。我可以从 sequel pro 访问它,并添加了用于存储所有数据的数据库。我将所有必要的数据库连接值(主机、端口、数据库、用户名、密码)添加到 /config/database.php 和弹性 beanstalk 服务器配置环境变量。

我在网上搜索了几天的信息,但没有找到任何具体的信息。我的问题还有一部分是对在 beanstalk 中部署期间如何设置 laravel 缺乏了解。 /.ebextensions 有什么东西可以帮助我实现这些目标吗?

当我部署我的代码时,我需要确保所有供应商文件都通过 composer 安装,然后我还需要确保所有数据库迁移/更改都发生。我想自动化尽可能多的步骤,这样我就可以推送代码更改,服务器将更改代码并继续工作。

我还想确保在设置数据库连接时没有遗漏任何东西。我需要在 laravel 中设置其他文件还是需要配置弹性 beanstalk 中的其他文件?我保持我的数据库对所有连接开放,然后我可以稍后收紧限制

编辑:我的数据库可能尚未正确配置,但这似乎不是问题的根源。我认为我的问题是知道哪些脚本以及如何在部署期间运行它们。我想确保运行 composer 和 php artisan migrate 以使所有内容保持最新。我怎样才能用弹性豆茎做到这一点?

【问题讨论】:

如果您有外部RDS,您需要为其确保正确的安全组。如果你这样做了,从你的描述中不确定。您可以随时 ssh 到弹性 beanstalk 实例,并从内部检查 RDS 和其他人员是否工作。 @Marcin 我确保外部 RDS 对所有公众开放,因此这不是权限问题。另外,我刚刚注意到当数据库未连接时,我的生产站点不会给出 500 错误。在需要 db 之前,它将显示页面并且不会显示任何问题。 应用程序似乎崩溃了。我认为您必须查看日志。 EB 可以向您显示来自应用程序的日志,或者只需 ssh 到实例并查看那里。 @Marcin 我查看了日志没有运气,但这次我在运行命令 01_drop_tables 时看到错误“连接超时”。由于它已超时,我猜您对未正确设置 RDS 的第一个猜测是正确的。因为我的安全组允许所有入站和出站请求,所以我认为权限不是问题。我不确定解决这个问题的最佳方法 显然有些东西阻塞了连接。 RDS 是否在同一子网或 vpc 中? RDS 子网 NACL 呢?也许它是非默认的并阻止连接? 【参考方案1】:

这有点离题,但根据我的经验,我不建议使用 beanstalk 来实现良好的工作流推送和部署。我建议 您可以使用 Forgelaravel.com 来部署您的 GitHub 存储库。在 forge Laravel 中,您将能够从 AWS 创建一个服务器,它会自动创建数据库连接和东西,然后只需单击一下,您就可以部署到服务器并保持良好的工作流程。

【讨论】:

感谢您的意见。如果我无法完成这项工作,这就是我计划研究的内容,但我需要将我的 RDS 实例与 beanstalk 环境分开,所以我认为我仍然会面临连接到我的外部 RDS 实例的问题【参考方案2】:

鉴于我们说的是 Laravel 应用程序,这个 500 服务器错误

通常在创建新的基础架构时发生。为什么?可能会忘记将环境变量添加到 EB 环境中。

只需转到那个 EB 环境配置,然后在软件下修改以至少包含以下环境属性

APP_DEBUG(可以是,例如,假) APP_KEY(这是php artisan key:generate生成的密钥) APP_NAME (tiagoPeres)

那么问题就解决了。

【讨论】:

以上是关于如何使用外部 RDS 数据库在 AWS Elastic Beanstalk 中设置 Laravel 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

如何修复AWS DMS到RDS的连接错误?

aws rds proxy参数

如何配置从 Vanilla Postgresql 9.6 DB 到 AWS RDS Postgresql 的流复制

如何使用 mySQL 工作台连接到 AWS 私有子网 VPC 中的 RDS

如何在数据加载之前截断 AWS Glue 作业中的 RDS 表?

如何连接mysql数据库(AWS下的RDS实例)