@kyanny's blog

My thoughts, my life. Views/opinions are my own.

line-bot-sdk-ruby のサンプル echobot を Heroku で動かす方法

2016/10/06 14:59 追記 コメント欄参照。IPアドレスをホワイトリストに登録する必要は無いのでHTTPプロキシを通す必要もなく、従ってサンプルコードは無改変で動く模様。以下の内容は全て徒労だった。


Gemfile.lock とか config.ru を足して、固定グローバル IP で LINE Messaging API にアクセスするように HTTP プロキシを通せばよい。それらが設定済みの Deploy できるリポジトリはこちら↓

github.com

...が、 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 プロキシを通すようなコード例もあった。

だが、これらのコードを使って Heroku にデプロイしたところ、いずれもうまく動作しなかった。

  • https://github.com/line/line-bot-sdk-ruby/pull/20 のコードだと、何故か HTTP プロキシの設定が消えてしまった http オブジェクトでリクエストが発行されてしまい、許可されていないグローバル IP アドレス経由でのリクエストとなり NG
  • RestClient と HTTPClient を利用した HTTP クライアントオブジェクトを利用するコードでは、 HTTP ヘッダをうまく引き回せず LINE Messaging API のアクセス認証エラーが発生してしまい NG

教訓

  • 他人の書いたコードを鵜呑みにしないこと。そのまま動くと思わないこと。テストが書かれていても「テストごと間違っているかもしれない」と疑ってかかること。
  • ログを出力していないコードをそのまま動かさないこと。ログを必要なだけ仕込むこと。