2010-06-11 80 views
4

我有一个在Heroku上运行的rails应用程序。我使用回形针对于一些简单的图片上传用户头像和一些其他的东西,我有S3设置为我的后端,一切似乎是工作的罚款试图推到S3我收到以下错误时除外:回形针和Amazon 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

回答

3

您没有设置存储桶。它在你的s3.yml文件中,但是你没有读到你拨打has_attached_file的值。

回形针S3文档: http://rubydoc.info/gems/paperclip/Paperclip/Storage/S3#s3_protocol-instance_method

此外,要注意那些谁告诉你不要使用s3.yml文件,对Heroku的人。这是一种浪费,只是增加了一无所获的抽象。您已经使用所需的值设置了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 

然后,当你在你的模型设置回形针,你参考值是这样的:

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

显然,这意味着你做不想在你的git仓库中拥有你的s3.yml文件(真的,你不应该)。

+0

尽管如此,请检查原始帖子中的错误。它表明access_key_id甚至没有被接受,所以桶不会在场。 – x1a4 2010-06-11 02:04:11

+0

它没有任何意义,但内联我的访问键(即使他们是环境变量)工作......我不知道为什么,我遵循Heroku的建议T,但这最终工作,谢谢! – Jimmy 2010-06-11 03:19:14

+0

难道你不能只添加s3.yml到你的git忽略列表,所以它不会显示在Heroku上? – Kevin 2010-06-11 15:22:03

1

您的S3 yaml文件实际上使用字符串ENV['S3_KEY']ENV['S3_SECRET']作为s3的身份验证信息。他们没有被评估为红宝石代码。

至少有几件事情可以在将实际信息放入yaml文件之外完成。你可以使用look into enabling ERB in your yaml configs或者根本就不使用yaml文件,因为你总是从每个rails_envs的环境中拉出来,所以yaml文件在你的情况下只是一个额外的间接层,没有用处。

+0

+1这是另一个有用的链接,从Heroku的博客 - http://blog.heroku.com/archives/2009/4/7/config-vars/ – Anurag 2010-06-11 00:49:45

+0

这就是我正在做的 – Jimmy 2010-06-11 00:52:29

+0

@Jimmy这不是你正在做。您将ENV文件放在yaml文件中,其中*不会被视为Ruby代码*。 Heroku博客文章中的示例将ENV评估放入类本身,当然这也很好,并且不需要在s3.yml文件中分别为每个环境声明它。 – x1a4 2010-06-11 01:11:41

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 

我想这可能会一点点太间接了一些人,但它似乎是最干净的实施给我。

+0

你是我的完整英雄! – altuzar 2016-01-29 22:20:28