我在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中的环境变量,我甚至尝试过直接使用我的密钥,它仍然无法正常工作
注意:我刚刚添加了(唯一名称)位,那些实际上并不存在 - 我还验证了存储桶名称,但我甚至认为这没有达到那么远。我也正确地设置了我的heroku环境变量,并在dev
上设置它们答案 0 :(得分:3)
您没有设置存储桶。它位于您的s3.yml文件中,但您没有通过调用has_attached_file
来读取该值。
Paperclip S3文档: 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文件(实际上,您不应该这样做。)
答案 1 :(得分:3)
我一直遇到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
我想这对某些人来说可能有点间接,但对我来说这似乎是最干净的实施。
答案 2 :(得分:1)
您的s3 yaml文件实际上使用字符串ENV['S3_KEY']
和ENV['S3_SECRET']
作为s3的身份验证信息。它们没有被评估为ruby代码。
除了将实际信息放入yaml文件之外,至少还有一些事情可以做。您可以look into enabling ERB in your yaml configs或者根本不使用yaml文件作为您的凭据,因为您总是从每个rails_env中的环境中拉出来,因此yaml文件只是您案例中的一个额外的间接层那是没用的。