如何设置 Amazon S3、回形针和 ENV 变量
How to set up Amazon S3, paperclip, and ENV variables
我尝试了很多不同的方法来使用 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']
}
}
这是我在上传新图片时收到的错误消息:"The request signature we calculated does not match the signature you provided. Check your key and signing method." 在线:"if @listing.save"。使用硬编码凭据上传的那些仍然可以在我的应用程序中看到。
我是 rails 的新手,看过这里和其他地方,包括 S3 和回形针文档,但找不到可行的解决方案。如果您需要查看任何其他代码,请告诉我。如果重要的话,我计划部署到 heroku,并且看到 figaro 应该可以很好地与 heroku 配合使用。谢谢你。
EDIT/UPDATE:对于以后阅读本文的其他人,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。
我的模型 (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']
}
}
如果你想将这个环境变量设置到本地然后使用这个:
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.
如果您还需要我,请告诉我..
我尝试了很多不同的方法来使用 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']
}
}
这是我在上传新图片时收到的错误消息:"The request signature we calculated does not match the signature you provided. Check your key and signing method." 在线:"if @listing.save"。使用硬编码凭据上传的那些仍然可以在我的应用程序中看到。
我是 rails 的新手,看过这里和其他地方,包括 S3 和回形针文档,但找不到可行的解决方案。如果您需要查看任何其他代码,请告诉我。如果重要的话,我计划部署到 heroku,并且看到 figaro 应该可以很好地与 heroku 配合使用。谢谢你。
EDIT/UPDATE:对于以后阅读本文的其他人,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。
我的模型 (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']
}
}
如果你想将这个环境变量设置到本地然后使用这个:
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
使用 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
详情请参考表格here.
如果您还需要我,请告诉我..