2016/10/06 14:59 追記 コメント欄参照。IPアドレスをホワイトリストに登録する必要は無いのでHTTPプロキシを通す必要もなく、従ってサンプルコードは無改変で動く模様。以下の内容は全て徒労だった。
Gemfile.lock とか config.ru を足して、固定グローバル IP で LINE Messaging API にアクセスするように HTTP プロキシを通せばよい。それらが設定済みの できるリポジトリはこちら↓
...が、 HTTP プロキシを通すようにするだけのことで異常にハマった。結論として、必要最小限のメソッドをオーバーライドするのが良い。オリジナルの app.rb
との Diff はこんな感じ。
Comparing c2f3dd962772b2c8a2cda05528ff643d750b5597...v1.0.0 · kyanny/line-echobot-heroku · GitHub
+module Line + module Bot + class HTTPClient + def http(uri) + proxy = URI(ENV["FIXIE_URL"]) + http = Net::HTTP.new(uri.host, uri.port, proxy.host, proxy.port, proxy.user, proxy.password) + if uri.scheme == "https" + http.use_ssl = true + end + + http + end + end + end +end
line-bot-sdk-ruby 自体に HTTP クライアントオブジェクトを差し替える機能があり、それを利用して Heroku で Fixie を使って HTTP プロキシを通すようなコード例もあった。
- https://github.com/line/line-bot-sdk-ruby/pull/20
- https://github.com/line/line-bot-sdk-ruby/pull/24 (テストコードの中で、 RestClient や HTTPClient を使う例がある)
だが、これらのコードを使って Heroku にデプロイしたところ、いずれもうまく動作しなかった。
- https://github.com/line/line-bot-sdk-ruby/pull/20 のコードだと、何故か HTTP プロキシの設定が消えてしまった http オブジェクトでリクエストが発行されてしまい、許可されていないグローバル IP アドレス経由でのリクエストとなり NG
- RestClient と HTTPClient を利用した HTTP クライアントオブジェクトを利用するコードでは、 HTTP ヘッダをうまく引き回せず LINE Messaging API のアクセス認証エラーが発生してしまい NG
教訓
- 他人の書いたコードを鵜呑みにしないこと。そのまま動くと思わないこと。テストが書かれていても「テストごと間違っているかもしれない」と疑ってかかること。
- ログを出力していないコードをそのまま動かさないこと。ログを必要なだけ仕込むこと。