Paperclip和Amazon S3问题

我有一个在Heroku上运行的rails应用程序。 我正在使用回形针进行一些简单的图像上传用户头像和其他一些东西,我将S3设置为我的后端,一切似乎都工作正常,除了尝试推送到S3时我收到以下错误:

The AWS Access Key Id you provided does not exist in our records. 

我以为我错误地粘贴了我的访问密钥和密钥,我再次尝试,仍然没有运气。 想想也许它只是一个有缺陷的钥匙我停用它并生成一个新的。 仍然没有运气。

现在对于这两个键,我在OS X上使用了S3浏览器应用程序,并且能够连接到每个键并查看我当前的存储桶并添加/删除存储桶。 有什么我应该注意的吗? 我有我的应用程序的S3和回形针设置就像这样

 development: bucket: (unique name) access_key_id: ENV['S3_KEY'] secret_access_key: ENV['S3_SECRET'] test: bucket: (unique name) access_key_id: ENV['S3_KEY'] secret_access_key: ENV['S3_SECRET'] production: bucket: (unique_name) access_key_id: ENV['S3_KEY'] secret_access_key: ENV['S3_SECRET'] has_attached_file :cover, :styles => { :thumb => "50x50" }, :storage => :s3, :s3_credentials => "#{RAILS_ROOT}/config/s3.yml", :path => ":class/:id/:style/:filename" 

编辑注意:ENV [‘S3_KEY’]和ENV [‘S3_SECRET’]是heroku中的环境变量,我甚至试过直接使用我的键,它仍然不起作用

注意:我刚刚添加了(唯一名称)位,那些实际上并不存在 – 我还validation了存储桶名称,但我甚至认为这没有达到那么远。 我也正确设置了我的heroku环境变量并在dev上设置它们

你没有设置一个桶。 它位于你的s3.yml文件中,但是你没有从你对has_attached_file的调用中读取这个值。

Paperclip S3 docs: http : //rubydoc.info/gems/paperclip/Paperclip/Storage/S3#s3_protocol-instance_method

另外,请注意那些告诉你不要使用Heroku的s3.yml文件的人。 这是一种浪费,只是添加了抽象,无需购买任何东西。 您已经使用所需的值设置了ENV,因此请使用它们。

我之前已经完成了这个,我不想将s3.yml文件推送到Heroku,但我确实想用一个来测试和开发。 在初始化程序中,您可以执行以下操作:

 # If an s3.yml file exists, use the key, secret key, and bucket values from there. # Otherwise, pull them from the environment. if File.exists?("#{Rails.root}/config/s3.yml") s3_config = YAML.load_file("#{Rails.root}/config/s3.yml") S3[:key] = s3_config[Rails.env]['key'] S3[:secret] = s3_config[Rails.env]['secret'] S3[:bucket] = s3_config[Rails.env]['bucket'] else S3[:key] = ENV['S3_KEY'] S3[:secret] = ENV['S3_SECRET'] S3[:bucket] = ENV['S3_BUCKET'] end 

然后,当您在模型中设置Paperclip时,可以像这样引用值:

 ... :s3_credentials => { :access_key_id => S3[:key], :secret_access_key => S3[:secret] }, :bucket => S3[:bucket] 

显然,这意味着您不希望在您的git存储库中拥有您的s3.yml文件(实际上,您不应该这样做)。

我一直得到相同的AWS::S3::InvalidAccessKeyId错误,并且有一个非常相似的s3.yml文件。 正如x1a4推荐的那样,我在我的yaml文件中使用了ERB并且它有效。 这是现在的样子:

 # myapp/config/s3.yml development: &DEFAULTS bucket: myapp_dev access_key_id: <%= ENV['S3_KEY'] %> secret_access_key: <%= ENV['S3_SECRET'] %> test: <<: *DEFAULTS bucket: myapp_test production: <<: *DEFAULTS bucket: myapp staging: <<: *DEFAULTS bucket: myapp_staging 

我想这对某些人来说可能有点间接,但对我来说这似乎是最干净的实施。

你的s3 yaml文件实际上是使用字符串ENV['S3_KEY']ENV['S3_SECRET']作为s3的auth信息。 它们没有被评估为ruby代码。

除了将实际信息放入yaml文件之外,至少还有一些事情可以做。 您可以在yaml配置中查看启用ERB,或者根本不使用yaml文件作为您的凭据,因为您总是从每个rails_env中的环境中提取,因此yaml文件只是一个额外的间接层在你的情况下是没用的。