在添加/删除 ENV 变量时,Elastic Beanstalk 导致我的 Rails 6 应用程序预编译资产中断

Posted

技术标签:

【中文标题】在添加/删除 ENV 变量时,Elastic Beanstalk 导致我的 Rails 6 应用程序预编译资产中断【英文标题】:Elastic Beanstalk is causing my Rails 6 app precompiled assets to break when adding/removing ENV variables 【发布时间】:2020-10-17 09:23:06 【问题描述】:

我可以使代码部署没有问题,一切正常。问题是当我使用 Elastic Beanstalk Web 配置表单或 EB CLI 添加/删除/修改 ENV 变量时。

Elastic Beanstalk 报告更改已成功完成,但是当我在浏览器中访问 Web 应用程序时,我的标准 Rails 错误“抱歉,出了点问题”。

SSH 进入服务器查看日志文件显示与丢失资产相关的错误。查看应用程序的“公共”文件夹,不再有包含预编译资产的“资产”文件夹,这在我部署代码更改时通常会出现。

我有以下可能相关的 ENV 设置:

RAILS_SERVE_STATIC_FILES: true
RAILS_SKIP_ASSET_COMPILATION: false
RACK_ENV: production
RAILS_ENV: production

我的生产环境配置:

Rails.application.configure do
  config.cache_classes = true
  config.eager_load = true
  config.consider_all_requests_local       = false
  config.action_controller.perform_caching = true
  config.public_file_server.enabled = ENV["RAILS_SERVE_STATIC_FILES"].present?
  config.assets.compile = false
  config.active_storage.service = :amazon
  config.force_ssl = ENV.fetch("FORCE_SSL", false)
  config.ssl_options =  redirect:  exclude: ->(request)  request.path =~ /health-check/   
  config.log_level = :debug
  config.log_tags = [:request_id]
  config.action_mailer.perform_caching = false
  config.i18n.fallbacks = true
  config.active_support.deprecation = :notify
  config.log_formatter = ::Logger::Formatter.new

  if ENV["RAILS_LOG_TO_STDOUT"].present?
    logger           = ActiveSupport::Logger.new(STDOUT)
    logger.formatter = config.log_formatter
    config.logger    = ActiveSupport::TaggedLogging.new(logger)
  end

  config.active_record.dump_schema_after_migration = false
end

为了解决这个问题,我只是重新部署了最后提交的代码,部署过程负责生成丢失的预编译资产。

有没有人遇到过这个问题或对这里发生的事情有任何见解?

【问题讨论】:

【参考方案1】:

我遇到了同样的问题。

在 2020 年 8 月之前,我们无法挂钩这些事件,但在问题修复并为 AL2 发布平台之后,它变得易于管理。

您可以使用 confighooks 挂钩 beanstalk 配置更改。

创建.platform/confighooks/predeploy/01_assets_precompile.sh 喜欢...

#!/bin/bash
source /root/.bash_profile
source <(sed -E -n 's/[^#]+/export &/ p' /opt/elasticbeanstalk/deployment/env)
cd /var/app/staging; bundle exec rake assets:precompile
chown -R webapp:webapp /var/app/staging/

部署这些脚本,并更改​​ beanstalk 的环境变量。

另请参阅。

https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/platforms-linux-extend.html https://github.com/aws/elastic-beanstalk-roadmap/issues/59

【讨论】:

感谢您的回复。看起来您的示例 bash 脚本应该与添加的配置挂钩支持一起使用! 这样的东西应该是平台的一部分,不需要自定义脚本

以上是关于在添加/删除 ENV 变量时,Elastic Beanstalk 导致我的 Rails 6 应用程序预编译资产中断的主要内容,如果未能解决你的问题,请参考以下文章

在 AWS Elastic Beanstalk 下设置 node.js process.env 变量

AWS Elastic Beanstalk 中的 Laravel .env

Node环境变量Process.env

在控制台中设置 Elastic Beanstalk 环境变量与从部署中传递它们

将环境变量添加到 NodeJS Elastic Beanstalk 时出错

Elastic Beanstalk 在环境变量更新时失败