LINE BOT APIとAWSと帰省

拝啓、おとうさん、おかあさん、お元気ですか。

ぼくはいま、ゴールデンウィークで、実家に帰ってきています。

なので、おとうさん、おかあさんは、ぼくから見て右斜め前方3m地点に座っています。

お元気そうですね。

ぼくはあんまり元気じゃないです。

f:id:kyabatalian:20160502150306j:plain

一昨日は寝込んでいたのですが、昨日は熱もだいぶ下がってインターネッツと戯れていたので、その内容を久しぶりにブログに書こうと思い立ちました。前回ブログを書いたのは年明け。それから早くも4ヶ月が経とうとしています。2016年はもう3分の1が終わりましたね。吐きそう。

概要

LINE BOT Trial APIを使って、LINE BOT を作ってみました。
LINEが4/8にBOT APIのTrial Accountを公開して、あ、と思っていたら、10000アカウント限定で、すぐなくなってて、ああ〜、って思いました。最近また追加募集していたので、アカウントを取得してみました。 ついでに、会社ではAWSを使っているんですけどぼくはまともに触ったことがなくて、勉強せなあかんな〜と思っていたので、裏側をAWSで作ってみました。

成果

「彼女がほしい武士」というボットを作りました。
メッセージを送ると、その内容には一切触れず、交際を申し込んできます。告白の言葉は約100通りです。

f:id:kyabatalian:20160502151535p:plain

超絶内輪コンテンツなので、これ以上触れません。たぶんすぐ消します。

学習

AWS?EC2?ECCECCジュニア?程度の理解度だったため、AWS一般のオベンキョーから始めました。 以下をひととおりやってみたら0.01%くらいはわかった気分になりました。

http://qiita.com/hiroshik1985/items/6433d5de97ac55fedfde

こういう懇切丁寧な記事を書けるマメな人と結婚したら幸せになれそうですね。

あと、素晴らしい書籍を購入しました。

http://www.amazon.co.jp/dp/4774176737www.amazon.co.jp

まだ1行も読んでいませんが、とても素晴らしい書籍なので、ぜひご購入をおすすめします。ぼくはこれを枕元に置いて寝たら熱が下がりました。読んだら何かしら追記しますごめんなさい。ぼくの実家はクソ田舎なのに、昨晩注文した本が今朝届いて、もうAmazonすごすぎ。

追記

読みました。とはいっても3時間ほどで全体をさらっと読んだだけです。
実践入門というだけだけあって、コンソールやCLIを使った実際の現場でそのまま使えそうな操作を丁寧に記述されており、本来はこれらをひとつずつ実行してみることで、深い理解が得られる構成になっています。AWS独自の概念や専門用語についても触れており、これから現場でAWSをガンガン使っていく方にとってはたぶんすごく便利な本です。
一方で、ぼくはAWSどころかインフラについてド素人なので、前提知識がなさすぎて理解が追いつかないところもありました。オンプレミスでの構築/運用経験があれば、えっ!めっちゃ便利!ってなって、3240182931倍は楽しめたと思います。もし自分が現場で本格的にAWSを触って構築/運用に携わることになれば、本書を引っ張りだそうと思います。

構成

構成はこんなかんじ。

f:id:kyabatalian:20160502145303p:plain

LINE bot が作れてメッセージのやり取りができるところまで動かせれば満足だったので、EC2を立てずにLambdaを使いました*1。Lambdaの中身はNode.jsで。
また、まともに運用する気もなかったのですが、今回は練習として以下も想定した構成にしました(参考あるいは丸パクリ)。

  • 大量のメッセージが来る場合
  • 賢い(生成に時間がかかる)レスポンスを生成したくなった場合

具体的には、DynamoDBを噛ませてリクエストとレスポンスを非同期にしました。NoSQLに触れてみたかったのでちょうどよかったです。NAT gatewayは時間課金されるため、とりあえず無料で試したいという方は、EC2を立てて直接Public IPをふるので十分かもです。

蛇足ですが上図は Cloudcraft というツールで作りました。

cloudcraft.co

カッチョイイのでこれを使いたくてAWSで組んだといっても過言ではありません。ただ、意外と時間がかかってめんどくさかったです。有料プランだと、AWSアカウントでログインでき、実際のAWS の構成情報を読み取ってカッチョイイ構成図を作ってくれるらしいです。

問題

昨晩、完成した時点では機嫌よく動いていたのですが、今朝になるとメッセージをたまに無視するようになっており、いまの時点でまったく返さなくなってしまいました。 CloudWatchでLogsをみてみると、receiverの部分で Task timed out after 10.00 seconds と出ています。Lambdaの実行時間の設定値が10秒になっており、それを超えてしまったみたいです。受信したデータを DynamoDB.putItem()するだけなのに、と思いつつも、設定値を59秒に変えてみると、 Task timed out after 59.00 seconds となっててもうダメ。ダメポ。ぼくはダメ人間。気が向いたらもうちょっと調べてみます。

追記

直りました。LambdaのSubnet設定時に、誤ってPublicとPrivateの両方を選択していたようです。上図のとおり、Privateのみに修正しました。以下のように注意されますが、気にしません。

We recommend you select at least 2 subnets for Lambda to run your functions in high availability mode.

作った当初は動いていた理由は謎です。

所感

かかった時間はお勉強含めてトータルで10時間くらいだと思います。 LINE bot に関しては、最初のアカウント公開以降で先人たちがインターネット上にいろいろ書いてくれていたおかげで、特に困ることはなかったです。AWSに関しては、クラウドどころかまずインフラ周りの知識が皆無すぎた故、何がどこに依存しているのか混乱してめっちゃハマりました。Security Groupとか。Cloudclaftみたいなのが公式にあればいいのに。知らないだけかもしれません。
今後は特にないも考えてないですが、上記問題が解決できれば、もっといろいろ遊んでみるかもしれません。AWSも全然理解が足りていないし。ただ、有益なことやだれかの役に立つようなことは絶対にやりたくないです。だれかが損をするボットを作りたいです。
田舎は自然が豊かで最高です。Amazonがあれば買い物にも困りません。Amazon最高。

*1:疎通確認のため一時的にEC2を立てました