web-dev-qa-db-ja.com

AWS Lambda Python3.7関数-numpy:名前「WinDLL」をインポートできません

lambdaにpythonスクリプトを。Zipファイルから実行する関数を設定しました。virtualenv。Zipファイルに必要なパッケージをすべて含めました(Lib\site-packagesフォルダーから)。

以下は、スクリプトで使用されるパッケージのインポートステートメントです。

import requests
import boto3
import logging
import os
from botocore.exceptions import ClientError
from pprint import pprint
import pandas as pd
from datetime import datetime
import s3fs

lambda functionを実行しようとすると、次のエラーが表示されます。

START RequestId: e302cee0-3c51-453a-84c1-6eb1f9c123a0 Version: $LATEST
[ERROR] Runtime.ImportModuleError: Unable to import module 'export-dev': Unable to import required dependencies:
numpy: cannot import name 'WinDLL' from 'ctypes' (/var/lang/lib/python3.7/ctypes/__init__.py)
END RequestId: e302cee0-3c51-453a-84c1-6eb1f9c123a0
REPORT RequestId: e302cee0-3c51-453a-84c1-6eb1f9c123a0  Duration: 1.65 ms   Billed Duration: 100 ms     Memory Size: 128 MB Max Memory Used: 70 MB  

私のコードでは、ctypesWinDLL、または関連パッケージを明示的に使用していません。

8
Pablo

コードにパッケージ化された依存関係の正しいバージョンがない場合、aws lambdaはエラーをスローします。依存関係は、OS(lambdaはLinuxで実行されます)およびpythonバージョンに依存する場合があります。

要件に基づいて、pandasエラーがスローされます。ラムダでpandasを実行するには、次のパッケージを含める必要があります。

pandas-Linux用にコンパイルされたコードで、ラムダが実行します。あなたはそれをここで見つけることができます https://pypi.org/project/pandas/#files あなたのpythonに一致する.whlファイルの 'manylinux'バージョンをダウンロードします=ラムダバージョン。

  • 例えばpy3.7を実行している場合は、pandas-0.25.3-cp37-cp37m-manylinux1_x86_64.whlを取得します

  • .whlファイルの内容をラムダフォルダーのルートフォルダーに解凍します。これはラムダが必要とするライブラリのバージョンです

  • pandas 0.25+のメモ。pytzパッケージも含める必要があります。リクエストについては下記のメモを参照してください

numpy-ラムダコンソールから「レイヤー」をインストールすると、ラムダ(py3.7でテスト済み)に入ることができます。以下のスクリーンショットを参照してください。

リクエストのサイドノート

  • ここのパッケージ https://pypi.org/project/requests/#files には「none-any」バージョンしかありません。つまり、ソースをコンパイルする必要がないので、 pipから取得したバージョンを安全に含めることができます

  • これはpandasのpytz依存関係にも適用されます

awsコンソールにレイヤーをインストールするスクリーンショット

adding a layer im lambdaselect layer

2

NumpyはCで書かれているため、Linuxディストリビューション用にビルドする必要があります。 サーバーレスフレームワーク を使用することをお勧めします。これは、Windowsラップトップを使用している場合に生活が大幅に簡素化されるためです。

serverless framework をインストールし、 docker があることを確認します

プロジェクトのルートに移動して実行します。

sls create --template aws-python

pythonアプリをデプロイするためのプラグインをインストールします:

serverless plugin install -n serverless-python-requirements

あなたのserverless.ymlファイル追加:

plugins:
   - serverless-python-requirements

custom:
  pythonRequirements:
     dockerizePip: non-linux

ラムダ関数へのパスを調整してください

functions:
  hello:
    handler: handler.hello

を使用して正しいライブラリで展開する

sls deploy 
2
Vincent Claes