はじめに
AWS Lambda実践ガイドの5章Sの3に配置したhtml のフォームを叩いてAPI経由でlambdaを呼出してpostした内容をdynamoDBに書き込む練習問題でハマったた備忘録として記載。結論として、event['body']がbase64にエンコードされていた。
経緯
実践ガイドのサンプルコードをそのまま実装しても動かないため、CWのlogを見てみると
htmlのフォームから入力されたデータを受け取るところに問題がありそう。
案の定、print(param)してみるとnullになっていたので、
print(json.dumps(event,indent=4))
でevent全体を見てみる。
すると
"body": "dXNlcm5hbWU9YWEmZW1haWw9aGg=",
でどうやら値が入ってはいるが、なんだこれ。
色々とネットを漁るとbase64というすべてのデータをアルファベットと一部の記号であらわすエンコード仕様らしい。
試しにhttps://www.en-pc.jp/tech/base64.php
でエンコードしてみるとちゃんと結果が返ってきていた!
コードの修正
というわけでbase64にデコードしてparseするように修正した。
import base64
(中略)
body = base64.b64decode( event['body'] )
param =urllib.parse.parse_qs(body.decode('utf-8'))
おわりに
今回のような値を渡すところは、勝手にエンコード等されていないか確認することが大切と学んだ。