我一直在尝试(但不成功)从我的Rails可装载引擎中访问主应用程序的应用程序秘密。 可装载引擎的整个重点是提供模块化。因此,一个常见的模式是在主应用程序中提供可配置的参数,其中一些需要是秘密,然后由引擎使用。
在我的具体情况中,我在我的引擎中使用carrierwave
和fog
上传文件到AWS存储桶。确切的存储桶和AWS凭据未在引擎中指定,而是在主应用程序中指定,因为它们将根据安装引擎的应用程序不同而变化。
但是,当引擎中的carrierwave初始化器失败时,它找不到主应用程序的Rails.application.secrets:
require 'carrierwave'
require 'carrierwave/storage/fog'
CarrierWave.configure do |config|
config.fog_provider = 'fog/aws'
config.fog_credentials = {
:provider => 'AWS',
:aws_access_key_id => Rails.application.secrets.S3_AWS_ACCESS_KEY_ID,
:aws_secret_access_key => Rails.application.secrets.S3_AWS_SECRET_ACCESS_KEY
}
config.fog_directory = Rails.application.secrets.CARRIERWAVE_CONFIG_FOG_DIRECTORY
config.storage = :fog
end
当引擎启动时,这个会失败。
Missing required arguments: aws_access_key_id, aws_secret_access_key (ArgumentError)
实际上,在初始化器中Rails.application.secrets.S3_AWS_ACCESS_KEY_ID
(以及其他变量)的值是nil
。但是在引擎控制器运行时,它会被正确地计算出来。我已将其修改为以下内容:
:aws_access_key_id => Rails.application.secrets.S3_AWS_ACCESS_KEY_ID || ENV["S3_AWS_ACCESS_KEY_ID"]
在每个生产环境中导出ENV变量以供引擎使用,但这并不理想。 欢迎任何解决方案。
aws_access_key_id
和aws_secret_access_key
直接存储在config/secrets.yml
文件中吗?还是使用config/application.yml
来实现呢? - Danger Rodriguez Gálvezapplication.yml
存储我的秘密凭据,并通过环境变量访问它们来解决了这个问题。请参见此处的代码 https://gist.github.com/dangerrg/e42005e28bfb9fea66188f0504e1614a。 - Danger Rodriguez Gálvez