AWS Lambda pythonデプロイメントパッケージを作成しています。 1つの外部依存関係要求を使用しています。 AWSドキュメント http://docs.aws.Amazon.com/lambda/latest/dg/lambda-python-how-to-create-deployment-package.html を使用して外部依存関係をインストールしました。以下は私のpythonコードです。
import requests
print('Loading function')
s3 = boto3.client('s3')
def lambda_handler(event, context):
#print("Received event: " + json.dumps(event, indent=2))
# Get the object from the event and show its content type
bucket = event['Records'][0]['s3']['bucket']['name']
key = urllib.unquote_plus(event['Records'][0]['s3']['object']['key']).decode('utf8')
try:
response = s3.get_object(Bucket=bucket, Key=key)
s3.download_file(bucket,key, '/tmp/data.txt')
lines = [line.rstrip('\n') for line in open('/tmp/data.txt')]
for line in lines:
col=line.split(',')
print(col[5],col[6])
print("CONTENT TYPE: " + response['ContentType'])
return response['ContentType']
except Exception as e:
print(e)
print('Error getting object {} from bucket {}. Make sure they exist and your bucket is in the same region as this function.'.format(key, bucket))
raise e
Project-dirディレクトリのコンテンツのZipを作成し、ラムダにアップロードしました(ディレクトリではなく、ディレクトリのコンテンツを圧縮します)。関数を実行すると、次のエラーが表示されます。
START RequestId: 9e64e2c7-d0c3-11e5-b34e-75c7fb49d058 Version: $LATEST
**Unable to import module 'lambda_function': No module named lambda_function**
END RequestId: 9e64e2c7-d0c3-11e5-b34e-75c7fb49d058
REPORT RequestId: 9e64e2c7-d0c3-11e5-b34e-75c7fb49d058 Duration: 19.63 ms Billed Duration: 100 ms Memory Size: 128 MB Max Memory Used: 9 MB
エラーのデバッグにご協力ください。
Zipファイルをアップロードする場合。ディレクトリ自体ではなく、ディレクトリの内容を圧縮していることを確認してください。
この問題の別の原因は、圧縮されたファイルのアクセス許可です。それ_は_でなければならない少なくとも世界中で読める。 (最小chmod 444
)
pythonファイルを圧縮する前に以下を実行しましたが、うまくいきました。
chmod u=rwx,go=r
ニシンの答えは非常に役立つことがわかりました。具体的なウォークスルーは次のとおりです。
これらの値を検索します。
これらの値を使用して、ハンドラー(スクリーンショットに表示)の名前を「cool.lambda_handler」に変更する必要があります。これは、「モジュール 'lambda_function'をインポートできません」というerrorMessageを取り除く1つの方法です。 pythonスクリプトのハンドラーの名前を「sup」に変更する場合、ラムダダッシュボードのハンドラーの名前を「cool.sup」に変更する必要があります。
AWS Lambda(Python用)のデプロイパッケージを作成するとき、非常に多くのgotchasがあります。失敗することの少ない式が見つかるまで、デバッグセッションに何時間も費やしました。
プロセス全体を自動化するスクリプトを作成したため、エラーが発生しにくくなりました。また、すべてがどのように機能するかを説明するチュートリアルを作成しました。あなたはそれをチェックアウトしたいかもしれません:
上記の解決策をすべて試した後、私はこの難しい方法を見つけました。 Zipファイルでサブディレクトリを使用している場合は、各サブディレクトリに__init__.py
ファイルを含めてください。
私もエラーが発生しました。 Zipファイルにコードの親フォルダーが含まれていることがわかります。 unzip
を使用してZipファイルを検査すると、lambda_function
ファイルは親フォルダー./lambda
の下にあります。
Zip
コマンドを使用して、エラーを修正します。
Zip -r ../lambda.Zip ./*
私は同じ問題にぶつかりました。これは、私が間違っていなければlynda.comのチュートリアルの一部としての演習でした。私が犯した間違いは、ランタイムをPython 3.6として選択しなかったことです。これは、lamda関数コンソールのオプションです。
lambda_handlerの形式はlambda_filename.lambda_functionNameである必要があります。lambda_handler関数を実行したい場合、lambda_fuction.pyにある場合、ハンドラー形式は「lambda_function.lambda_handler」です。エラーが発生する別の理由は、モジュールの依存関係です。 lambda_fuction.pyはZipのルートディレクトリにある必要があります。
@ nithin、AWSはlayers
関数内のLambda
コンセプトをリリースしました。レイヤーを作成し、ライブラリと同じ数だけアップロードしてから、レイヤーをラムダ関数に接続できます。詳細: https://docs.aws.Amazon.com/lambda/latest/dg/configuration-layers.html
その混乱をする必要はありません。
python-lambdaを使用
https://github.com/nficano/python-lambda
単一のコマンドpylambda deploy
で、関数を自動的にデプロイします
すべての要件を圧縮する必要があります。このスクリプトを使用します
#!/usr/bin/env bash
rm package.Zip
mkdir package
pip install -r requirements.txt --target package
cat $1 > package/lambda_function.py
cd package
Zip -r9 "../package.Zip" .
cd ..
rm -rf package
で使用:
package.sh <python_file>