如何设置亚马逊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.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的与heroku config

更多的细节可以参考表格here.

让我知道,如果你需要我更多..

+0

哇,太感谢你了详细的解答。在我可以试用这个试验前几个小时,但我一定会告诉你它是如何发生的。谢谢! – David 2015-02-11 11:58:11

+0

不客气。 :) – 2015-02-12 04:32:18

+0

我完全一样,试图上传新图像时仍然出现此错误:我们计算的请求签名与您提供的签名不匹配。检查你的密钥和签名方法。我假设我需要围绕存储桶名称和密钥的引号。也许这是问题?当我从命令行执行回显以检查它们时,它们就在那里。我的模型中的代码是否正确(listing.rb)?这太令人生气了。谢谢你的帮助。 – David 2015-02-12 23:37:44