【问题标题】:heroku - Missing required arguments: aws_access_key_id, aws_secret_access_key, following Hartl tutorialheroku - 缺少必需的参数:aws_access_key_id、aws_secret_access_key,遵循 Hartl 教程
【发布时间】:2015-01-14 17:42:45
【问题描述】:

运行heroku run rake db:migrate,我收到此错误:Missing required arguments: aws_access_key_id, aws_secret_access_key

我在 SO 问题 25596504 中进行了建议的更正,专门将文件 carrier_wave.rb 更改为 carrierwave.rb,但没有运气。我正在关注 Hartl 教程第 688 页,其中指定将它们添加为 $heroku config:set S3_ACCESS_KEY=<access key> 我将 '' 替换为实际密钥的带引号和不带引号的版本。当我运行 heroku 配置时,键会显示,例如,S3_ACCESS_KEY:

在我开始处理教程的这一部分 (11.4) 重新上传图像之前,该应用程序正在运行。顺便说一句,我知道费加罗宝石;但是,我想尝试按照教程的方法。我错过了什么?任何想法将不胜感激。谢谢!

【问题讨论】:

  • 你能发布你的carrierwave.rb初始化程序吗?

标签: ruby-on-rails heroku


【解决方案1】:

在 Heroku 上,在您的应用程序上,进入设置,点击 Reveal Config Vars。

点击右侧的编辑并在此处输入您的秘密:

S3_BUCKET: name of your bucket goes here
S3_ACCESS_KEY: xxxxx
S3_SECRET_KEY: xxxx

在 config/initializers/carrierwave.rb 或您输入机密的任何位置:

CarrierWave.configure do |config|
  config.root = Rails.root.join('tmp') # adding these...
  config.cache_dir = 'carrierwave' # ...two lines

  config.fog_credentials = {
    :provider               => 'AWS',                        # required
    :s3_access_key_id      => ENV['S3_ACCESS_KEY'],                        # required
    :s3_secret_access_key  => ENV['S3_SECRET_KEY'],                     # required
    :region                 => 'eu-west-1',                  # optional, defaults to 'us-east-1'
    :host                   => 's3.example.com',             # optional, defaults to nil
    :endpoint               => 'https://s3.example.com:8080' # optional, defaults to nil
  }
  config.fog_directory  = ENV['S3_Bucket']                             # required
  config.fog_public     = false                                   # optional, defaults to true
  config.fog_attributes = {'Cache-Control'=>'max-age=315576000'}  # optional, defaults to {}
end

【讨论】:

  • 我应该用实际值替换“AWS_KEY”、“AWS_SECRET”和“AWS_BUCKET”还是保持原样?谢谢。
  • 你应该保持原样,永远不要在 github 上提交你的秘密......然后在 Heroku config vars 上设置它们
  • 这为我解决了问题。请更新您的答案 - 使其与 Hartl 的术语相对应,以便将来其他人受益 - 我会接受它。它应该是 S3_ACCESS_KEY、S3_SECRET_KEY 和 S3_Bucket。再次感谢!
  • 我遇到了同样的问题,它也对我有用。谢谢!
【解决方案2】:

这是我经过大量工作让 AWS 与 Heroku 一起工作后编写的教程,如 Michael Hartl 的 Ruby on Rails 教程的第 11 章所述。希望对您有所帮助:

让 Rails 教程示例应用程序在 Heroku 和 AWS 之间工作是一件非常痛苦的事情。但我做到了。如果您找到了本教程,则意味着您可能遇到了无法克服的错误。没关系。我有几个。

您需要做的第一件事是回顾 Hartl 提供的代码。确保您完全按照所示输入(或复制/粘贴)。在本节的所有代码中,您可能只需要添加一小部分。 “区域”环境变量。如果您创建的存储桶不在默认的美国地区,则需要此变量。稍后再谈。这是/config/initializers/carrier_wave.rb的代码:

if Rails.env.production?
  CarrierWave.configure do |config|
    config.fog_credentials = {
      # Configuration for Amazon S3
      :provider              => 'AWS',
      :aws_access_key_id     => ENV['S3_ACCESS_KEY'],
      :aws_secret_access_key => ENV['S3_SECRET_KEY'],
      :region                => ENV['S3_REGION']
    }
    config.fog_directory     =  ENV['S3_BUCKET']
  end
end

:region => ENV['S3_REGION'] 这一行对很多人来说都是个问题。随着您继续本教程,您将了解它的用途。

您应该完全按照所示使用该代码块。 不要将您的实际密钥放在那里。我们会单独将它们发送到 Heroku。

