AWS LambdaにPythonのライブラリを読み込ませるための単純な方法
LambdaにPythonのライブラリを読み込ませたい時がありますね。でもAWSページを見てもよくわからない。Dockerを使えというページもあるけどDockerが使えない環境だったりする場合もある。
ということでWindowsエクスプローラを使いLambdaにPythonのライブラリを読み込ませる単純な方法を調べてみました。
綺麗なやり方ではないですがイメージを掴むためだと思ってください。
さらに、後述しますが一部ライブラリしか対応できません。
ローカルで作ってみる
Pythonの環境はあるものとして、まずはライブラリをインストールしてそれをimportするコードを作ります。pipでpdfminerのライブラリをインストール。
pip install pdfminer.six
後はこのライブラリを使用するコードを記述。中身は何でも良いので成功すればOK
import pdfminer
print("pdfminer ok")
では同じコードをAWSのLambdaで記述してみる。
import pdfminer
def lambda_handler(event, context):
print("pdfminer ok")
pdfminerがないから当然結果はエラー。今回はとりあえずこれをエラー無しで実行できることを目標にします
"errorMessage": "Unable to import module 'lambda_function': No module named 'pdfminer'",
"errorType": "Runtime.ImportModuleError",
Lambdaにアップロードするzipファイルを作成する
ではこのLambdaをエラーなく実行するにはどうするか。それはライブラリのファイルとPythonのファイルをzipにしてアップロードすることです。
まず現在ライブラリがどこにあるかを調べる方法
pip show pdfminer.six
pip install pdfminer.six -t /pdfmin
このコマンドを実行すると指定したライブラリがどこにあるかがわかる。普通はsite-packages以下にある
Location: c:\users\user\anaconda3\lib\site-packages
site-packagesから探すのは大変なので次のようにpipでインストールする際に -t を付け加えることでインストール先を指定することができます
pip install pdfminer.six -t /pdfmin
コマンドを実行すると、指定したフォルダ以下にライブラリの一式が格納されます。
次はこのフォルダにPythonのコードを作ります。この時ファイル名は「lambda_function.py」にすること。ファイル名が違うとエラーになります。
"errorMessage": "Unable to import module 'lambda_function': No module named 'lambda_function'",
"errorType": "Runtime.ImportModuleError",
lambda_function.pyのコードはlambdaのイベントハンドラーと同じにする。
import pdfminer
def lambda_handler(event, context):
print("pdfminer ok")
これでライブラリとPythonのファイルが同じフォルダ内に揃いました。後はこれをzipにまとめます。この時、フォルダを選択してzipにするのではなくフォルダ内のファイルを全選択してzipにする
空のPythonのLambdaを作り、コードの画面でアップロード元→zipファイルを選択。次の画面で先程作ったzipファイルを選びアップロードする。
これをテスト実行すると、今度はエラーなく結果が返ってくるはず。
注意
でも、このやり方だとサイズが大きすぎてAWS上では編集できず、都度zipをアップロードしないと検証できませんので実用的ではないですね。
さらに、LambdaがUNIX環境のため、windows環境にpipでインストールしたライブラリでは対応していない場合があります。
例えばpillowをインポートしたコードを作り、ローカルで成功するのを確認した上でLambdaにアップロードしても…
from PIL import Image
def lambda_handler(event, context):
print("pillow ok")
"errorMessage": "Unable to import module 'lambda_function': cannot import name '_imaging' from 'PIL' (/var/task/PIL/init.py)",
"errorType": "Runtime.ImportModuleError",
ローカルでは成功してもLambdaではエラーになってしまいます。
こうなると結局UNIXの環境が必要ということに
この記事が気に入ったらサポートをしてみませんか?