AWS :: S3 ::错误:: NoSuchKey没有这样的密钥

时间:2015-09-23 20:00:42

标签: ruby-on-rails heroku amazon-s3 paperclip aws-sdk

我在Heroku上运行了一个带有Paperclip的Rails 4应用程序。我最近开始遇到一个问题,阻止我更新任何附加图像的模型。例如,每当我通过网站的CMS系统更改为Company模型时,都不会保存更改。我试过只改变图像,图像和各种其他属性,只改变非图像属性。好像在我的控制器的更新操作中永远不会调用@company.save

我找到this issue report并尝试了各种解决方案,但没有任何效果。

这是我的Company模型:

class Company < ActiveRecord::Base
    has_attached_file :logo, :styles => { :medium => "300x300>", :thumb => "100x100>" }
    validates_attachment_content_type :logo, :content_type => /\Aimage\/.*\Z/
end

在我的日志中,我收到以下错误:

[AWS S3 404 0.022711 0 retries] head_object(:bucket_name=>"myApp",:key=>"companies/profile_photos/000/000/118/original/2015-09-05_19.05.34.jpg") AWS::S3::Errors::NoSuchKey No Such Key

我验证了我的S3凭据是使用heroku config设置的,并且它们是有效的。

我不确定,但我怀疑这可能与我最近添加的以下buildpack有关:

=== myApp Buildpack URLs
1. https://github.com/bobbus/image-optim-buildpack.git
2. https://github.com/heroku/heroku-buildpack-ruby.git

我无法在localhost上重现该问题。

更新

此后我就这个问题打开了issue report

以下是config.paperclip_defaults

中的production.rd
config.paperclip_defaults = {
    :storage => :s3,
    :s3_protocol => :https,
    :s3_host_name => 's3.amazonaws.com',
    :s3_credentials => {
        :bucket => ENV['S3_BUCKET_NAME'],
        :access_key_id => ENV['AWS_ACCESS_KEY_ID'],
        :secret_access_key => ENV['AWS_SECRET_ACCESS_KEY']
    }
}

这是我的aws.yml

development:
  access_key_id: <%= ENV['AWS_ACCESS_KEY_ID'] %>
  secret_access_key: <%= ENV['AWS_SECRET_ACCESS_KEY'] %>

production:
  access_key_id: <%= ENV['AWS_ACCESS_KEY_ID'] %>
  secret_access_key: <%= ENV['AWS_SECRET_ACCESS_KEY'] %>

2 个答案:

答案 0 :(得分:2)

GitHub paperclip wiki的文档

假设您使用的是dotenv-rails ...

在development.rb和production.rb文件中:

config.paperclip_defaults = {
  storage: :s3,
  s3_host_name: ENV['S3_HOST_NAME'],
  bucket: ENV['S3_BUCKET_NAME']
}

确保在Heroku环境中设置这些变量:

$ heroku config:set S3_HOST_NAME=your-s3-hostname-here S3_BUCKET_NAME=your-production-bucket-name-here

Paperclip-with-Amazon-S3

来自rubydoc.info的文档

这表明你应该有一个指定了这些细节的yaml文件,或者在你的模型上写一个方法。

rubydoc.info Paperclip::Storage::S3

答案 1 :(得分:1)

No Such Key是S3说“404 Not Found”的方式。

我不相信它有任何其他含义。

请求已获得授权且语法有效,但指定路径中的存储桶中没有文件。

您可能希望从AWS控制台检查存储桶的内容。