ラベル AWS の投稿を表示しています。 すべての投稿を表示
ラベル AWS の投稿を表示しています。 すべての投稿を表示

2017-10-07

awsのlambdaとAPI Gatewayを使って、ちょっとはまったこと

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
ほとんど使っている人はいないのですが、
barcotterというバーコードから、そのバーコードに対応するamazonのリンクを作成するandroidアプリを作っています。
これのバーコードからamazonのリンクを生成する部分は、サーバを用意して、このサーバ側で行っています。

最初は、サーバは
Google App Engine(python)
で作っていたのですが、なんかのサポートが切れることをきっかけに
Open Shift(Ruby on Rails)
に乗り換えたのですが、こちらも最近サポートが切れる部分があったので、これをきっかけに、今回サーバ側を
aws lambda(python)
に乗り換えてみました。

今回、lambdaに乗り換えて、いざアプリを利用してみると
type java.lang.String cannot be converted to JSONObject
というエラーが出てjsonのパースができない状態になりました。

原因は、すごく些細でlamdbaでjsonを返すには
handler内で辞書オブジェクトをreturnしてやればよかったのに、
わざわざ辞書オブジェクトをjson.dumpsして文字列にしたものをreturnしてしまって、
これが原因でパースできなかったというものでした。

普通に辞書オブジェクトでreturnすると、ちゃんとbodyに以下のようにjsonが
{ 'aaa': 'bbb', 'ccc': 'ddd'}
となるのですが、文字列で返すとbodyに
"{ 'aaa': 'bbb', 'ccc': 'ddd'}"
とダブルコーテーションがついてしまって、これのせいでパースに失敗していました。

これに気づくまで、無駄に時間がかかってしまいました。

あと、結果的には関係ないのかもしれませんが
パースできないのが、文字コードがうまく処理できないのかと思い、
API Gatewayのメソッドレスポンスの
HTTP のステータス200 の
レスポンス本文のコンテンツタイプが
application/json
だったものを
application/json;charset=UTF-8
とcharsetを追加しました。

とりあえず無事に移行できました。

2017-04-04

LINE BOT APIを使っていたものをLINE Messaging APIに書き直す

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
すごく今更ですが、以前LINE BOT APIを使ってみたものを、LINE Messaging APIに直したものを紹介します。

ちなみにLINE Messaging APIを始めるには、以下が参考になりました。
http://milk0824.hatenadiary.jp/entry/2016/10/01/211555

まずは、
LINE BOT APIのcallbackにAWS Lambdaを使ってみる
を直したのは、以下のような感じです。

お次は、rubyで書いたものです。
ruby2.0以上ならば、line-bot-apiというgemがあり、こっちを使うと、もうちょっと楽にかけそうなのですが、以下はruby1.9でも動くことを前提としているのでline-bot-apiは使っていません。

rubyで書いたものの最初の、
LINE BOT APIを利用して電車遅延情報の送信を改良した
を直したのは、以下のような感じです。

そして、
LINE BOT APIを利用してGoogle Calendarの情報を通知する
を直したのは、以下のような感じです。
ちなみにキャンセルされた予定の処理を追加しています。

最後に、
LINE BOT APIを利用して雨が降りそうな時は通知するようにしてみる
を直したのは、以下のような感じです。

2016-04-27

LINE BOT APIのcallbackにAWS Lambdaを使ってみる

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
※サンプルをLINE BOT APIからLINE Messaging APIに書き換えたものを以下で公開しました。
https://kingyo-bachi.blogspot.jp/2017/04/line-bot-apiline-messaging-api.html

LINE BOT APIを試すにはcallbackを設定しないと試せることがほとんどないことがわかったのでcallbackを設定できるようにします。

VPSとかすでに持っているのならば簡単なのでしょうが、残念ながら私はお手軽に使えるものを持っていません。

他の方の例などを見るとAWS LambdaにAPI Gatewayを組み合わせるとお手軽な気配だったのでやってみました。

ちなみにLambdaとかで何ができるかと、ちっともわかってなかったのですが、以下が参考になりました。
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/getting-started.html

試してみた結論としては、お手軽に動作を見るにはLambdaはよい感じなのですが、ずっとcallbackとして利用するにはIPアドレスが変わってしまうので使い続けることは現実的ではなさそうでした。

ずっと使うには向いてないかもしれないですが、お手軽に試すにはよかったのでLambdaでLINE BOT APIを使う方法を紹介します。


Lambdaの画面でCreate a Lambda Functionをクリック



ここはSKIPを選択します。



適当にName欄に名前をつけて、RuntaimeにNode.js 0.10を選択します。



コードを記載します。


記載するコードは以下のような感じです。



RoleをそれっぽいものにしてNextをクリック



Create functionをクリック



これでLambdaファンクションはできあがります。なんとなくTestをクリックします



Save and testをクリック



下の方にtestの結果が表示されます。エラーはでますが、Log outputにとりあえず受け取ったイベントが表示されているのでよしとします。



作成したLambdaファンクションにAPI Gatewayを設定します。
API endpointsタブを選択してAdd API endpointをクリック



API nameを適当につけて
MethodをPOST
SecurityをOpen
にしてSubmitをクリック



API Gatewayが設定されました
API endpoint URLをコピーします。



LINEのcallback設定ページにいって上記のURLをペーストします。その際に443を追加します。


しばらくしてから(10分後ぐらいには使えました)、LINEでbotにメッセージを送ります。
ですが、botのIPをホワイトリストに登録してないので何も返答がありません。
またlambdaの方に戻ります。
Monitoringタブを選択して、View logs in CloudWatchをクリック



logの中にLINEにはじかれたIPアドレスが表示されているので確認します。



そのIPアドレスをLINEの方のホワイトリストに登録します


これで再度LINEからbotにメッセージを送ると同じメッセージをbotが返してくれるようになります。
そしてlogの方でもうまくいったことが確認できます。
そしてlogに自分のLINEアカウントのIDを記録するようにしたので、それも確認できます。




以下のページが参考になりました。
http://dev.classmethod.jp/cloud/build-line-bot-api-using-lambda/
http://qiita.com/teyosh/items/567ee416c94c2af2fe91
http://shunirr.hatenablog.jp/entry/2016/04/13/164902