AWS::S3::Errors::NoSuchKey 没有这样的密钥

AWS::S3::Errors::NoSuchKey No Such Key

我在 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 设置的并且它们是有效的。

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

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

我无法在本地主机上重现该问题。

更新

我已经就这个问题展开了 issue report

这是我在 production.rd

中的 config.paperclip_defaults
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'] %>

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

我不认为它有任何其他含义。

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

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

来自 GitHub 回形针维基的文档

假设您正在使用 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