如何设置Amazon S3、Paperclip和环境变量

4

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

我使用了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中硬编码值时,一切正常。但是当我尝试替换环境变量时,一切都崩溃了。

在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 和 paperclip 文档,但找不到可行的解决方案。如果您需要查看其他代码,请告诉我。我打算部署到 Heroku,如果有关系的话,我看到 figaro 应该能够很好地与 Heroku 协作。谢谢。
编辑/更新:对于未来阅读此内容的其他人,Sachin 下面的答案起作用了。但是,我的一个密钥 ID 中有一个 '+'。尝试通过命令行添加环境变量时,所有字符都被截断了。只需将它们包装在""中,您就可以继续了。
此外,我放弃使用 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文件现在具有以下作为paperclip默认值:

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个回答

8
你可以做一件事情:
你可以在你的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 config 检查变量是否已添加至 Heroku。

如需了解更多细节,请参考此处

如果需要更多帮助,请告知我。


哇,非常感谢你详细的回答。我会在几个小时后尝试一下这个方法,但是我一定会告诉你结果如何的。谢谢! - David
我完全按照这个做了,但在尝试上传新图片时仍然出现以下错误:我们计算的请求签名与您提供的签名不匹配。请检查您的密钥和签名方法。我猜我需要在存储桶名称和密钥周围加上引号。也许这就是问题所在?当我从命令行执行echo来检查它们时,它们确实存在。我的模型代码(listing.rb)是否正确?这真是令人发狂。感谢您的帮助。 - David
Sachin - 我终于让它工作了。问题在于我的一个键中有一个“+”,当我使用命令行将其设置为ENV变量时,它会被省略掉。所以我把它放在""中,这样就可以工作了!终于!再次感谢。 :) - David

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接