【问题标题】:AWS Elastic Beanstalk: Running Cron.d script, missing Environment VariablesAWS Elastic Beanstalk:运行 Cron.d 脚本,缺少环境变量
【发布时间】:2014-04-29 02:55:04
【问题描述】:

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

这些变量的“出口”在哪里?他们在哪里设置?我在 /etc/apache/conf.d/aws_env.conf 中找到了适用于 Apache 的 SetEnvs。我在用户的 .bashrc、.bash_profile 等中找不到任何内容。有解决方法吗?有更好的方法吗?

谢谢。

【问题讨论】:

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


    【解决方案1】:

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

    希望这会有所帮助!

    【讨论】:

      【解决方案2】:

      我刚刚发现这个,使用

      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 的答案。

      【讨论】:

      • 你能解释一下你是如何包含它的吗?它在 .ebextensions 文件中吗?我有同样的问题。
      • @AlexMarkov 使用这个命令:$ source /opt/elasticbeanstalk/support/envvars.d/sysenv 并且设置到该文件的所有变量都将在当前 shell 中作为环境变量使用。
      • @AlexMarkov 请看我的回答。
      • @userid53 谢谢老兄!实际上,我在命令之前使用了. $HOME/.bash_profile; 。我猜是一样的吗?
      • 文件已移至 /opt/elasticbeanstalk/support/envvars
      【解决方案3】:

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

      • 在 ebextensions 配置中设置:$ source /opt/elasticbeanstalk/support/envvars.d/sysenv
      • 将我的所有环境变量设置为配置文件。

      无论我尝试什么,环境变量都不会传递给 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() 函数设置它。

      【讨论】:

      • 这是在 PHP 中实现它的好方法。我正在通过 cron 运行 bash 脚本,所以我会执行以下操作:#!/bin/bash source /opt/elasticbeanstalk/support/envvars.d/sysenv php -f my-script.php 抱歉缺少换行符。
      • 在我挠头后的第二天保存下来!
      • 对于任何想通过 Artisan 使用 SQS 运行 Laravel 队列工作程序的人,您需要这样的东西来加载这些环境变量,然后 PHP 会将它们放入 CLI 中。
      【解决方案4】:

      它适用于我的 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
      

      希望这会有所帮助!

      【讨论】:

      • 您是如何解决权限问题的?日志文件以root 用户创建,webapp 用户无法写入。
      • 谢谢!在 CodeIgniter 上完美地为我工作
      【解决方案5】:

      我知道这是一个旧线程,但我最近需要在部署在 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"])
      

      希望这可以帮助任何需要这样做的人。

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

      【讨论】:

        【解决方案6】:

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

        source /opt/elasticbeanstalk/support/envvars .bash_profile
        

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

        #!/bin/sh
        source /opt/elasticbeanstalk/support/envvars .bash_profile
        
        
        # do some php stuff
        

        【讨论】:

          【解决方案7】:

          在 3.0.3 版本中再次更改,使用它在命令行中导出您的 envars

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

          【讨论】:

            【解决方案8】:

            如果您对 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
            

            【讨论】:

              【解决方案9】:

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

              /opt/python/current/env

              【讨论】:

                猜你喜欢
                • 2019-10-04
                • 2021-03-11
                • 2015-08-05
                • 2016-12-10
                • 2018-04-27
                • 2012-12-13
                • 2017-05-05
                • 2017-02-28
                • 1970-01-01
                相关资源
                最近更新 更多