aws-s3错误:AWS :: S3 :: MissingAccessKey错误,但是键已定义?

时间:2011-08-19 13:05:12

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

我对ROR很新。我最近在heroku上部署了一个应用程序,并尝试通过回形针向应用程序添加附件功能。

我已经按照将aws-s3添加到我的应用程序的所有步骤。这是我的初始代码:

user.rb(model)

has_attached_file :avatar, 
                  :styles => {:small => "70x70>"},
                  :storage => :s3,
                  :s3_credentials => "#{RAILS_ROOT}/config/s3.yml",
                  :path => ":attachment/:id/:style/:basename.:extension"


validates_attachment_size :avatar, :less_than => 1.megabytes
validates_attachment_content_type :avatar, :content_type => ['image/jpeg', 'image/png']

s3.yml(文件位于config文件夹中)注意:所有这些存储桶都存在于我的aws-s3上

development:
  bucket: my_avatar-dev
  access_key_id: amazonaccesskey
  secret_access_key: amazon_secret_access_key
test:
  bucket: myapp_avatar-test
  access_key_id: amazonaccesskey
  secret_access_key: amazon_secret_access_key
production:
  bucket: myapp_avatar-pro
  access_key_id: amazonaccesskey
  secret_access_key: amazon_secret_access_key

的Gemfile

gem 'aws-s3'

运行此配置时,加载应用程序时会出现错误页面500错误。运行Heroku logs显示以下错误: AWS :: S3 :: MissingAccessKey(您未提供所需的访问密钥。

所以我遵循了一些建议,并使用以下代码行将key和secret_key定义为heroku的环境变量:

heroku config:add S3_KEY=amazonaccesskey S3_SECRET=amazon_secret_key

然后我添加了一个初始化程序来测试环境,并根据环境通过key或.yml文件启动,代码如下:

初​​始化/ s3.rb

if Rails.env == "production"
  # set credentials from ENV hash
  S3_CREDENTIALS = { :access_key_id => ENV['S3_KEY'], :secret_access_key => ENV['S3_SECRET'], :bucket => "myapp_avatar-pro"}
else
  # get credentials from YML file
  S3_CREDENTIALS = Rails.root.join("config/s3.yml")
end

然后将user.rb模型更新为以下内容:

has_attached_file :avatar, :storage => :s3, :s3_credentials => S3_CREDENTIALS

然后我部署到heroku并测试了应用程序,但我仍然遇到同样的错误(第500页)和错误代码: AWS :: S3 :: MissingAccessKey(您没有提供所需的访问密钥。< / strong>

如果我在heroku中定义了变量,这怎么可能?有什么我想念的吗?这可能是宝石的东西吗?此外,我正在使用HAML进行样式设计......不确定是否重要,但以防万一。我很失落,所以任何帮助都会非常感激。非常感谢你!

2 个答案:

答案 0 :(得分:0)

刚刚解决了同样的问题,拖着一些类似的帖子。我发现上面回答中的任何可能的配置,即使用.yml或使用初始化程序声明模型中的所有哈希值,只要S3存储桶是美国标准类型&gt,就可以在我的dev和heroku上正常工作;选择只是关于你想要的DRY。

当我最初设置S3时,我使用的是欧洲桶。这给了我一个虚假的错误信息:

AWS :: S3 :: MissingAccessKey(您未提供所需的访问密钥。

我在AWS网站上注意到:http://docs.amazonwebservices.com/general/latest/gr/index.html?rande.html AWS使用每个区域的特定端点地址来减少延迟,并且我猜测(因为我是新手编码器)美国标准是默认的或编码到AWS-S3插件中。 (也许有人可以将其编辑成更完整的答案?)

答案 1 :(得分:0)

我用这个解决了这个问题:

:s3_credentials => {
  :access_key_id => 'mykey',
  :secret_access_key => 'mykey'