8

私は、ペーパークリップを使用してAmazonS3にデータを保存するRailsアプリを開発しています。アプリはHerokuでホストされています。私はUbuntuKarmicで開発しています。

これから説明する問題は、開発(ローカルホスト上)と本番環境(Heroku上)で発生します。


S3クレジットをペーパークリップに渡す標準的な方法は、次のようにconfig/s3.ymlに配置することです。

access_key_id: 12345678
secret_access_key: 903490409fdf09fshsfdoif/43432

これを行うと、すべてが正常に機能します。ただし、これによりコードを他のユーザーと共有することが難しくなるため、Herokuは別の方法(http://docs.heroku.com/config-vars )を提案します。

彼らはあなたがあなたのS3_KEYとS3_SECRETをあなたの.bashrcに次のように入れるべきであるとアドバイスします:

S3_KEY=12345678
export S3_KEY
S3_SECRET=903490409fdf09fshsfdoif/43432
export S3_SECRET

次に、config / initializers / s3.yml(わずかに異なるパスに注意)を作成し、そのファイルに次のように配置することを提案します。

AWS::S3::Base.establish_connection!(
  :access_key_id     => ENV['S3_KEY'],
  :secret_access_key => ENV['S3_SECRET']
)

しかし、これを行うと、ペーパークリップがぐらつきをスローし、次のエラーメッセージを吐き出します。

undefined method `stringify_keys' for #<String:0xb6d6c3f4>

/vendor/plugins/paperclip/lib/paperclip/storage.rb:176:in `parse_credentials'
/vendor/plugins/paperclip/lib/paperclip/storage.rb:138:in `extended'
/vendor/plugins/paperclip/lib/paperclip/storage.rb:137:in `instance_eval'
/vendor/plugins/paperclip/lib/paperclip/storage.rb:137:in `extended'

.... other stuff 

つまり、明らかに、すべてがstorage.rbモジュール内で開始されています。スタックトレースをステップスルーします。

行176のparse_credentialsメソッドにフラグが付けられています-コードに表示される呼び出しは次のとおりです。

def parse_credentials creds
  creds = find_credentials(creds).stringify_keys
  (creds[RAILS_ENV] || creds).symbolize_keys
end

parse_credentialsメソッドは別のメソッドfind_credentialsを呼び出そうとしますが、これが問題であると私は信じています。find_credentialsのコードは次のとおりです。

def find_credentials creds
    case creds
    when File
      YAML::load(ERB.new(File.read(creds.path)).result)
    when String
      YAML::load(ERB.new(File.read(creds)).result)
    when Hash
      creds
    else
      raise ArgumentError, "Credentials are not a path, file, or hash."
    end
end

find_credentialsメソッドが.bashrcファイルから値を読み取るためにどのように装備されているかがわかりません。YAMLから読み取ることができるケースとハッシュを検索するケースが2つあります。

私のモデルは次のようにクレデンシャルを参照します:

  has_attached_file :photo,
                (some code removed)
                :s3_credentials => "#{RAILS_ROOT}/config/initializers/s3.yml",

モデルから:s3_credentialsハッシュを削除すると、stringify_keysエラーがなくなり、railsコンソールはfind_credentialsメソッドの最後に表示されるエラーメッセージをスローします。つまり、「クレデンシャルはパス、ファイル、またはハッシュではありません」。

だから私は困惑しています。これはおそらくHerokuの人たち(彼らが答えてくれることを期待してこのリンクを実際にメールで送信する予定です)の質問であり、thoughtbotのdoodsの質問でもあることを理解しています。

最初に言ったように、キーとシークレットをconfig / s3.ymlに貼り付けるという標準的なアプローチをとると、アプリは正常に動作しますが、Herokuが提案する方法を使用することをお勧めします。これにより、作業がはるかに簡単になります。つまり、自分のリポジトリをパブリックgithubページに保存して、他の人が使用できるようにすることができます。Gitでカスタマーマージドライバーを記述して、APIキーをパブリックドメインから除外する必要はありません。

enV変数をetc/bash.bashrcと〜/ .bashrcに貼り付けてみましたが、再起動しても同じ問題が発生します。問題は、Herokuだけでなく開発マシンでも発生します。config-varsもHerokuにプッシュするようにしました。

4

3 に答える 3

13

多くの検索の後、私はここで答えを見つけました-http://tammersaleh.com/posts/managing-heroku-environment-variables-for-local-development

秘訣は、S3.rbファイルを完全に削除し、次のようにモデル内のENV変数を参照することです。

has_attached_file :photo, 
                  #...
                  :storage        => :s3, 
                  :bucket         => ENV['S3_BUCKET'],
                  :s3_credentials => { :access_key_id     => ENV['S3_KEY'], 
                                       :secret_access_key => ENV['S3_SECRET'] }

とにかく、デビッド、あなたの提案に感謝します。Herokuのドキュメントを更新して、一部のユーザーがこの方法で更新する必要があると言うかどうかはわかりません。でもありがとう。

于 2010-02-17T03:01:04.477 に答える
2

ファイルの名前をに変更config/initializers/s3.ymlconfig/initializers/s3.rbて、試してみてください。

于 2010-02-16T20:16:43.107 に答える
1

これがあなたの問題です:

:bucket         => ENV['S3_BUCKET'],

する必要があります

:bucket         => <%= ENV['S3_BUCKET'] %>,

つまり、割り当ては解釈されていません。

于 2011-05-03T04:47:21.857 に答える