いや、まだ絶賛苦戦中なんですが。。。
ひとまず、落ち着きました。
まぁ、LINEのBOTが話題に上がったので、試そうとしたんですが、 スキル不足でつまずいたところを書いておきます。
調子こいてAWS API GatewayとLambdaでやろうとした
これができたらサーバー管理いらずにプログラムだけで完結できるんですが、
残念ながら、LINE BOTにWHITE LISTという形で許可するIPアドレスを指定しないといけなく、 LambdaはIPアドレスが不明なので、上手く許可できませんでした。
適当にAWSのリージョンのIPアドレス調べて入れようかと思ったんですが、 残念ながらマスクが24-30のレンジでしか受け付けてくれなかったので断念。。。
(2016/05/19) これに関しては改善されたようで、サーバーレスで構築できるようになりました。
コールバックの書き方が判らなかった
設定でCallback URLが必要なのですが、 https://mydomain.com/sample/callbackとやってもダメで、 ただしくは https://example.com:443/sample/callback と、SSLのポート番号を入れてあげる必要がありました。
コールバックはSSL必須、そしてSSLきちんと張っているドメイン持っていなかった
当初、AWS API Gatawayでって考えてたのでxxxxxxxxx.execute-api.region.amazonaws.com的なドメイン使ったら良いわ、 って思っていたのですが、Lambdaの夢破れてしまい、個人ドメインの無料証明書をStartSSLで作りました。
この後、問題が発生?するので、これで解決するかどうかは疑問です。
なぜかJSONパースエラーがでる
{ "statusCode": "400", "statusMessage": "Failed to parse json data. Please check json data is well-formed." }
投稿のフォーマットの"to"の項目を配列にし忘れていた。。。
{ "to":["{$from}"], "toChannel":1383378250, "eventType":"{$event_type}", "content":{ "toType":1, {$content} } }
投稿する際の"to"の項目ですが、to自体を配列として渡さないといけないので、
誤)$post["to"] = $content->from
正)$post["to"][] = $content->from
上記の様に配列に入れた後、json変換すればOKでした。
なんだかコンテンツタイプで怒られる
{ "statusCode": "422", "statusMessage": "contentType is not valid : 0" }
結局、原因は判らなかったのですが、上記のJSONエラーを修正していたら、エラーが消えていた。。。 でも、結局、JSONフォーマットが悪かったのかな。
どうもLINE BOTのコールバック指定したURLにメッセージ飛んでこない
アクセスログを見てもどうも来ない。LINE BOTが来たよっていう足跡が残らない。。。
そこで、API Gatewayをプロキシにして、プログラムを叩くと、ログにも残ったし、返事のメッセージもきちんと送れました。
LINE BOT -> (☓) ->おいらのサーバーのプログラム
LINE BOT -> (○) ->API Gateway ->おいらのサーバーのプログラム
うーん、証明書は入れたつもりなんですけどね。