こんにちは、高知からリモートインターンしている森田ドラゴンです。明日はクラウドお遍路に行くので、今から楽しみです(その前にスライド完成させないとダメですが)。今日は、前回悩みを解消できたこともあって、やっとお天気APIを動かせるところまで持っていくことができました。
Lambdaの改修
新しい機能を一つのLambdaで処理させるためにeventの内容を見る必要があります。api gwからlambdaに送られてくるeventsにはhttp等のデータも含まれています。
"httpMethod": "GET",
"body": null,
"resource": "/get_weather",
"queryStringParameters"{}
上はeventsから抜粋したものです。今回はhttpMethodはGETのみを使用するため、resourceで処理を分岐させます。
queryStringParametersは、GETで送られてきたクエリパラメータを格納しています。以前、「GETリクエストで、複数のデータを送るにはどうすればいいか」と悩んでいましたが、クエリパラメータに入れることで解決しました。
JSONで複数データを送るイメージだったので(おそらくできると思いますが)クエリパラメータのように、一つづつデータを送る方法が思いついていませんでした。
https://hoge.com/foo?bar=1&fuga=
上の形式で送ることができます。この時気をつけたいのは、Stringを表現する"ダブルクォーテーションの扱いです。今回はパラメータとして、天気を表示してくれるAPIのURIを送信しています。なぜそんなことをしているかというと、フロント側からはCORSの問題で、リクエストを送れないからです。
URIの中にURIを含ませるには"ダブルクォーテーションもしくはシングルクォーテションで囲む必要があります。そうると、パラメータはStringとして認識されますが、同時に"ダブルクォーテーションがデータの中に含まれてしまいます。これを取り除く必要がLambdaで必要でした。
詰まったエラー
Lambdaはサクサク進みましたが、テンプレート編集時と、JS編集時に詰まっていました。
2つのAPI GWのイベントをキャッチするために以下のコードを追加しました。
Events:
GetWeahterImg:
Type: Api
Properties:
# RestApiId: !Ref ApiGateway
Path: /list
Method: get
GetWeatherList:
Type: Api
Properties:
# RestApiId: !Ref ApiGateways
Path: /get_weather
Method: get
RestApiIdをコメントアウトしていますが、これはAPI GW明示的に作成できなかったためです。この部分はSAMがよしなにやってくれていますが、少し気になります。また時間を見つけて試してみたいです。
JSでは、ローカルで叩いていたAPIのURIと、フロントで使用しているURIが違っていたため、いくら試しても通らない状態に陥っていました。反省です。
次のタスク
お天気APIは動かせましたが、課題はまだ終わっていません。以下のことをやる必要があります。
・S3の名前を統一する
・エンドポイントをjsに渡す方法を考える
・テスト項目を書き直す
・レスポンス(例外処理)を書く
・設計を書き直す
途中で設計を変更したので、テストやドキュメントを書き直すのが大変そうですが、綺麗に書き直したいと思っていたので楽しみです。