AWS lambda でスクレイピングを使った簡単なアプリを作りたいと思い、以下のようなimport文を書いた。
import requests
import bs4
No module named 'requests'
lambdaのテストすると、上記のようなエラーメッセージが表示された。解決策としては、必要なライブラリを一つのフォルダに入れて圧縮し、それをlambdaのコンソール画面操作でアップロードするという方法。
- 苦労した点
- レイヤーに追加してもimportエラー(なぜ!)
- アップロードするとlambda_function.pyが消える(!!)
レイヤー使えなかった
関数用意。
レイヤー用意。
だめじゃん!!!
手順
まずは以前pip3でローカルにインストールしたrequestsライブラリをアップロードした。
実行するが失敗。なんだこれ。chardetなんて初めて聞いた。
No module named 'chardet'
調べてみると確かにrequests/_init_.pyで使っていた。
import chardet
じゃあ次はchardetも一緒に圧縮して、、、これをあと何回繰り返せばいいんだ・・・
この時点で絶望した。
案の定また出た。次はcertifi。ってなんだこれ。
No module named 'certifi'
調べてみると証明書が信頼できるかどうか検証するために使っているらしい。
https://requests.readthedocs.io/en/master/user/advanced/
Requests verifies SSL certificates for HTTPS requests, just like a web browser. By default, SSL verification is enabled, and Requests will throw a SSLError if it’s unable to verify the certificate:
日本語訳
Requests は、Web ブラウザのように HTTPS リクエストの SSL 証明書を検証します。デフォルトでは SSL 検証が有効になっており、証明書を検証できなかった場合には SSLError がスローされます。
どうすれば漏れなくアップロードできるのだろうか。そこで次の記事を参考にした。
https://qiita.com/afukuma/items/b7191025700a7829967c
なるほど。これは思いつかなかった。pipでディレクトリ指定できるのか。
アップロードするとlambda_function.pyが消える
lambda_function.pyが存在する。
アップロード
lambda_function.pyが消えた!
ブラウザ上で直接編集していた場合、たまったもんじゃない。
参考記事
【Lambda】import requests が使えるようにする【python】
https://qiita.com/afukuma/items/b7191025700a7829967c
Requests: HTTP for Humans™ Advanced Usage
https://requests.readthedocs.io/en/master/user/advanced/