web-dev-qa-db-ja.com

PIL / Pillow 4.2.1を取得してAWS Lambda Py3.6に適切にアップロードする

背景

私は過去数日間、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 の指示に従いました。 virualenvlambda-uploader も使用してみました。

奇妙なことに、私は同じエラーが発生します!私はここですべてのオプションを使い果たしており、私は何かばかげているか、これが現在Lambda-Python3.6では不可能であると感じています(ただし、他の誰かをイメージしないまだしていません py3.6-lambdaで枕をまだ使用しています...)

情報、ヘルプ、または一般的なリソースをいただければ幸いです。

14
dovedevic

基本的には、DockerまたはEC2インスタンスを使用してライブラリ(PILなど)をコンパイルする必要があります。

  1. 次のようなDockerコンテナを起動します:docker run --rm -it -v "%cd%:/code" lambci/lambda:build-python3.6 sh

  2. そこに移動して、/ code dir(cd /code)に移動し、virtualenv(virtualenv env)を作成してアクティブ化し(source env/bin/activate)、最後にライブラリをインストールします(pip install pillow) 。

  3. ライブラリをインストールしたら、コンテナを終了できます。ここでの秘密は、パッケージライブラリをルートフォルダー(メインの.pyファイルがある場所)に移動することです。たとえば、env/lib/python3.6/site-packages/PILフォルダーをルートに移動します。

次に、PILフォルダーを.pyファイルと一緒に圧縮すると、設定が完了します。

私はそれをし、ここに完全に文書化しました: https://learn-serverless.org/post/deploying-pillow-aws-lambda/

19
Diego Jancic

ここにあるPILのプリコンパイル済みバージョンを使用できます。 https://github.com/Miserlou/lambda-packages

PILフォルダーを展開パッケージに抽出するだけで動作します。

4
ljmocic

Aws pythonを初めて使用していてこの問題が発生している他の人は、レイヤー機能を使用できます。ここにリンクできる既存のレイヤーがあり、これは私にとってはうまくいきました。

https://github.com/keithrozario/Klayers

特にus-east-1の枕:

arn:aws:lambda:us-east-1:770693421928:layer:Klayers-python38-Pillow:2

0
Matt