2011-08-19 137 views
2

我对ROR很新。我最近在heroku上部署了一个应用程序,并试图通过回形针将附件功能添加到应用程序。aws-s3错误:AWS :: S3 :: MissingAccessKey错误,但密钥已定义?

我遵循了将aws-s3添加到我的应用的所有步骤。这是我最初的代码:

user.rb(模型)

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(你没有要求两者的访问密钥提供

所以我也跟着一些建议,并定义键和SECRET_KEY作为环境变量的Heroku,使用以下行代码:

heroku config:add S3_KEY=amazonaccesskey S3_SECRET=amazon_secret_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(您没有提供两个必需的访问密钥。

如果我已经定义了heroku中的变量,这怎么可能?有什么我失踪?这有可能是宝石的东西吗?另外,我正在使用HAML进行造型......不确定这一点是否重要,但仅限于此。我很迷茫,所以任何帮助将不胜感激。非常感谢!

+0

你找出答案吗?我遇到了同样的问题。谢谢。 – noob

回答

0

刚刚通过相同的问题,并拖网了一些类似的职位。我发现上述答案中的任何可能的配置,即声明模型中的所有哈希值,使用.yml或使用初始值设定值,只要S3桶是美国标准类型,就可以在我的开发者和heroku上正常工作>选择是关于你想干什么。

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

AWS :: S3 :: MissingAccessKey(您没有提供要求两者访问键

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

0

我解决了这个问题,这一点:

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