heroku - 缺少必需的参数:aws_access_key_id、aws_secret_access_key,遵循 Hartl 教程

heroku - Missing required arguments: aws_access_key_id, aws_secret_access_key, following Hartl tutorial

运行 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) 重新上传图像之前,该应用程序正在运行。顺便说一句,我知道费加罗gem;但是,我想尝试按照教程的方法进行操作。我错过了什么?任何想法将不胜感激。谢谢!

继续 Heroku,在您的应用程序上,转到设置,点击显示配置变量。

点击右侧的“编辑”并在那里输入您的秘密:

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

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

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


    if Rails.env.production?
        CarrierWave.configure do |config|
        config.root = Rails.root.join('tmp')
        config.cache_dir = 'carrierwave'

        config.fog_credentials = {
          # Configuration for Amazon S3
          :provider               => 'AWS',                        # change var's name
          :aws_access_key_id      => ENV['S3_ACCESS_KEY'],         # change var's name
          :aws_secret_access_key  => ENV['S3_SECRETE_KEY']
        }
        config.fog_directory     =  ENV['S3_BUCKET']
      end
    end

并且可以部署。

这是我在使 AWS 与 Heroku 一起工作后制作的教程,如 Michael Hartl 在 Rails 教程的 Ruby 第 11 章中所述。希望对您有所帮助:

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

您需要做的第一件事是回顾 Hartl 提供的代码。确保您完全按照显示的方式输入(或copy/pasted)。在本节的所有代码中,您可能只需要添加一小部分。 "region" 环境变量。 如果您创建不在默认美国区域的存储桶,则需要此变量。稍后会详细介绍。这是 /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部分做一个bucket。它必须有一个唯一的 名字,所以我通常只是把日期放在最后就行了。例如,您可以将其命名为 "my-sample-app-bucket-20160126"。一旦您 已创建您的存储桶,单击名称,然后单击属性。 知道 "Region" 你的桶在什么地方对你来说很重要。 找到它, 并记下它。稍后你会用到它。
  3. 您的主帐户可能拥有对所有内容的完全权限,因此我们不要使用它在两个网络服务之间传输随机数据。如果它泄露出去,你可能会损失很多钱。我们将创建一个有限的用户。 在IAM部分新建一个User。我将其命名为"fog",因为那是处理发送和接收的云服务软件。创建它时,您可以选择显示 and/or 下载与新用户关联的密钥。重要的是你把这个放在安全的地方 和安全的地方。它不会进入您的代码,因为那可能会 最终出现在其他人可以看到的存储库中。另外,不要给这个 新用户密码,因为它不会登录到 AWS 仪表板。
  4. 新建一个群组。我叫我的 "s3railsbucket"。这是 将分配权限。将 "fog" 添加到该组。
  5. 转到“政策”部分。单击 "Create Policy",然后单击 select“创建您的 Own Policy”。给它起一个以 "Allow" 开头的名称,这样它就会显示在附近 策略列表的顶部。这是一个巨大的清单。这是我所做的:

策略名称: AllowFullAccessToMySampleAppBucket20160126
说明:允许远程write/delete访问名为 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. 返回组部分,select您创建的组,然后添加 您对群组的新政策。

AWS 配置到此结束。我不需要制定政策来允许 "fog" 列出存储桶的内容,尽管我尝试了大多数教程 说那是必要的。我认为只有当你想要一个用户时才有必要 可以通过仪表板登录。

现在进行 Heroku 配置。这些东西被输入到你的 命令提示符,就像 'heroku run rake db:migrate' 之类的。这是 在其中输入您从之前创建的 "fog" 用户那里获得的 实际 访问密钥和秘密密钥。

$ 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 更改为您的实际区域代码。 link 在编写本教程时有效:

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

如果这不起作用,Google "AWS S3 region codes"。

完成所有这些之后 double-checking 由于代码中的错误,我得到了 Heroku 与 AWS 合作存储图片!

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

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