代码之家  ›  专栏  ›  技术社区  ›  Jimmy

回形针和亚马逊S3版

  •  4
  • Jimmy  · 技术社区  · 15 年前

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

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

    我以为我把钥匙和密匙贴错了,就再试了一次,但还是没有运气。我想这可能只是一把小车钥匙,我把它关掉,生成了一把新钥匙。仍然没有运气。

    现在,对于这两个键,我都使用了OSX上的S3浏览器应用程序,并且能够连接到每个键,查看我当前的bucket和添加/删除bucket。有什么我应该注意的吗?我的应用程序的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中的环境变量,我甚至尝试直接使用我的密钥,但它仍然不起作用。

    注意:我刚刚添加了(唯一名称)位,这些位实际上并不存在——我还验证了bucket名称,但我甚至不认为这会有什么进展。我还正确设置了Heroku环境变量,并在dev上设置了它们。

    3 回复  |  直到 12 年前
        1
  •  3
  •   ecoologic    12 年前

    你不是在装桶。它在您的s3.yml文件中,但您没有从调用中读取该值 has_attached_file .

    回形针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
    

    然后,当您在模型中设置回形针时,您引用如下值:

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

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

        2
  •  3
  •   chadoh    14 年前

    我一直这样 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
    

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

        3
  •  1
  •   x1a4    15 年前

    您的s3 yaml文件实际上正在使用字符串 ENV['S3_KEY'] ENV['S3_SECRET'] 作为S3的身份验证信息。它们不会被评估为Ruby代码。

    在将实际信息放入yaml文件之外,至少可以做一些事情。你可以 look into enabling ERB in your yaml configs 或者根本不使用yaml文件作为凭证,因为在您的每一个Rails环境中,您总是从环境中提取,所以在您的情况下,yaml文件只是一个额外的间接层,这是无用的。