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 重定向循环