.bashrcに環境変数でAmazon S3の資格情報を格納することにより、Railsのアプリが失敗します
-
20-09-2019 - |
質問
私は、Amazon S3上のものを保存するためにクリップを使用して、レールのアプリを開発しています。 アプリはHerokuの上でホストされています。 私はUbuntuのカルマに開発しています。
私が説明しようとしています問題は(私のローカルホスト上)の開発で発生し、生産(Herokuの上)。
<時間>クリップするS3のcredsを渡すの標準的な方法は、そのように設定/ s3.ymlでそれらを置くことです
access_key_id: 12345678
secret_access_key: 903490409fdf09fshsfdoif/43432
私はこれを行うと、、すべてがうまく動作します。 //ドキュメント:のhttp - しかし、これはHerokuのは、別の方法を提案するので、それが困難な他の人と私のコードを共有することができます。 heroku.com/config-varsするます。
彼らはあなたがそうのようなあなたの.bashrcにあなたのS3_KEYとS3_SECRETを置くべきだと助言します:
S3_KEY=12345678
export S3_KEY
S3_SECRET=903490409fdf09fshsfdoif/43432
export S3_SECRET
そして、彼らはあなたが設定/初期化子/ 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と1から読み取ることができる2つのケースを持っています。
私のモデルはそうのような資格情報を参照します
has_attached_file :photo,
(some code removed)
:s3_credentials => "#{RAILS_ROOT}/config/initializers/s3.yml",
私は削除する場合は:モデルからs3_credentialsのハッシュを、stringify_keys誤差が消えるとレールコンソールはfind_credentials法の最後に表示されるエラーメッセージをスローします:つまり、「資格情報は、パス、ファイル、またはハッシュではありません」ます。
だから私は困惑します。私はこれが(私は実際に彼らはそれに答えることができることを期待してこのリンクを電子メールで送信するつもりです)Herokuので男性のための質問は、おそらくあることを認識し、それは可能性もthoughtbotでdoodsについて質問です。
私が最初に言ったように私は設定/ s3.ymlに私のキーとシークレットをこだわりの標準的なアプローチを取るとき、私のアプリが正常に動作しますが、それは物事がWAY容易になりますので、私はHerokuのは、お勧めの方法を使用することを好むだろう私とのために、それは他の人がパブリックドメインのうち、私のAPIキーを維持するためのGitでマージ任意の顧客を記述することなくドライバを使用するために、私は私の公共githubのページに私のレポを保存することができることを意味します。
私は、/ etc bash.bashrcだけでなく、〜/ .bashrcの中でENV変数を貼り付ける試みたと再起動した後、私はまだ同じ問題を抱えています。問題は、開発マシン上だけでなく、Herokuの上で発生します。私もHerokuのに私の設定-VARSを押すようにしてください行いました。
解決
ずっと検索した後、私はここで答えを見つけた - の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のドキュメントを更新するかどうかはわかりません。おかげで再びしかします。
他のヒント
config/initializers/s3.yml
とそれを試してみることにしたファイルconfig/initializers/s3.rb
の名前を変更します。
ここにあなたの問題です。
:bucket => ENV['S3_BUCKET'],
タグである必要があります
:bucket => <%= ENV['S3_BUCKET'] %>,
すなわち。割り当ては解釈されていません。