【问题标题】:How to set up Amazon S3, paperclip, and ENV variables如何设置 Amazon S3、回形针和 ENV 变量
【发布时间】:2015-02-16 06:44:11
【问题描述】:

我尝试了许多不同的方法来设置 S3,使用 ENV 变量进行图像上传,但无法使其正常工作。我知道我的密钥和存储桶名称有效,因为当我将它们直接放入代码中时,我的图像会正确上传。但是,当我尝试切换到 ENV 变量时,事情就不起作用了。

我使用了 figaro gem,它创建了 application.yml。在那个文件中,我有:

S3_BUCKET_NAME "xxxxx"
AWS_ACCESS_KEY_ID: "AAAAAAAAA"
AWS_SECRET_ACCESS_KEY: "BBBbbbBBBB"

不确定那里是否应该有任何引号,但现在,我有它们。我也试过没有。

在我的模型 (listing.rb) 中,我有:

has_attached_file :image, 
  :styles => { :medium => "200x" , :thumb => "100x100" }, 
  :default_url => "default.png",
  :storage => :s3,
  :s3_credentials => Proc.new{|a| a.instance.s3_credentials }

def s3_credentials
  {:bucket => ENV["S3_BUCKET_NAME"], :access_key_id => ENV["AWS_ACCESS_KEY_ID"], 
  :secret_access_key => ENV["AWS_SECRET_ACCESS_KEY"]
end

就像我说的,当我将值硬编码到 def s3_credentials 中时,一切正常。只是当我尝试换掉 ENV 变量时,事情就崩溃了。

在 paperclip.rb 中,我有:

Paperclip::Attachment.default_options[:s3_host_name] = 's3-us-west-2.amazonaws.com'

我在 production.rb 和 development.rb 中也有这段代码:

config.paperclip_defaults = {
 :storage => :s3,
 :s3_credentials => {
 :bucket => ENV['S3_BUCKET_NAME'],
 :access_key_id => ENV['AWS_ACCESS_KEY_ID'],
 :secret_access_key => ENV['AWS_SECRET_ACCESS_KEY']
 }
}

这是我在上传新图像时收到的错误消息:“我们计算的请求签名与您提供的签名不匹配。请检查您的密钥和签名方法。”在线:“如果@listing.save”。使用硬编码凭据上传的那些仍然可以在我的应用程序中看到。

我对 Rails 还很陌生,已经看过这里和其他地方,包括 S3 和回形针文档,但找不到可行的解决方案。如果您需要查看任何其他代码,请告诉我。如果这很重要,我计划部署到 heroku,并且看到 figaro 应该可以很好地与 heroku 配合使用。谢谢你。


编辑/更新:对于以后阅读本文的其他人,Sachin 的回答如下。但是,我的一个密钥 ID 中有一个“+”。尝试通过命令行添加 ENV 变量时,“+”(包括它)之后的所有字符都被截断。只需将它们包裹在“”中,您就可以开始使用了。

另外,我放弃了使用 figaro gem,并设置了一个 aws.rb 初始化文件(根据亚马逊的说明)。以下是该文件的内容:

AWS.config(
  :access_key_id => ENV['AWS_ACCESS_KEY_ID'],
  :secret_access_key => ENV['AWS_SECRET_ACCESS_KEY']
)

S3_BUCKET = AWS::S3.new.buckets[ENV['S3_BUCKET']]

我不知道这是否有什么不同,但我的 development.rb 和 production.rb 文件现在具有以下作为回形针默认值:

config.paperclip_defaults = {
 :storage => :s3,
 :bucket => "your_real_bucket_name_here_in_quotes",
 :s3_credentials => {
  :access_key_id => ENV['AWS_ACCESS_KEY_ID'],
  :secret_access_key => ENV['AWS_SECRET_ACCESS_KEY']
 }
}

还要注意将 ENV 存储桶名称称为 S3_BUCKET 与 S3_BUCKET_NAME 的切换。

我的模型 (listing.rb) 中的代码现在是这样的:

has_attached_file :image, :styles => { :medium => "200x", :thumb  "100x100"}, :default_url => "default.png", :storage => :s3, :bucket => "your_real_bucket_name_here_in_quotes"

validates_attachment_content_type :image, :content_type => ["image/jpg", "image/jpeg", "image/png", "image/gif"] 

【问题讨论】:

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


    【解决方案1】:

    你可以做一件事:

    您可以在development.rbproduction.rb 中设置此配置

    config.paperclip_defaults = {
      :storage => :s3,
      :s3_credentials => {
        :bucket => ENV['S3_BUCKET_NAME'],
        :access_key_id => ENV['AWS_ACCESS_KEY_ID'],
        :secret_access_key => ENV['AWS_SECRET_ACCESS_KEY']
      }
    }
    

    如果您想将此环境变量设置为本地,请使用:

    sudo nano ~/.profile
    

    然后在这里添加你的变量

    export S3_BUCKET_NAME="your bucket name"
    export AWS_ACCESS_KEY_ID="your access key id"
    export AWS_SECRET_ACCESS_KEY="your secret access key"
    

    然后用. ~/.profile重新加载你的~/.profile

    echo $S3_BUCKET_NAME检查添加的变量

    对于Heroku

    你可以像这样设置你的变量:

    heroku config:set S3_BUCKET_NAME="your bucket name"
    heroku config:set AWS_ACCESS_KEY_ID="your access key id"
    heroku config:set AWS_SECRET_ACCESS_KEY="your secret access key"
    

    使用heroku config检查heroku中是否添加了变量

    更多详情请参考here.

    如果您还需要我,请告诉我..

    【讨论】:

    • 哇,非常感谢您的详细回答。我要过几个小时才能尝试一下,但我一定会让你知道它是怎么回事。谢谢!
    • 我确实这样做了,但在尝试上传新图像时仍然出现此错误:我们计算的请求签名与您提供的签名不匹配。检查您的密钥和签名方法。我假设我需要在存储桶名称和键周围加上引号。也许这就是问题所在?当我执行 echo 从命令行检查它们时,它们就在那里。我的模型中的代码是否正确(listing.rb)?这令人抓狂。感谢您的帮助。
    • Sachin - 我终于让它工作了。问题是我的一个键中有一个“+”,当我使用命令行将它设置为 ENV 变量时,它会被忽略。所以我把它放在“”中,这很有效!最后!再次感谢。 :)
    猜你喜欢
    • 2011-03-27
    • 1970-01-01
    • 2011-12-27
    • 1970-01-01
    • 2014-08-03
    • 2012-12-03
    • 2011-11-07
    • 1970-01-01
    • 2013-05-26
    相关资源
    最近更新 更多