パンダをインポートする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"
しかし、AWS Lambdaでラムダ関数をテストすると、次のエラーが表示されます。
Unable to import module 'lambda_function': Missing required dependencies ['numpy']
Zipパッケージには既にnumpyが含まれていますが、それでもこのエラーが発生します。 Pandas&AWS Lambda で与えられたヒントに従おうとしたが、運はなかった。
誰もが同じ問題に遭遇しましたか。この問題を解決するためのヒントや提案をいただければ幸いです。
ありがとう
編集:最終的に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ランタイムをラムダ関数に使用します。
ラムダZipにnumpyを含めるには、AWSドキュメントのこのページの指示に従ってください...
Pythonコンパイル済みバイナリを含むパッケージをデプロイパッケージに追加し、パッケージをAWS Lambdaと互換性を持たせるにはどうすればよいですか?
Numpyを例として使用して指示を言い換えるには:
[ファイルのダウンロード]を選択します。
ダウンロード:
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
unzip numpy-1.15.2-cp36-cp36m-manylinux1_x86_64.whl
Wheelファイルが圧縮されていない場合、デプロイパッケージはLambdaと互換性があります。
すべてが理にかなっていることを望む;)
最終結果は次のようになります。注:展開パッケージにwhlファイルを含めないでください。
多くの研究を行った後、Lambdaレイヤーで動作させることができました。
クリーンディレクトリを作成または開き、以下の手順に従います。
前提条件:Dockerが稼働していることを確認してください
pandas==0.23.4 pytz==2018.7
#!/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}
chmod +x get_layer_packages.sh ./get_layer_packages.sh Zip -r pandas.Zip .
レイヤーをS3バケットにアップロードします。
以下のコマンドを実行して、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
Lambdaコンソールに移動し、コードをZipファイルとしてアップロードするか、インラインエディターを使用します。
[レイヤー]> [レイヤーの追加]> [互換レイヤーからレイヤー(pandas-layer)を検索]をクリックし、バージョンを選択します。
また、numpyのインポートにデフォルトで使用可能なAWSLambda-Python36-SciPy1xレイヤーを追加します。
この中記事のおかげで https://medium.com/@qtangs/creating-new-aws-lambda-layer-for-python-pandas-library-348b126e9f3e
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
AWS Lambdaを使用してNodeJSでMySQLが見つからない のわずかな複製
ライブラリをLambdaでパッケージ化する必要があります。ラムダはパブリッククラウドで実行されるため、構成できません。
パンダを使用している場合、ZipでPandasをパッケージ化する必要があります。パンダへのパスを取得します(例:/Users/dummyUser/anaconda/lib/python3.6/site-packages)を作成し、ライブラリをラムダ関数コードがある場所にコピーします。コード内で、ローカルコピーのpandasを参照してください。アップロード中に、set(code +ライブラリ)、必要に応じてアップロードします。動作するはずです。
私はpython3.6エンジンを使用しようとして、同様のエラーに苦しんでいます。 2.7に切り替えたとき、うまく機能しました。 Amazon AMIを使用してZipファイルを作成しましたが、3.6ではなくpython3.5しかありません。バージョンの不一致が原因だと思います。しかし、それは単なる推測であり、私はまだpython3.6インストールでプロセスを試していません。
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ファイルをディレクトリにダウンロードします。 pandas
、numpy
、および*.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関数にアップロードします。
ソース: https://medium.com/@korniichuk/lambda-with-pandas-fd81aa2ff25e
サーバーレスフレームワーク を使用すると、依存関係を簡単に正しくパッケージ化および展開できます。
あなただけが必要です。
サーバーレスをインストールする
npm install -g serverless
以下を使用して、プロジェクトのルートに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を調整します
dockerが実行されていることを確認して実行する
serverless deploy
デプロイが完了したら、AWSコンソールで関数numpy-test-dev-numpyを探し、関数をテストします。
この記事 必要な手順を詳細に説明しています。
あなたのコードは常にこのエラーを出します
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"
これは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
という名前のファイルが表示されます。
お役に立てば幸いです。