如何设置Amazon S3,paperclip和ENV变量
我已经尝试了许多不同的方法来使用ENV变量设置S3以进行图像上传,并且无法使其工作。 我知道我的密钥和存储桶名称有效,因为当我将它们直接放入代码时,我的图像正确上传。 但是,当我尝试切换到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'] } }
以下是上传新图片时收到的错误消息:“我们计算的请求签名与您提供的签名不符。请检查您的密钥和签名方法。” 在线:“if @ 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"]
你可以做一件事:
您可以在development.rb
或production.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'] } }
如果要将此环境变量设置为local,请使用以下命令:
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
. ~/.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中是否添加了变量
有关详细信息,请参阅此处的表单。
如果您需要我更多,请告诉我..
- “identify”命令无法识别图像文件。 (Heroku的)
- 带有S3 on Rails 3的回形针/未初始化的常量AWS :: S3 :: Connection
- Paperclip / S3的“缺少必需:桶选项”
- 在aws-s3 gem和right_aws gem之间的Rails Paperclip冲突。 怎么解决?
- 使用Paperclip和Padrino
- 为什么Ruby open-uri打开在我的unit testing中返回一个StringIO,但在我的控制器中是一个FileIO?
- 密钥就在那里,但我仍然得到`fetch’:找不到密钥:“S3_BUCKET_NAME”(KeyError)
- 如何使用ruby将S3存储桶中的文件内容下载到内存中?
- 通过单击Amazon S3上托管的链接更改jPlayer上的歌曲