首页 文章

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

提问于
浏览
5

我'm trying to deploy my Laravel application to Elastic Beanstalk in development mode. To make the application run in development mode rather than production, I'已在我的 /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注意:未定义的索引:第28行的/var/app/ondeck/bootstrap/start.php中的ENV_NAME注意:未定义的索引:第28行的/var/app/ondeck/bootstrap/start.php中的ENV_NAME

因此,出于某种原因, ENV_NAME 环境变量并未't exist, even though I'在 00environmentVariables.config 中指定它 . 甚至更奇怪的是,我可以看到EB环境的软件配置设置下存在环境变量 does

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,我就不会定义't see the environment variables that I' . 与 $_ENVgetenv() 相同的故事 .

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

另一个编辑

我用一行创建了一个 test.php 文件: die(var_dump($_ENV)); .

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

2 回答

  • 2

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

    从那里你可以运行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. #
    

    从徐鼎的回答this questionthis answer

  • 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控制台更新环境变量 .

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

相关问题