在 AWS Elastic Beanstalk 上运行 Laravel 的迁移命令

Posted

技术标签:

【中文标题】在 AWS Elastic Beanstalk 上运行 Laravel 的迁移命令【英文标题】:Running Laravel's migration command on AWS Elastic Beanstalk 【发布时间】:2019-04-23 11:53:52 【问题描述】:

我很难在 AWS Elastic Beanstalk 上部署 Laravel 应用程序以进行测试。 关注了我可以在网络上找到的所有资源,包括 AWS 文档。

只要我不包含.ebextensions.yaml 文件,创建一个Elastic Beanstalk 环境并上传应用程序就很简单。

根据Maximilian's 教程,我在.ebextensions 中创建了init.config 文件,内容如下:

container_commands:
    01initdb:
        command: "php artisan migrate"

环境在完成更新时进入降级状态,我得到以下日志:

[2018-11-20T23:14:08.485Z] INFO  [7969]  : Command processor returning results: 
"status":"FAILURE","api_version":"1.0","results":["status":"FAILURE","msg":"(TRUNCATED)...y exists\")\n/var/app/ondeck/vendor/laravel/framework/src/Illuminate/Database/Connection.php:458\n\n2   PDOStatement::execute()\n/var/app/ondeck/vendor/laravel/framework/src/Illuminate/Database/Connection.php:458\n\nPlease use the argument -v to see more details. \ncontainer_command 01initdb in .ebextensions/init.config failed. For more detail, check /var/log/eb-activity.log using console or EB CLI","returncode":1,"events":[]],"truncated":"true"

我一直在尝试来自其他指令资源的不同 .config 文件,但它们似乎都不起作用。

我正在跑步: Laravel 框架 5.7.5 EB 平台使用在 64 位 Amazon Linux/2.8.4 上运行的 PHP 7.2 RDS 使用 mysql 5.6.40

我真的不知道发生了什么,如果您能提出任何建议,我将不胜感激。

【问题讨论】:

您能否使用控制台查看有关/var/log/eb-activity.log 中错误的更多详细信息?看起来它正在运行迁移,但它可能是运行时发生的数据库错误。 【参考方案1】:

我终于找到了出路。为遇到相同问题的任何人提供一些文档。

我想做什么......

我的主要目标是在实时 AWS Elastic Beanstalk (EB) 服务器上测试 Laravel 5.7 应用程序。我还需要一种使用 phpMyAdmin 可视化数据的方法,这是一个适合我需要的工具。这是一个非常简单的 CRUD 应用程序,仅用于学习这两种技术的基础知识。

我做了什么(工作)

遵循主要使用 Web 控制台创建 EB 应用程序的正常工作流程。

    为应用命名 选择 PHP 作为平台 从基础应用开始(暂时不要上传代码) 点击配置更多选项 在安全卡中选择您的密钥对并保存。 (这对于您的服务器上的 SSH 很有价值) 在数据库中,卡创建了一个 RDS 实例。选择适合您需要的任何选项并设置用户名/密码。 创建环境。

一段时间后,您应该在应用环境中拥有 EB 创建的所有资源(EC2 和 RDS 实例、安全组、EIP、Bucket 等)。

准备 Laravel 应用程序是一个简单的过程。您一定不要忘记更改 config/database.php 以读取服务器变量。我的方法是在文件开头定义它们。

问题的主要来源在于配置您的服务器实例以包含您的应用和特定需求所需的所有软件和配置。这是通过在.ebextensions 文件夹中包含一个.yaml 文件来完成的。此文件夹应位于 Laravel 应用程序的根目录中。在向 EB 提交另一个应用程序版本之前,check your syntax 也是一个好主意。根据我的需要,我使用了this script,它基本上在我部署新版本时安装了 phpMyAdmin。特别是对于这个启动脚本,应该定义环境变量,即$PMA_VER, $PMA_USERNAME, $PMA_PASSWORD 以便phpMyAdmin 工作。您可以在 EB 配置页面的软件选项卡中创建更多环境变量。阅读文档。

另一个可能导致在启动时使用 YAML 脚本(特别是迁移)运行命令时出现问题的细节是由 Laravel 和 MySql 版本引起的。例如,我使用的是 Laravel 5.7,EB RDS 创建向导中的默认 MySQL 版本选项类似于 5.6.x。这将引发type 的问题:

  Illuminate\Database\QueryException  : SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes (SQL: alter table `users` add unique `users_email_unique`(`email`))

如果这是您的情况,尽管您应该已经有 googled 并整理出将代码行 Schema::defaultStringLength(191); 添加到 app/Providers/AppServiceProviders.php 文件的引导函数中会成功的。

您可以通过脚本进行典型的迁移:

container_commands: 
  01_drop_tables:
    command:
      "php artisan migrate:fresh"

  02_initdb:
    command: 
      "php artisan migrate"

这将删除现有表以避免冲突并根据您的代码创建一个新表。您可以通过 SSH 和获取 /var/log/eb-activity.log 的内容从您的服务器读取更多日志。

【讨论】:

以上是关于在 AWS Elastic Beanstalk 上运行 Laravel 的迁移命令的主要内容,如果未能解决你的问题,请参考以下文章

在 AWS Elastic Beanstalk 上扩展 Magento

如何在 AWS Elastic Beanstalk 上设置 HTTPS

如何在 AWS Elastic Beanstalk 上设置 HTTPS

在 AWS Elastic Beanstalk 上运行节点和反应

如何使用 aws cli 在 Elastic Beanstalk 上上传和部署?

在aws elastic beanstalk上上传文件?