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

时间:2014-03-21 16:12:13

标签: php amazon-web-services cron elastic-beanstalk

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

"出口"对于这些变量?它们在哪里定型?我在/etc/apache/conf.d/aws_env.conf中找到了Apache的SetEnvs。我无法在用户的.bashrc,.bash_profile等中找到任何内容。是否有解决方法?更好的方法吗?

感谢。

9 个答案:

答案 0 :(得分:12)

在搜索同一问题的解决方案时,我遇到了这篇博文: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

希望这有帮助!

答案 1 :(得分:9)

我刚刚发现了这个,使用

grep -r "export MY_VAR" /

编辑:亚马逊似乎不时移动文件位置。目前的位置是:

/opt/elasticbeanstalk/support/envvars

所以我想在调用我的php脚本之前,我将在我的脚本中包含(源[文件路径])。看起来仍然是一种时髦的做事方式。我还在寻求更好的解决方案。

我是通过cron触发的bash脚本运行PHP的。所以为了设置环境,我会做这样的事情:

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

有关PHP解决方案,请参阅下面的@ userid53答案。

答案 2 :(得分:4)

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

  • 在ebextensions中设置配置:$ 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()函数设置它。

答案 3 :(得分:3)

它对我来说适合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

希望这会有所帮助!

答案 4 :(得分:1)

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

source /opt/elasticbeanstalk/support/envvars .bash_profile

所以我的脚本由crontab执行,如下所示:

#!/bin/sh
source /opt/elasticbeanstalk/support/envvars .bash_profile


# do some php stuff

答案 5 :(得分:1)

我知道这是一个旧线程,但我最近需要在Elastic Beanstalk上部署的Node.js环境中做类似的事情。据我所知,Node.js环境中没有文件/opt/elasticbeanstalk/support/envvars。我最后写了一个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"])

希望这有助于任何需要这样做的人。

对于我部署的完整配置,您可以参考我原来的帖子How to set environment variables in Amazon Elastic Beanstalk when running a cron job (Node.js)

答案 6 :(得分:1)

在3.0.3版中,它再次发生了变化,可以使用它在命令行中导出您的envar。

file="/opt/elasticbeanstalk/deployment/env"
        while IFS=: read -r f1
        do
            export $f1
        done <"$file"

答案 7 :(得分:1)

AWS和EBS会不时更改环境变量的位置。目前,我能够从以下路径中检索环境变量(我使用python EBS)

/opt/python/current/env

答案 8 :(得分:0)

如果您需要 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