web-dev-qa-db-ja.com

Pandas AWS lambdaでnumpyエラーが発生する

パンダをインポートするAWS Lambdaでコードを実行しようとしています。これが私がやったことです。 pythonファイルには次のような簡単なコードが含まれています(このファイルにはラムダハンドラがあります)

import json
print('Loading function')
import pandas as pd
def lambda_handler(event, context):
    return "Welcome to Pandas usage in AWS Lambda"
  1. これをzip圧縮しましたpython numpyとともにファイル、pandasおよびpytzライブラリをデプロイパッケージとして(これらすべてをAmazon EC2 Linuxマシンで行いました)
  2. 次に、パッケージをS3にアップロードしました
  3. ラムダ関数(runtime = python3.6)を作成し、S3から展開パッケージをアップロードしました

しかし、AWS Lambdaでラムダ関数をテストすると、次のエラーが表示されます。

Unable to import module 'lambda_function': Missing required dependencies ['numpy']

Zipパッケージには既にnumpyが含まれていますが、それでもこのエラーが発生します。 Pandas&AWS Lambda で与えられたヒントに従おうとしたが、運はなかった。

誰もが同じ問題に遭遇しましたか。この問題を解決するためのヒントや提案をいただければ幸いです。

ありがとう

38
Kingz

編集:最終的にAWS Lambdaでpandas&numpyを実行する方法を見つけましたpython 3.6ランタイム環境。

展開パッケージを次のリポジトリにアップロードしました。

git clone https://github.com/pbegle/aws-lambda-py3.6-pandas-numpy.git

lambda_function.pyを実行してZipファイルに追加します。

Zip -ur lambda.Zip lambda_function.py

S3にアップロードし、ラムダにソースします。

元の:

Pandas= lambda関数で動作するようにした唯一の方法は、手順に従ってAWS Linux EC2インスタンスでpandas(およびnumpy)ライブラリをコンパイルすることです このブログ投稿 から、python 2.7ランタイムをラムダ関数に使用します。

8
pbegle

ラムダZipにnumpyを含めるには、AWSドキュメントのこのページの指示に従ってください...

Pythonコンパイル済みバイナリを含むパッケージをデプロイパッケージに追加し、パッケージをAWS Lambdaと互換性を持たせるにはどうすればよいですか?

Numpyを例として使用して指示を言い換えるには:

  1. Pypi.orgでモジュールページを開きます。 https://pypi.org/project/numpy/
  2. [ファイルのダウンロード]を選択します。

  3. ダウンロード:

Python 2.7、module-name-version-cp27-cp27mu-manylinux1_x86_64.whl

例えばnumpy-1.15.2-cp27-cp27m-manylinux1_x86_64.whl

Python 3.6、module-name-version-cp36-cp36m-manylinux1_x86_64.whl

例えばnumpy-1.15.2-cp36-cp36m-manylinux1_x86_64.whl

  1. / path/to/project-dirフォルダーのwheelファイルを解凍します。これを行うには、コマンドラインでunzipコマンドを使用できます。明らかに他の方法があります。

unzip numpy-1.15.2-cp36-cp36m-manylinux1_x86_64.whl

Wheelファイルが圧縮されていない場合、デプロイパッケージはLambdaと互換性があります。

すべてが理にかなっていることを望む;)

最終結果は次のようになります。注:展開パッケージにwhlファイルを含めないでください。

What it might look like

6
chim

多くの研究を行った後、Lambdaレイヤーで動作させることができました。

クリーンディレクトリを作成または開き、以下の手順に従います。

前提条件:Dockerが稼働していることを確認してください

  1. 以下を使用してrequirements.txtファイルを作成します。
pandas==0.23.4
pytz==2018.7
  1. 次を使用してget_layer_packages.shファイルを作成します。
#!/bin/bash

export PKG_DIR="python"

rm -rf ${PKG_DIR} && mkdir -p ${PKG_DIR}

docker run --rm -v $(pwd):/foo -w /foo lambci/lambda:build-python3.6 \
    pip install -r requirements.txt --no-deps -t ${PKG_DIR}
  1. 同じディレクトリで次のコマンドを実行します。
chmod +x get_layer_packages.sh

./get_layer_packages.sh

Zip -r pandas.Zip .
  1. レイヤーをS3バケットにアップロードします。

  2. 以下のコマンドを実行して、AWSにレイヤーをアップロードします。

