7

Heroku でアプリケーションを構築してデプロイしましたが、このアプリケーションの特定のプロセスがタイムアウトし始めました。緊急にそれらをバックグラウンド プロセスに移動する必要があります。

私はdelayed_jobを使用してこれを行い、これを設定する方法に関するHerokuのドキュメントの手順に注意深く従いました. ローカルでは、これは正常に機能しています。

ただし、本番環境では、遅延ジョブを作成すると 401 がスローされます。このエラーは、作成したコードではなく、アプリケーションの外部で発生しているようです。多くの Heroku 内部を扱っているように見えるので、私はこのエラーに完全に困惑しています。これらのタイプのエラーが発生したときに受け取る例外通知メールの一部を貼り付けます。

A Heroku::API::Errors::Unauthorized occurred in surveys#export:

Expected(200) <=> Actual(401 Unauthorized)
request => {:chunk_size=>1048576, :connect_timeout=>60, :headers=>{"Accept"=>"application/json", "Accept-Encoding"=>"gzip", "Authorization"=>"Basic Og==", "User-Agent"=>"heroku-rb/0.3.5", "X-Ruby-Version"=>"1.9.3", "X-Ruby-Platform"=>"x86_64-linux", "Host"=>"api.heroku.com:443"}, :instrumentor_name=>"excon", :mock=>false, :nonblock=>false, :read_timeout=>60, :retry_limit=>4, :ssl_ca_file=>"/app/vendor/bundle/ruby/1.9.1/gems/excon-0.16.4/data/cacert.pem", :ssl_verify_peer=>true, :write_timeout=>60, :host=>"api.heroku.com", :path=>"/apps/msu/ps", :port=>"443", :query=>nil, :scheme=>"https", :expects=>200, :method=>:get}
response => #<Excon::Response:0x0000000957d7e0 @body="{\"error\":\"Access denied\"}", @headers={"Cache-Control"=>"no-cache", "Content-Type"=>"application/json; charset=utf-8", "Date"=>"Tue, 13 Nov 2012 17:00:05 GMT", "Server"=>"nginx/1.2.3", "Status"=>"401 Unauthorized", "Strict-Transport-Security"=>"max-age=500", "X-Runtime"=>"11", "Content-Length"=>"25", "Connection"=>"keep-alive"}, @status=401>
vendor/bundle/ruby/1.9.1/gems/excon-0.16.4/lib/excon/connection.rb:290:in `request_kernel'

リクエスト:

  • URL : https://example.com/surveys/5/export
  • IP アドレス: 編集済み
  • パラメータ: {"action"=>"export", "controller"=>"forge/surveys", "id"=>"5"}
  • Rails ルート: /app
  • タイムスタンプ: 2012-11-13 12:00:06 -0500

バックトレース:

vendor/bundle/ruby/1.9.1/gems/excon-0.16.4/lib/excon/connection.rb:290:in `request_kernel'
vendor/bundle/ruby/1.9.1/gems/excon-0.16.4/lib/excon/connection.rb:101:in `request'
vendor/bundle/ruby/1.9.1/gems/heroku-api-0.3.5/lib/heroku/api.rb:62:in `request'
vendor/bundle/ruby/1.9.1/gems/heroku-api-0.3.5/lib/heroku/api/processes.rb:9:in `get_ps'
vendor/bundle/ruby/1.9.1/gems/workless-1.1.0/lib/workless/scalers/heroku_cedar.rb:18:in `workers'
vendor/bundle/ruby/1.9.1/gems/workless-1.1.0/lib/workless/scalers/heroku_cedar.rb:10:in `up'
vendor/bundle/ruby/1.9.1/gems/activesupport-3.2.6/lib/active_support/callbacks.rb:407:in `_run__4556705234962331285__create__3481342325198152291__callbacks'
vendor/bundle/ruby/1.9.1/gems/activesupport-3.2.6/lib/active_support/callbacks.rb:405:in `__run_callback'
vendor/bundle/ruby/1.9.1/gems/activesupport-3.2.6/lib/active_support/callbacks.rb:385:in `_run_create_callbacks'
vendor/bundle/ruby/1.9.1/gems/activesupport-3.2.6/lib/active_support/callbacks.rb:81:in `run_callbacks'
vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.6/lib/active_record/callbacks.rb:268:in `create'
vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.6/lib/active_record/persistence.rb:344:in `create_or_update'
vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.6/lib/active_record/callbacks.rb:264:in `block in create_or_update'

残りのバックトレースを削除しました。バックトレース内の何もアプリケーション内の何も参照していません。

どんな助けでも大歓迎です。

アップデート

これが調査エクスポートのコードです - かなり基本的なものです!

def export
  @survey.delay.export(current_user.email)
  flash[:notice] = "Your survey exports have been queued for processing and will be emailed to #{current_user.email} when complete."
  redirect_to forge_surveys_path
end
4

1 に答える 1

9

もちろん、バックトレースで呼び出されたさまざまなライブラリのソースを参照することで、これを理解しました。

最も関連性の高い行:

vendor/bundle/ruby/1.9.1/gems/heroku-api-0.3.5/lib/heroku/api/processes.rb:9:in `get_ps'

これは heroku-api gem を使用してワーカー プロセスを取得します。heroku-api gem のソースを参照すると、API 経由でリクエストを行うと、次のように接続が初期化されることがわかります。

@api_key = options.delete(:api_key) || ENV['HEROKU_API_KEY']
if !@api_key && options.has_key?(:username) && options.has_key?(:password)
  @connection = Excon.new("#{options[:scheme]}://#{options[:host]}", options.merge(:headers => HEADERS))
  @api_key = self.post_login(options[:username], options[:password]).body["api_key"]
end

私の環境には設定がありませんでしたENV['HEROKU_API_KEY']。私はHEROKU_PASSWORD同じデータを含むセットを持っていましたが、それはこの宝石が探しているものではありません. したがって、これで401エラーが発生しました。

Heroku のドキュメントに更新を送信し、手順の 1 つとしてこれを含めるように依頼します。現在は記載されていないためです。

これを修正するために、私は単純に次のことを行いました。

heroku config:add HEROKU_API_KEY=KEY

KEY は HEROKU_PASSWORD の値と同じです。( ですべての構成変数を表示できますheroku config)。

于 2012-11-13T20:24:25.533 に答える