Laravel 命令在 AWS EC2 上由 Cron 执行时返回不同的输出

Posted

技术标签:

【中文标题】Laravel 命令在 AWS EC2 上由 Cron 执行时返回不同的输出【英文标题】:Laravel Command returning different output when executed by Cron on AWS EC2 【发布时间】:2019-02-21 14:24:48 【问题描述】:

我在 Elastic Beanstalk 环境中的 EC2 实例中的 cron 作业遇到了一些问题。

当我连接到 EC2 实例并从终端输入 php artisan command:backup_logs 时,作业运行顺利,一切正常。 而当作业通过 cron * * * * * /usr/bin/php /var/app/current/artisan command:backup_logs 运行时,它会在日志中返回以下错误:

[2018-09-17 16:14:01] production.ERROR: Missing required client configuration options:

region: (string)

  A "region" configuration value is required for the "s3" service

  (e.g., "us-west-2"). A list of available public regions and endpoints can be
  found at http://docs.aws.amazon.com/general/latest/gr/rande.html. "exception":"[object] (InvalidArgumentException(code: 0): Missing required client configuration options:

region: (string)

  A \"region\" configuration value is required for the \"s3\" service
  (e.g., \"us-west-2\"). A list of available public regions and endpoints can be
  found at http://docs.aws.amazon.com/general/latest/gr/rande.html. at /var/app/current/vendor/aws/aws-sdk-php/src/ClientResolver.php:371)
[stacktrace]
#0 /var/app/current/vendor/aws/aws-sdk-php/src/ClientResolver.php(267): Aws\\ClientResolver->throwRequired(Array)
#1 /var/app/current/vendor/aws/aws-sdk-php/src/AwsClient.php(158): Aws\\ClientResolver->resolve(Array, Object(Aws\\HandlerList))
#2 /var/app/current/vendor/aws/aws-sdk-php/src/S3/S3Client.php(261): Aws\\AwsClient->__construct(Array)
#3 /var/app/current/vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemManager.php(208): Aws\\S3\\S3Client->__construct(Array)
#4 /var/app/current/vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemManager.php(125): Illuminate\\Filesystem\\FilesystemManager->createS3Driver(Array)
........

它在 laravel.log 上给出 PRODUCTION 错误,而这是 DEVELOPMENT, 并且正在查找的值已经设置。正如我之前提到的,当我以登录用户身份从终端运行上传时,上传工作正常。

我对所有命令都有同样的问题,而且当我想通过计划运行作业时,也会发生同样的错误。

请问有大神指点一下吗?非常感谢!

解决方案

所以要解决这个问题,只需在 .ebextensions 文件夹中创建一个配置文件并粘贴以下 YAML 代码:

files:
  "/etc/cron.d/artisan_scheduler":
     mode: "000644"
     owner: root
     group: root
     content: |
       * * * * * ec2-user . $HOME/.bash_profile; php /var/app/current/artisan schedule:run >> /dev/null 2>&1

【问题讨论】:

【参考方案1】:

我认为 S3 SDK 环境变量是以某种方式为您正在运行 artisan 命令的当前 shell 用户设置的(当它正常运行时)。您需要检查它需要的环境变量并在 cron 命令前面加上它们,或者您可以尝试在 cron 命令中加载用户现有的变量。

最流行的解决方案似乎来自this 问题,并让您可以在 cron 命令前添加:

. $HOME/.profile;

【讨论】:

是的,做到了。我用谷歌搜索了多少,我找不到那个答案。谢谢

以上是关于Laravel 命令在 AWS EC2 上由 Cron 执行时返回不同的输出的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 除了“/”之外的所有路由在 AWS EC2 上返回 404

使用 AWS EC2 或 Beanstalk 删除 Laravel 5 中的公用文件夹

Laravel 5 中间件 https 上的 aws ec2 重定向循环

将 Laravel 应用程序从 GitHub 分支自动部署到 AWS EC2 或 Elastic Beanstalk

Laravel AWS EBS 自动扩展

在 AWS Elastic Beanstalk 中运行 composer 命令