1

我已经通过 railscast 并在 Stack Overflow 上进行了研究。尽管我发现其他人有同样的问题,但我研究过的任何其他解决方案似乎都不起作用。我已经尝试了其他帖子中建议的代码的多种变体......没有运气。

我正在尝试通过CarrierwaveFog gem 将 PDF 文件上传和存储到Amazon S3,但无济于事。当我在生产中使用Heroku时,我还没有尝试将它部署到 Heroku,因为我什至无法让它在本地工作。返回的错误是

缺少必需的参数:aws_access_key_id、aws_secret_access_key

我该如何解决这个问题?

carrierwave.rb(初始化程序)

CarrierWave.configure do |config|
    config.fog_credentials = {
        provider: 'AWS',
        aws_access_key_id: ENV['MY_KEY_ID'],
        aws_secret_access_key: ENV['MY_KEY']
    }

    config.fog_directory  = ENV['MY_BUCKET']
    config.fog_public     = false
end

pdf_uploader.rb:

class PdfUploader < CarrierWave::Uploader::Base
    storage :fog

    include CarrierWave::MimeTypes
    process :set_content_type

    def store_dir
        "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
    end
end
4

4 回答 4

2

我遇到了同样的问题,将变量包装在字符串上对我来说很重要。

而不是Rails.application.secrets.aws_access_key_id我曾经"#{Rails.application.secrets.aws_access_key_id}"确保将值作为字符串插入。

这是我的初始化程序:

CarrierWave.configure do |config|
  config.fog_credentials = {
    provider: 'AWS',
    aws_access_key_id: "#{Rails.application.secrets.aws_access_key_id}",
    aws_secret_access_key: "#{Rails.application.secrets.aws_secret_access_key}"
  }
  config.fog_directory  = Rails.application.secrets.aws_s3_bucket
  config.fog_public     = true
  config.fog_attributes = { 'Cache-Control'=>'max-age=315576000' }
end

这是我的secrets.yml:

development:
  secret_key_base: 'xxxxxxxxxxxxxxxxxxxxxxxxx'
  aws_access_key_id: 'xxxxxxxxxxxxxxxxxxxxxxxxx'
  aws_secret_access_key: 'xxxxxxxxxxxxxxxxxxxxxxxxx'
  aws_s3_bucket: 'xxxxxxxxxxxxxxxxxxxxxxxxx'
production:
  secret_key_base: <%= ENV['SECRET_KEY_BASE'] %>
  aws_access_key_id: <%= ENV['AWS_ACCESS_KEY_ID'] %>
  aws_secret_access_key: <%= ENV['AWS_SECRET_ACCESS_KEY'] %>
  aws_s3_bucket: <%= ENV['AWS_BUCKET_NAME'] %>
于 2014-11-12T23:11:51.117 回答
1

将 key_id、key AND 存储桶设置为环境变量似乎存在问题。一旦我将这三个都更改为字符串常量,它似乎工作正常。我还部署到 Heroku 并验证了生产中的功能。

最终的初始化文件:

CarrierWave.configure do |config|
    config.storage = :fog
    config.fog_credentials = {
        provider: 'AWS',
        aws_access_key_id: 'MY_KEY_ID_HERE',
        aws_secret_access_key: 'MY_KEY_HERE'
    }

    config.fog_directory  = 'MY_S3_BUCKET_HERE'
    config.fog_public     = false
end
于 2013-02-01T22:30:53.507 回答
0

我在中间人设置中遇到了类似的问题。

在控制台中我做了AWS_ACCESS_KEY='xxxxxx',在我的配置文件中我有ENV['AWS_ACCESS_KEY']. 它没有用。但是export AWS_ACCESS_KEY='xxxxx'使配置文件起作用。这是因为“导出标记要传递给环境中的子进程的每个名称”。而第一个没有。

希望你有同样的问题,这会有所帮助。

于 2014-02-15T04:11:59.397 回答
0

此错误可能意味着ENV['MY_KEY_ID']ENV['MY_KEY']nil

尝试用您从Amazon AWS我的帐户页面获取的字符串替换这些值。

所以:

CarrierWave.configure do |config|
    config.fog_credentials = {
        provider: 'AWS',
        aws_access_key_id: "YOUR ACCESS KEY ID",
        aws_secret_access_key: "YOUR SECRET KEY"
    }

    config.fog_directory  = "YOUR BUCKET NAME"
    config.fog_public     = false
end
于 2013-02-01T04:09:39.500 回答