部署到Elastic Beanstalk时无法识别环境变量

时间:2015-02-02 19:03:50

标签: php laravel amazon-web-services environment-variables elastic-beanstalk

我正在尝试在开发模式下将我的Laravel应用程序部署到Elastic Beanstalk。为了使应用程序在开发模式而不是生产模式下运行,我在/bootstrap/start.php文件中完成了以下操作:

$env = $app->detectEnvironment(function() {
    return $_ENV['ENV_NAME'];
});

为了实际创建环境变量,我在以下路径中创建了一个.config文件:/.ebextensions/00environmentVariables.config包含以下内容:

option_settings:
   - namespace: aws:elasticbeanstalk:application:environment
     option_name: ENV_NAME
     value: development
   - option_name: DB_HOST
     value: [redacted]
   - option_name: DB_PORT
     value: [redacted]
   - option_name: DB_NAME
     value: [redacted]
   - option_name: DB_USER
     value: [redacted]
   - option_name: DB_PASS
     value: [redacted]

当我从命令行运行eb start时,它会旋转一个EC2实例并尝试配置它,此时它会告诉我它失败了。并检查日志。在日志中,我可以看到这些条目:

  

PHP注意:未定义的索引:ENV_NAME in   第28行/var/app/ondeck/bootstrap/start.php

     

注意:未定义的索引:第28行的/var/app/ondeck/bootstrap/start.php中的ENV_NAME

因此,由于某种原因,ENV_NAME环境变量不存在,即使我已在00environmentVariables.config中指定它。甚至更奇怪的是,我可以在EB环境的软件配置设置下看到环境变量确实

enter image description here

总结:

  • 我知道我的.config文件正在通过查看日志来解析
  • 由于某些原因,我的Laravel应用程序仍然不认为ENV_NAME eixsts
  • ENV_NAME.config文件和我的Elastic Beanstalk设置中同时使用此环境

修改

好的,所以我发现在通过Apache HTTP服务器提供应用程序时环境变量可以正常工作,但运行PHP CLI时环境变量不存在。

在上述日志中,运行ENV_NAME时抱怨/usr/bin/composer.phar install不存在。

因此,出于某种原因,我的环境变量在PHP CLI中不存在,但在通过Apache提供时它们可以正常工作。

进一步编辑

所以我通过SSH连接到在Elastic Beanstalk上托管我的Laravel应用程序的EC2实例,当我使用``printenv命令'时,我可以看到正确的环境变量:

ENV_NAME=development

但是,如果我执行die(var_dump($_SERVER));并运行PHP CLI,我看不到我定义的环境变量。与$_ENVgetenv()相同的故事。

为什么我不能在PHP CLI中访问我的环境变量,当我在Apache处理我的PHP脚本时可以访问它们?

另一个编辑

我创建了一个test.php文件,其中包含一行:die(var_dump($_ENV));

当我使用php test.php运行时,我成功地获得了自定义环境变量,所以这似乎只是一个作曲家问题,而不是PHP CLI问题。

2 个答案:

答案 0 :(得分:2)

我使用YAML脚本,该脚本从为ec2-user设置的现有变量设置root用户的环境变量。将其添加到.ebextensions扩展名为.config的文件夹中。

从那里你可以运行PHP cli,它将看到正确的环境变量

commands:
  create_post_dir:
    command: "mkdir /opt/elasticbeanstalk/hooks/appdeploy/post"
    ignoreErrors: true
files:
  "/opt/elasticbeanstalk/hooks/appdeploy/post/job_after_deploy.sh":
    mode: "000755"
    owner: root
    group: root
    content: |
      #!/usr/bin/env bash
      source /opt/elasticbeanstalk/support/envvars
      # Run PHP scripts here. #

来自XuDing对this questionthis answer

的回答

答案 1 :(得分:1)

我创建了一个每5分钟创建一次.env文件的作业。

将以下内容添加到.ebextensions

   "/opt/elasticbeanstalk/hooks/appdeploy/post/91_set_create_app_env_file_job.sh":
  mode: "000755"
  owner: root
  group: root
  content: |
    #!/usr/bin/env bash

    echo "Removing any existing CRON jobs..."
    crontab -r

    APP_ENV=/var/app/current/.env
    EB_ENVVARS=/opt/elasticbeanstalk/support/envvars
    CONSTANTS=/var/app/current/.constants
    CRON_CMD="grep -oE '[^ ]+$' $EB_ENVVARS > $APP_ENV; cat $CONSTANTS >> $APP_ENV"

    echo "Creating .env file...."
    eval $CRON_CMD

    echo "Scheduling .env file updater job to run every 5 minutes..."
    (crontab -l 2>/dev/null; echo "*/5 * * * * $CRON_CMD")| crontab -

我这样做的原因是您可能希望通过AWS UI控制台更新您的环境变量。

在我看来,这是最好的解决方案。