aws lambda publish-layer-version --layer-name pandas-layer --description "Description of your layer"
--content S3Bucket*=<bucket name>*,S3Key=*<layer-name>*.Zip
--compatible-runtimes python3.6 python3.7
  1. Lambdaコンソールに移動し、コードをZipファイルとしてアップロードするか、インラインエディターを使用します。

  2. [レイヤー]> [レイヤーの追加]> [互換レイヤーからレイヤー(pandas-layer)を検索]をクリックし、バージョンを選択します。

  3. また、numpyのインポートにデフォルトで使用可能なAWSLambda-Python36-SciPy1xレイヤーを追加します。

コンソールからレイヤーを選択

  1. コードをテストします。今すぐ動作するはずです!!!!

この中記事のおかげで https://medium.com/@qtangs/creating-new-aws-lambda-layer-for-python-pandas-library-348b126e9f3e

5
Ranadeep Guha

Lambdaで追加のライブラリを取得するには、それらをAmazon Linuxでコンパイルし(基になるライブラリがNumpyのようなCまたはC++に基づいている場合に重要です)、必要なpythonスクリプトと一緒にZipファイルにパッケージ化します。 Lambdaで実行します。

ライブラリのAmazon Linuxコンパイルバージョンを取得します。 @pbegleのような誰かが既にコンパイルしたバージョンを見つけるか、自分でコンパイルすることができます。自分でコンパイルするには、2つのオプションがあります。-EC2インスタンスでライブラリをコンパイルします https://streetdatascience.com/2016/11/24/using-numpy-and-pandas-on-aws-lambda/ -Lambda環境のdockerバージョンでライブラリをコンパイルします https://serverlesscode.com/post/scikitlearn-with-Amazon-linux-container/

Dockerの最後のオプションに続いて、上記のブログ投稿の手順を使用して、以下を追加することにより、Dockerを機能させることができます。

pip install --use-wheel pandas

ライブラリをコンパイルするスクリプトで:

https://github.com/ryansb/sklearn-build-lambda/blob/master/build.sh#L21

2
Pierre-Antoine

AWS Lambdaを使用してNodeJSでMySQLが見つからない のわずかな複製

ライブラリをLambdaでパッケージ化する必要があります。ラムダはパブリッククラウドで実行されるため、構成できません。

パンダを使用している場合、ZipでPandasをパッケージ化する必要があります。パンダへのパスを取得します(例:/Users/dummyUser/anaconda/lib/python3.6/site-packages)を作成し、ライブラリをラムダ関数コードがある場所にコピーします。コード内で、ローカルコピーのpandasを参照してください。アップロード中に、set(code +ライブラリ)、必要に応じてアップロードします。動作するはずです。

1

私はpython3.6エンジンを使用しようとして、同様のエラーに苦しんでいます。 2.7に切り替えたとき、うまく機能しました。 Amazon AMIを使用してZipファイルを作成しましたが、3.6ではなくpython3.5しかありません。バージョンの不一致が原因だと思います。しかし、それは単なる推測であり、私はまだpython3.6インストールでプロセスを試していません。

0
Pavel Anni

AWS LambdaはAmazon Linuxを使用 オペレーティングシステム。アイデアはダウンロード Pandas および NumPyAmazon Linux と互換性があります。 pipを使用してダウンロードするものは、WindowsまたはMacに固有のものです。 Linux用の互換バージョンをダウンロードして、Lambda関数がそれを理解できるようにする必要があります。これらのファイルはwheelファイルと呼ばれます。

lambda_function.pyファイルを使用して新しいローカルディレクトリを作成します。 pipを使用してローカルディレクトリにPandasをインストールします。

$ pip install -t . pandas

https://pypi.org/project/pandas/#files に移動します。最新の*manylinux1_x86_64.whlパッケージを検索してダウンロードします。私の場合、Lambda関数でPython 3.6を使用しているため、以下をダウンロードしました。

lambda_function.pyを使用してwhlファイルをディレクトリにダウンロードします。 pandasnumpy、および*.dist-infoディレクトリを削除します。 whlファイルを解凍します。

$ rm -r pandas numpy *.dist-info
$ unzip numpy-1.16.1-cp36-cp36m-manylinux1_x86_64.whl
$ unzip pandas-0.24.1-cp36-cp36m-manylinux1_x86_64.whl

Whlファイル、*.dist-info、および__pycache__を削除します。 Zip.zipアーカイブを準備します。

$ rm -r *.whl *.dist-info __pycache__
$ Zip -r Zip.zip .

