LINE Bot API の HTTPS Callback は Amazon API Gateway を使うと簡単便利安価で最高

追記 (4/15)

現在は Let's Encrypt の証明書が利用できるようになっているようです。なので「https で Callback が受け取れない」と言う理由のためだけに Amazon API Gateway を使う必要も無くなりました。


LINE Bot API は Callback URL が https のみで、しかも Let's Encrypt や StartSSL と言った無料の証明書が使えない。どうにか安価で Bot を動かしたいとなると Heroku のようなドメインを指定しなければ Wildcard 証明書が割り当てられている PaaS を使うのが一般的でしょう。

しかし Heroku は外に抜ける IP アドレスがどんどん変わっていくので、 Bot API の IP Whitelist に登録することが出来ない。仕方無いので Heroku に rack-reverse-proxy を置いて、あとはさくらの VPS のような固定 IP アドレスのあるサーバで Bot を動かすようにしました。

# Receive Callback
[LINE Bot API Callback] -- https --> [Heroku] -- https (Let'sEncrypt とか) --> [VPS]

# Call REST API
[VPS] -- https --> [LINE Bot REST API]

しかし Heroku の無料枠では一日 18 時間までしか動かせないし、一旦インスタンスが落ちるとちょっとレスポンスに時間がかかって不便。 そもそも Heroku の 1 インスタンスを使って単なる Reverse Proxy を建てるのも富豪すぎる。

一日中 Bot に話し掛けていたら Heroku の稼動時間が 18 時間を越えてしまったので、最初は「Heroku のインスタンスにカネ払うか~」と思っていたけど 7USD もあったら、もう少しで RapidSSL の証明書買えちゃうしな…。そんな時に見付けたのが Amazon API Gateway でした。

API Gateway って何?

オシャレな Reverse Proxy です。料金もだいぶ安そう。

Amazon API Gateway の無料利用枠では、最大 12 か月間、1 か月あたり 100 万回の API 呼び出しを利用できます。1 か月あたりの呼び出しがこの数値を超えると、API Gateway のレートで課金されます。

LINE Bot API の Callback に設定する方法

だいたいこれ読めばよい。

dev.classmethod.jp

ポイントとしては、 API Gateway の HTTP Proxy はパラメータや Body は転送してくれるけど、 HTTP Header は個別に指定しないと転送してくれない点です。 LINE Bot API の Callback には X-LINE-ChannelSignature が付いてくるので、それを転送するようにします。

あとは API Gateway をデプロイして出てきた URL を LINE Developers に登録します。

動作としては Heroku に Reverse Proxy を建てていたころと全く同じです。

# Receive Callback
[LINE Bot API Callback] -- https --> [API Gateway]  -- https (Let'sEncrypt とか) --> [VPS]

# Call REST API
[VPS] -- https --> [LINE Bot REST API]

Amazon API Gateway なら Heroku の無料枠と違ってインスタンスの稼動時間に制限は無いので快適に Callback を受け取ることが出来ます。