AWS Elastic Beanstalk:运行Cron.d脚本,缺少环境变量


AWS Elastic Beanstalk: Running Cron.d script, missing Environment Variables

我试图运行由cron脚本触发的PHP脚本(在cron.d中)。脚本被正确触发,但它缺少存储在$_SERVER超全局变量中的Elastic Beanstalk"环境变量"。该脚本目前以用户"root"身份运行,但它不是在具有环境变量的同一环境中运行的。变量设置正确,如果我从一个完整的shell运行脚本,它运行得很好。

这些变量的"导出"在哪里?它们在哪里设置?我在/etc/apache/conf.d/aws_env.conf中找到了Apache的SetEnvs。我在用户的。bashrc、。bash_profile等文件中找不到任何内容。有解决办法吗?有更好的方法吗?

谢谢。

在寻找同样问题的解决方案时,我看到了这篇博客文章:http://sebgoo.blogspot.nl/2013/10/elastic-beanstalk-cron-command-and-rds.html。总而言之,可以使用opt/elasticbeanstalk/support/envvars文件加载Elastic Beanstalk环境变量:

0 3 * * * . /opt/elasticbeanstalk/support/envvars; some_command

希望这对你有帮助!

我刚刚发现了这个,使用

grep -r "export MY_VAR" /

EDIT: Amazon似乎不时地移动文件位置。当前位置为:

/opt/elasticbeanstalk/support/envvars

所以我想我只是包括(源[文件路径])在我的脚本调用我的php脚本之前。这样做还是挺古怪的。我还在寻找更好的解决办法。

我运行PHP通过bash脚本触发的cron。为了设置环境,我将这样做:

#!/bin/bash 
source /opt/elasticbeanstalk/support/envvars
php -f my-script.php

我花了几个小时试图弄清楚如何将环境变量传递给PHP CLI。我试着:

  • 设置在ebeextensions config: $ source /opt/elasticbeanstalk/support/envvars.d/sysenv
  • 设置所有的环境变量到配置文件。

无论我如何尝试,env变量都不会传递到PHP CLI。

当我作为EC2 -user登录到我的EC2实例并这样做时:$ echo $ENVIRONMENT我得到prod。如果我先做$ sudo su,再做$ echo $ENVIRONMENT,我就得到了prod

如果我手动运行PHP CLI文件(在cronjob中使用),我的脚本工作。当它自动运行时(通过cronjob),环境变量不会传递给我的脚本。

我是这么做的。将其放入cronjob条目脚本中:

$variables = '/opt/elasticbeanstalk/support/envvars.d/sysenv';
if (file_exists($variables) && is_file($variables)) {
    $contents = file_get_contents($variables);
    foreach(explode("'n", $contents) as $line) {
        if (empty($line)) continue;
        $new_line = str_replace('export ', '', $line);
        $first_part = strpos($new_line, '=');
        $last_part = substr($new_line, $first_part, strlen($new_line));
        $variable_value = str_replace(array('=', '"'), array('',''), $last_part);
        $variable_name = substr($new_line, 0, $first_part);
        putenv($variable_name."=".$variable_value);
    }
}

/opt/elasticbeanstalk/support/envvars.d/sysenv文件中抽取每一行,去掉export部分,得到变量名&值,并通过putenv()函数设置。

它适用于我的Laravel项目

* * * * * root . /opt/elasticbeanstalk/support/envvars && /usr/bin/php /var/www/html/artisan schedule:run 1>> /dev/null 2>&1

对于一个非Laravel项目,你可以测试:

* * * * * root . /opt/elasticbeanstalk/support/envvars && /usr/bin/php /path/to/your/script.php 1>> /dev/null 2>&1

希望这对你有帮助!

在3.0.3版本中,它再次发生了变化,使用此命令在命令行

中导出您的嫉妒
file="/opt/elasticbeanstalk/deployment/env"
        while IFS=: read -r f1
        do
            export $f1
        done <"$file"

我知道这是一个老线程,但我最近需要在一个部署在Elastic Beanstalk上的Node.js环境中做一些类似的事情;据我所知,文件/opt/elasticbeanstalk/support/envvars不存在于Node.js环境中。我最后写了一个Python脚本,从/opt/elasticbeanstalk/bin/get-config加载环境变量,然后从那里执行我的Node.js脚本。

我最终使用的代码是:

#!/usr/bin/env python
import os
import subprocess
from subprocess import Popen, PIPE, call
import simplejson as json
envData = json.loads(Popen(['/opt/elasticbeanstalk/bin/get-config', 'environment'], stdout = PIPE).communicate()[0])
for k, v in envData.iteritems():
    os.environ[k] = v
call(["babel-node", "/var/app/current/<script_name>.js"])

希望这对任何需要做同样事情的人有所帮助。

对于我部署的完整配置,您可以参考我的原始文章如何在运行cron作业(Node.js)时在Amazon Elastic Beanstalk中设置环境变量

我在shell脚本中添加了以下行:

source /opt/elasticbeanstalk/support/envvars .bash_profile
所以我的脚本,由crontab执行,看起来像这样:
#!/bin/sh
source /opt/elasticbeanstalk/support/envvars .bash_profile

# do some php stuff

如果您需要类似的CodeIgniter:

* * * * * root . /opt/elasticbeanstalk/support/envvars && /usr/bin/php /var/www/html/index.php controller method

例子:

* * * * * root . /opt/elasticbeanstalk/support/envvars && /usr/bin/php /var/www/html/index.php tasks pushNotification

更具描述性的替代方法:

* * * * * root source /opt/elasticbeanstalk/support/envvars && /usr/bin/php /var/www/html/index.php tasks pushNotification

AWS和EBS不时地改变环境变量的位置。目前,我能够从以下路径(我有python EBS)检索env变量

/opt/python/current/env

在Amazon Linux 2实例上,环境变量应该从另一个文件加载:

0 3 * * * export $(cat /opt/elasticbeanstalk/deployment/env | xargs); some_command