こんにちは、高知からリモートでインターンしている森田ドラゴンです。前半は色々と理解が深まって満足だったんですが、後半はAWS SAMと戦っていたせいで、終わりませんでした。今日中に終わってIoT課題に取り組めると思っていたぶん悔しかったです。次までにこっそり進めて終わらせておきます。前回に引き続き、API Gateway->Lambda->DynamoDB のシステム構築をするところから始まりました。
API Gatwayは試しながら
最初の段階では詰まりました。というのも、API Gatewayの項目がどのように関連しあっているのか謎だったからです。なので、そもそもパスパラメータが送れているのか、いないのか。その確認方法はどうするのか。pythonで受け取るeventには何が入ってるのか?様々な疑問を解消するところから始めました。
マッピングテンプレートと、 メソッドリクエストを追加すれば、パスパラメータは取得できるみたいです。
終わってみれば、初期値から編集する値は驚くほど少なく、簡単な内容だったことに気づきました。そのわりに時間がかかってしまったのは、LambdaとAPI gatewayを交互にみながら作業していたせいだと思います。問題を整理して、一つ一つ進めるのが大事ですね。
DynamoDBからデータの取得
boto3というものをimportして、チュートリアルから抜き出して書けば完了しました。その過程でエラーがいくつか出たので箇条書きします。
・AccessDeniedExceptionのエラー
DynamoDBを動かすのに権限が必要Lambdaに新しいを付与しようとしましたが、結局もともと付与してあったロールにDBを動かす権限を付与して解決しました。
・get_itemしようとしたらエラー
get_item(~~)しようとしたらエラーが、ログをみてみると
The provided key element does not match the schema"
primary_keyが合ってないのか? と思ってテーブルを見るとデータはしっかり来ている。よく見るとkeyの値が ""(ダブルクォーテーション)でくくってありました。元のDynamoDBのテーブルに合わせて、型は数値型でなければいけないので、int型にcastして解決しました。
AWS SAMの書き方が難しい
AWS SAMは細かいエラーが多くて大変でした。自分の中で試さなくてはいけないことが多すぎて、エラーが増えてしまった気がします。前回触った時にはなかった"<unicode string>" ~~ というエラーもありました。どこでunicodeが混ざったのか、謎でした。
凡ミスの話をすれば、
Type: AWS:: ~~
Properties:
~~~
と書くところを順番が逆に書いていたり、Propertiesを字下げしたりしていて、エラーが起きてました。
他にも、deployする段階で
Failed to create/update the stack. Run the following command
to fetch the list of events leading up to the failure
と言われ、(実行してもどこが原因かわからなかったです。CloudFormationのエラーの見方も勉強したい )
解消されたと思ったら
str has no object (str は objectじゃないよー)
というエラーが。いや、strなんて値どこにあるんですか・・・。
どこからエラーが出ているのか、検討もつかなくなったので、今は問題を整理して最初から確認しながら進めています。
SAMを触っている時のエラーの出方がひどかったです。勘を頼りに作業を進めるのも、そろそろ限界が来ているのかもしれません。そもそも勘に頼るのが間違いなんですけどね。早くIoTの方も触りたいので、この課題は自分のアカウントでもやってみます。
それではまた来週、よろしくお願いします。