Zip.zipファイルをLambda関数にアップロードします。

enter image description here

ソース: https://medium.com/@korniichuk/lambda-with-pandas-fd81aa2ff25e

0
korniichuk

サーバーレスフレームワーク を使用すると、依存関係を簡単に正しくパッケージ化および展開できます。

あなただけが必要です。

  1. サーバーレスをインストールする

    npm install -g serverless
    
  2. 以下を使用して、プロジェクトのルートにserverless.ymlを作成します。

    service: numpy-test
    
    # define the environment of your lambda
    provider:
      name: aws
      runtime: python3.6
    
    # specify the function you want to deploy
    functions:
      numpy:
        # path to your lambda_handler function
        handler: path/to/function.lambda_handler
    
    # add a plugin that allows serverless to package python libraries
    # specified in the requirements.txt or Pipfile
    plugins:
      - serverless-python-requirements
    
    # this section makes sure your libraries get build correctly 
    # for an aws lambda environment
    custom:
      pythonRequirements:
        dockerizePip: non-linux
    

    path/to/function.lambda_handlerを調整します

  3. dockerが実行されていることを確認して実行する

    serverless deploy

デプロイが完了したら、AWSコンソールで関数numpy-test-dev-numpyを探し、関数をテストします。

この記事 必要な手順を詳細に説明しています。

0
Vincent Claes

あなたのコードは常にこのエラーを出します
lambdaには外部ライブラリが含まれていないため、デフォルトでPythonに付属しているライブラリがあります。

pandas、numpyなどの外部ライブラリを使用している場合。AwsLambdaにそのライブラリをインストールする必要があります
使用する前に

またね

import json
print('Loading function')
import pandas as pd
def lambda_handler(event, context):
    return "Welcome to Pandas usage in AWS Lambda"

ここではpandasライブラリのインストールがないため、コードは機能していません。
私の提案は、次のようにコードを使用することです。ラムダ関数内にコードをすべて書く

import json
def lambda_handler(event, context):
    #install python libray here 
    print('Loading function')
    import pandas as pd
    return "Welcome to Pandas usage in AWS Lambda" 

つまり、最終的なコードは次のようになります

 def lambda_handler(event, context):
     import pip

    def install(package):
        if hasattr(pip, 'main'):
            pip.main(['install', package])
        else:
            pip._internal.main(['install', package])

    if __== '__main__':
        install('pandas')

    #install python libray here 
    print('Loading function')
    import pandas as pd
    return "Welcome to Pandas usage in AWS Lambda" 
0
user6502956

これはRandeepの答えに似ていますが、それをしたくない場合はLambdaレイヤーを使用する必要はありません。

他の人が述べているように、pandas/numpyはバイナリをビルドする必要があり、ビルドマシンのオペレーティングシステム(Linux、Mac、Windows)がLambdaのオペレーティングシステム(Amazon Linux)と一致しないため、これは機能しません。

これを解決するには、dockerを使用して依存関係をダウンロード/ビルドし、Amazon Linuxにパッケージ化します。 Amazonは、この目的のためにDockerイメージを提供しています。 pythonパッケージのPython 3.6ランタイム(他のすべてのランタイム用に他のdockerがあります):

すべての依存関係をrequirements.txtファイルに配置します。次に例を示します。

openpyxl
boto3
pandas

パッケージをビルドするスクリプト(名前はbuild.sh)を作成します。次のようになります。

#!/bin/bash

# remove old build artifacts
rm -rf build
rm lambda_package.Zip

# make build dir and copy my lambda handler file into it
mkdir build
cp lambda_daily_util_gen.py  build/

# Use requirements file to download/build dependencies into the build folder
cd build
pip install -r ../requirements.txt --target .

# Create an lambda package with my files and all dependencies
Zip -r9 ../lambda_package.Zip .

Amazon Linuxラムダビルドイメージがプルされていることを確認します。

$ docker pull lambci/lambda

Dockerコンテナー内でビルドスクリプトを実行します。

Mac/Linux:

$ docker run --rm -v "$PWD":/var/task lambci/lambda:build-python3.6 /var/task/build.sh

Windows:

docker run --rm -v ${PWD}:/var/task lambci/lambda:build-python3.6 chmod +x build.sh;./build.sh

これで、AWSにアップロードできるAmazon Linux上に構築されたlambda_package.Zipという名前のファイルが表示されます。

お役に立てば幸いです。

0
JD D