如何设置亚马逊S3,回形针和ENV变量
我已经尝试了很多不同的方法来设置S3使用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”。那些上传的凭据硬编码仍然可以在我的应用程序中看到。
我对轨道相当陌生,看过这里和其他地方,包括S3和回形针文档,并找不到可行的解决方案。如果您需要查看其他代码,请告诉我。我计划部署到heroku,如果这很重要,并且看到figaro应该和heroku一起玩。谢谢。
编辑/更新:对于未来阅读此文的其他人,Sachin的答案如下。但是,我的一个密钥ID中有一个“+”。当试图通过命令行添加ENV变量时,'+'(包括它)之后的所有字符都被截断。简单地把它们包装在“”中,你应该很好走。
另外,我放弃了使用figaro gem,并设置了aws.rb初始化文件(根据Amazon的说明)。以下是文件的内容:
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。
而我的模型中的代码(列表。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']
}
}
如果要设置这个环境变量到设定了该配置本地然后使用此:
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的与heroku config
更多的细节可以参考表格here.
让我知道,如果你需要我更多..
哇,太感谢你了详细的解答。在我可以试用这个试验前几个小时,但我一定会告诉你它是如何发生的。谢谢! – David 2015-02-11 11:58:11
不客气。 :) – 2015-02-12 04:32:18
我完全一样,试图上传新图像时仍然出现此错误:我们计算的请求签名与您提供的签名不匹配。检查你的密钥和签名方法。我假设我需要围绕存储桶名称和密钥的引号。也许这是问题?当我从命令行执行回显以检查它们时,它们就在那里。我的模型中的代码是否正确(listing.rb)?这太令人生气了。谢谢你的帮助。 – David 2015-02-12 23:37:44