【问题标题】:Seems unable to pull config vars from the environment (Heroku)似乎无法从环境中提取配置变量(Heroku)
【发布时间】:2015-05-23 16:10:37
【问题描述】:

我的 Rails 应用似乎无法从环境中提取配置变量。当凭据被硬编码时,表单可以正常工作,但是当我尝试使用环境变量时它会失败。可能出了什么问题?因为我只是一个新手程序员,所以我可能犯了一个基本错误。

我已经在终端中设置了环境变量。如果我输入 heroku config 它确认它已正确存储访问密钥。示例:

heroku config:set S3_ACCESS_KEY=<access key>

在我的代码中,我将硬编码的访问密钥替换为例如:

ENV['S3_ACCESS_KEY']

在开发服务器上,它现在会生成与凭据相关的错误消息。示例:

unable to sign request without credentials set

这与我将凭据留空时收到的错误消息相同。所以它似乎没有加载/初始化环境变量......?

如果我输入 'ENV["S3_ACCESS_KEY"]' 而不是 ENV['S3_ACCESS_KEY'],我会收到消息:The AWS Access Key Id you provided does not exist in our records。如果我在硬编码的凭据中输入了错误的凭据,这与我收到的消息相同。

有什么想法可能是错的吗?我可以采取哪些步骤来查找原因?


更新:用下面的命令开始开发,解决了。谁能解释如何进一步解决这个问题,这样我就不必每次都以这种方式启动服务器? 我是否应该以某种方式将密钥添加到secrets.yml?但我正在云端编程,如果其他有权访问我的代码的程序员看不到密钥,我会更喜欢它。

S3_ACCESS_KEY=<myaccesskey> S3_SECRET_KEY=<mysecretkey> rails server

更新2:如果我添加到secrets.yml

secrets.yml:
development:
S3_ACCESS_KEY: ENV['S3_ACCESS_KEY']

Model method:
Rails.application.secrets.S3_ACCESS_KEY

我得到错误:

The AWS Access Key Id you provided does not exist in our records.

如果我改为使用:

secrets.yml:
development:
S3_ACCESS_KEY: <my access key>

Model method:
Rails.application.secrets.S3_ACCESS_KEY

我收到错误消息:

The request signature we calculated does not match the signature you provided. Check your key and signing method.

真的不知道还能尝试什么。

【问题讨论】:

  • 您是否检查过您是否在 production.rb 上调用了 Amazon S3 凭证?而不是在 environment/development.rb 或 enviroments/test.rb 中。
  • 不完全确定您的意思。你能指定我在哪里可以检查你的意思吗?使用 ENV['S3_ACCESS_KEY'] 的代码部分在生产和开发中写入 S3 存储桶。
  • 如果在生产中。rb 没问题。有时我们忘记投入生产,只在本地工作而不是在 Heroku 中工作的开发。
  • 通常连接到 Amazon S3 的凭证放在 config/environments/(production.rb/development.rb/test.rb)
  • 我在环境文件夹中基本上没有任何代码。我刚刚在终端输入了heroku config:set S3_ACCESS_KEY=&lt;access key&gt;。我在控制器和模型方法中有 s3 = Aws::S3::Resource.new( credentials: Aws::Credentials.new(ENV['S3_ACCESS_KEY'],ENV['S3_SECRET_KEY']), region: ENV['AWS_REGION'] ) 之类的代码。

标签: ruby-on-rails ruby ruby-on-rails-4 heroku environment-variables


【解决方案1】:

您混淆了 Heroku 环境和本地开发环境,它们是不同且不相关的。 heroku config:set 命令的作用与将变量放在命令前面完全相同,但它是用于在将应用程序部署到 Heroku 时运行应用程序。但是当您在本地机器上运行应用程序时,您需要在命令行中提供变量。

此外,您不应向公众公开 S3 凭据,例如,切勿将带有凭据的 secrets.yml 提交到公共 GitHub 存储库中,因为它们会被盗并用于运行服务器,费用由您承担 - here's one article describing this situation .环境变量是存放凭据的好地方。

【讨论】:

  • 好的,我想我开始明白了。 1)我已将 secrets.yml 添加到 .gitignore。 2) 在secrets.yml 中我添加了诸如S3_ACCESS_KEY: &lt;my access key&gt; 之类的行。 3)在我参考的方法中,例如:Rails.application.secrets.S3_ACCESS_KEY。是的,这行得通!
  • 我这样做是否正确?唯一我不明白的是:我在云中编程,当我让其他人(例如帮助我的程序员)访问我的代码时,他们可以打开 secrets.yml 并读取我所有的密钥。我错过了什么还是这正常吗?
  • .gitignore 下的 @Nick secrets.yml 也是常用的解决方案。我不知道您所说的“在云端”是什么意思,但您应该只将密钥交给您认识和信任的人。如果您想了解更多关于保护亚马逊凭证的信息,您应该研究Identity and Access Management guide
  • “在云端”我的意思是:我正在使用 Cloud9 (c9.io) 进行编程。您还可以使用它来邀请其他程序员查看您的代码以帮助您完成它。我的想法是:当您将密钥上传到 Heroku 时,该程序员将无法看到该密钥,而您仍然可以使用该密钥,但是您输入的密钥 secrets.yml 将对受邀程序员可见。
猜你喜欢
  • 2021-10-01
  • 2019-07-16
  • 2017-08-21
  • 1970-01-01
  • 2018-12-04
  • 2015-07-17
  • 2012-10-26
  • 1970-01-01
  • 2010-12-30
相关资源
最近更新 更多