现在让我们继续讨论您的 AWS 账户和安全问题。

  1. 首先,创建您的 AWS 帐户。 在大多数情况下,这就像注册任何网站一样。制作一个漂亮的长密码并将其存储在安全的地方,例如加密的密码管理器。当您创建帐户时,您将获得第一组 AWS 密钥。您将不会在本教程中使用它们,但您将来可能会需要它们,因此请将它们保存在安全的地方。
  2. 转到 S3 部分并制作一个桶。它必须有一个唯一的 名字,所以我通常只是把日期放在最后就可以了。例如,您可以将其命名为“my-sample-app-bucket-20160126”。一旦您 已创建您的存储桶,单击名称,然后单击属性。 了解您的存储桶所在的“区域”对您很重要。找到它, 并记下它。稍后您将使用它。
  3. 您的主帐户可能对所有内容都具有完全权限,因此我们不要使用它在两个 Web 服务之间传输随机数据。如果它出去了,这可能会花费你很多钱。我们将改为限制用户。 在 IAM 部分创建一个新用户。我将其命名为“雾”,因为这是处理发送和接收的云服务软件。创建它时,您可以选择显示和/或下载与新用户关联的密钥。把它放在保险箱里很重要 和安全的地方。它不会进入您的代码,因为这可能会 最终在其他人可以看到的存储库中。另外,不要给这个 新用户一个密码,因为它不会登录到 AWS 控制面板。
  4. 创建一个新组。我称我为“s3railsbucket”。这就是 将分配权限。将“雾”添加到该组。
  5. 转到“策略”部分。单击“创建策略”,然后选择“创建您的 自己的政策”。给它一个以“允许”开头的名称,这样它就会显示在附近 政策列表的顶部。这是一个巨大的清单。这是我所做的:

策略名称: AllowFullAccessToMySampleAppBucket20160126
说明: 允许远程写入/删除访问名为 my-sample-app-bucket-20160126。
政策文件:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": "s3:*",
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::my-sample-app-bucket-20160126",
                "arn:aws:s3:::my-sample-app-bucket-20160126/*"
            ]
        }
    ]
}
  1. 返回组部分,选择您创建的组,然后添加 您对小组的新政策。

AWS 配置就是这样。我不需要制定政策来允许 “雾”列出存储桶的内容,即使我尝试过的大多数教程 说有必要。我认为只有当你想要一个用户时才有必要 可以通过仪表板登录。

现在是 Heroku 配置。这些东西会在你的 命令提示符,就像 'heroku run rake db:migrate' 等。这是 您在此处输入您从之前创建的“雾”用户那里获得的实际访问密钥和秘密密钥。

$ heroku config:set S3_ACCESS_KEY=THERANDOMKEYYOUGOT  
$ heroku config:set S3_SECRET_KEY=an0tHeRstRing0frAnDomjUnK  
$ heroku config:set S3_REGION=us-west-2  
$ heroku config:set S3_BUCKET=my-sample-app-bucket-20160126

再看看最后一个。记得当你看到的属性 你的 S3 存储桶?您可以在此处输入与您的相关联的代码 地区。如果您的存储桶不在俄勒冈州,则必须将 us-west-2 更改为您的实际区域代码。此链接在编写本教程时有效:

http://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region

如果这不起作用,请谷歌“AWS S3 区域代码”。

在完成所有这些并仔细检查代码中的错误之后,我得到了 Heroku 与 AWS 合作存储图片!

【讨论】:

  • 不错的更新!您应该与 Michael Hartl 分享它,以帮助改进他的书。
  • 花费了 5 个小时,最终执行了您建议的步骤。现在一切正常!!!非常感谢!
  • 太棒了,非常感谢你的这篇文章!这应该是正确的答案!
  • @Max 我遵循了你所说的一切,但仍然收到此错误:bash: syntax error near unexpected token `newline'
  • 我想通了,我必须删除 我将 Access_key 放入其中。
【解决方案3】:

我认为发生此错误是因为 var 名称不匹配。

在carrierwave.rb 中,您应该将:s3_access_key_id 和:s3_secret_access_key 替换为前缀“aws”。

如果 Rails.env.production? CarrierWave.configure 做 |config| config.root = Rails.root.join('tmp') config.cache_dir = 'carrierwave' config.fog_credentials = { # Amazon S3 的配置 :provider => 'AWS', # 改变 var 的名字 :aws_access_key_id => ENV['S3_ACCESS_KEY'], # 改变 var 的名字 :aws_secret_access_key => ENV['S3_SECRETE_KEY'] } config.fog_directory = ENV['S3_BUCKET'] 结尾 结尾

而且可以部署。

【讨论】:

    【解决方案4】:

    无论出于何种原因,运行 rake assets:precompile RAILS_ENV=development 为我解决了这个问题。
    [和环境变量不需要命名S3_ACCESS_KEY等,我使用aws.access_key_id]

    【讨论】:

    • 所以在尝试了所有其他答案之后,这对我有用。干杯!现在有人知道为什么了吗?!
    【解决方案5】:

    在没有任何 RAILS_ENV 的情况下运行 rake assets:precompile 是我可以让它预编译的唯一方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多