Rails 5 将环境变量读取为 YAML 文件中的字符串

Posted

技术标签:

【中文标题】Rails 5 将环境变量读取为 YAML 文件中的字符串【英文标题】:Rails 5 reads environment variables as string in YAML file 【发布时间】:2019-07-05 13:50:15 【问题描述】:

我有一个 Rails 5 应用程序,我正在尝试将我的环境变量导入一个 yaml 文件中,然后我可以将其导入到 environment.rb 中。我的config/aws.yml 如下所示:

S3_BUCKET: <%= ENV["S3_BUCKET"] %>
AWS_ACCESS_KEY_ID: <%= ENV["AWS_ACCESS_KEY_ID"] %>
AWS_SECRET_ACCESS_KEY: <%= ENV["AWS_SECRET_ACCESS_KEY"] %>

然后在我的environment.rb 我有以下内容:

require_relative 'application'
aws_file = File.join(Rails.root, 'config', 'aws.yml')
if File.exist?(aws_file)
  YAML.safe_load(File.open(aws_file)).each do |k, v|
    ENV[k.to_s] = v
  end
end

运行我的rails c 这是我得到的:

[1] pry(main)> ENV.fetch('S3_BUCKET')
=> "<%= ENV[\"S3_BUCKET\"] %>" 

如何传递实际的环境变量而不是将环境变量的名称作为字符串提取?

编辑:添加更多相关信息

我的凭据存储在我的elastic-beanstalk 配置中,我正在尝试将配置中的值加载到我的yaml 文件中。

【问题讨论】:

您的yml 文件使用erb 语法似乎很好奇。您试图通过引用ENV 变量来加载ENV 变量似乎也很奇怪。我认为您的yml 文件中的values 将是您要加载到ENV 变量中的实际值。 @jvillian 这些值在我的elasticbeanstalk 配置中,我正在尝试从那里将它们加载到yaml 文件中 您可能应该在您的问题中说明这一点。我不使用elasticbeanstalk。但是,如果 config 文件也是 yml 文件,那么您似乎想要加载它,然后根据其内容设置您的 ENV 变量。 我不清楚您要做什么。我在你的代码中没有看到任何关于 elastic-beanstalk 的内容。 【参考方案1】:

&lt;%= ... %&gt; 是 ERB 的功能,而不是 YAML。您需要首先通过 ERB 运行您的 YAML 文件以使 &lt;%= ... %&gt; 执行,然后将其作为 YAML 加载。

但还有一个更深层次的问题。您的 YAML 文件正在尝试从环境变量中获取其值。但是随后您从 YAML 值中设置了相同的环境变量。是圆形的。

改为使用 Rails 5.2 中引入的 Encrypted Credentials 之类的东西来管理您的秘密。然后写config/initializer/aws.rb 从这些秘密中设置必要的环境变量。这很好,因为它将您的秘密存储在您的应用程序中,而不是部署平台中。然后它可以在任何地方以完整的秘密运行。

或者您可以通过“环境属性”控制台在 Elastic Beanstalk 中设置环境变量。

【讨论】:

我还没有使用 Rails 5.2。我正在使用 Rails 5.0 我的凭据存储在elasticbeanstalk 配置中 考虑升级。 Encrypted Credentials 让您可以将您的凭据移出部署平台并移入应用程序。那么你就不需要像你正在尝试编写的胶水代码了。 @anonn023432 您的另一个选择是在 Elastic Beanstalk 中设置环境变量。那将是“环境属性”。【参考方案2】:

你试过fetch,它对我的​​情况有效:

S3_BUCKET: <%= ENV.fetch("S3_BUCKET") %>
AWS_ACCESS_KEY_ID: <%= ENV.fetch("AWS_ACCESS_KEY_ID") %>
AWS_SECRET_ACCESS_KEY: <%= ENV.fetch("AWS_SECRET_ACCESS_KEY") %>

【讨论】:

以上是关于Rails 5 将环境变量读取为 YAML 文件中的字符串的主要内容,如果未能解决你的问题,请参考以下文章

在 python 中读取 YAML 配置文件并使用变量

使用python读取yaml文件

在 Laravel 5.1 配置文件中读取 Vhosts 中设置的环境变量

python——Yaml

如何从 python 中的嵌套 YAML 文件中读取数据?

[SpringBoot]配置文件①(配置文件格式yaml配置及读取)