如何设置Amazon S3,paperclip和ENV变量

时间:2015-02-10 23:33:04

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

我已尝试过许多不同的方法来使用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']
 }
}

以下是上传新图片时收到的错误消息:"我们计算的请求签名与您提供的签名不符。检查您的密钥和签名方法。"在线:"如果@ 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"] 

1 个答案:

答案 0 :(得分:7)

你可以做一件事:

您可以在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']
  }
}

如果要将此环境变量设置为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

使用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.

如果您需要我更多信息,请告诉我。