我对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进行样式设计......不确定是否重要,但以防万一。我很失落,所以任何帮助都会非常感激。非常感谢你!
答案 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'