背景
私は過去数日間、Pillowを使用するLambdaをデプロイするのに苦労しており、Python 3.6を使用してデプロイしています。これをWindows 10環境で開発していることも注目に値するかもしれません。
最初の試行
私は次のようにして、ワークスペースにパッケージを厳密にpipインストールすることから始めました。
pip3 install pillow -t "D:\Work and Projects\...\...\<projectdir>\pillow"
他のパッケージがあり、同じマナーにパッケージをインストールしようとしましたが、そのうちの1つは特にpraw
でした。
pip3 install praw -t "D:\Work and Projects\...\...\<projectdir>\praw"
プロジェクトのコンテンツをまとめて圧縮した後、パッケージをLambdaにアップロードしました。最初のテストでエラーが発生しました。
モジュール 'motw_lambda'をインポートできません:名前 '_imaging'をインポートできません
次に、この問題の原因がどこか(Pillowまたはprawまたはその他のパッケージ)を確認するために、Pillowパッケージを削除しました。枕を外すと、処刑は成功した。次に、パッケージからpillow
パッケージを削除して試してみました。
pip3 install pillow -t "D:\Work and Projects\...\...\<projectdir>\PIL"
そして
pip3 install pillow -t "D:\Work and Projects\...\...\<projectdir>\Pillow"
しかし、パッケージで同じエラーが発生しました'_imaging'
。
さらなる試み
次に this resource および this の指示に従いました。 virualenv と lambda-uploader も使用してみました。
奇妙なことに、私は同じエラーが発生します!私はここですべてのオプションを使い果たしており、私は何かばかげているか、これが現在Lambda-Python3.6では不可能であると感じています(ただし、他の誰かをイメージしないまだしていません py3.6-lambdaで枕をまだ使用しています...)
情報、ヘルプ、または一般的なリソースをいただければ幸いです。
基本的には、DockerまたはEC2インスタンスを使用してライブラリ(PILなど)をコンパイルする必要があります。
次のようなDockerコンテナを起動します:docker run --rm -it -v "%cd%:/code" lambci/lambda:build-python3.6 sh
そこに移動して、/ code dir(cd /code
)に移動し、virtualenv(virtualenv env
)を作成してアクティブ化し(source env/bin/activate
)、最後にライブラリをインストールします(pip install pillow
) 。
ライブラリをインストールしたら、コンテナを終了できます。ここでの秘密は、パッケージライブラリをルートフォルダー(メインの.pyファイルがある場所)に移動することです。たとえば、env/lib/python3.6/site-packages/PIL
フォルダーをルートに移動します。
次に、PILフォルダーを.pyファイルと一緒に圧縮すると、設定が完了します。
私はそれをし、ここに完全に文書化しました: https://learn-serverless.org/post/deploying-pillow-aws-lambda/
ここにあるPILのプリコンパイル済みバージョンを使用できます。 https://github.com/Miserlou/lambda-packages
PILフォルダーを展開パッケージに抽出するだけで動作します。
Aws pythonを初めて使用していてこの問題が発生している他の人は、レイヤー機能を使用できます。ここにリンクできる既存のレイヤーがあり、これは私にとってはうまくいきました。
https://github.com/keithrozario/Klayers
特にus-east-1の枕:
arn:aws:lambda:us-east-1:770693421928:layer:Klayers-python38-Pillow:2