Python'da AWS Lambda içe aktarma modülü hatası


93

Bir AWS Lambda python dağıtım paketi oluşturuyorum. Bir dış bağımlılık isteği kullanıyorum. Harici bağımlılığı AWS belgelerini http://docs.aws.amazon.com/lambda/latest/dg/lambda-python-how-to-create-deployment-package.html kullanarak kurdum . Python kodum aşağıdadır.

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

Zip'i proje-dir dizininin içeriğini oluşturdu ve lambda'ya yükledi (Dizini değil dizin içeriğini sıkıştırın). İşlevi çalıştırdığımda aşağıda belirtilen hatayı alıyorum.

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

Lütfen hatayı ayıklamama yardım edin.


Tam kodunuz mu? Hata ile, import lambda_functionbulunmayan bir şeyin isteyeceği bir yerde görünüyor . Belki istiyorsun from future import lambda_function? Veya cmd satırına sadece lambda_function kurun .
Berci

@Berci AWS platformunda bu python kodunu çalıştırıyorum. Pip kullanamıyorum. kodumun herhangi bir yerinde lambda_function kullanıyorum. Aynı kodu kopyalayıp AWS konsoluna yapıştırırsam işe yarayacak
Nithin K Anil

Bu konudaki son yorumu görün - belki sizin için geçerli olabilir mi?
kwinkunks

@kwinkunks Bunu denedim. Aslında dizini değil içeriği sıkıştırıyorum !!
Nithin K Anil

2
Tahminim, işlevinizdeki "işleyici" seçeneğinin yanlış olmasıdır. "Lambda_function.py" adlı dosya adınızın ve işleyici yönteminin "lambda_handler" olduğunu kontrol edin
Vor

Yanıtlar:


110

Hata, lambda işlevinin dosya adından kaynaklanıyordu. Lambda işlevini oluştururken Lambda işlev işleyicisini soracaktır. Bunu Python_File_Name.Method_Name olarak adlandırmalısınız . Bu senaryoda onu lambda.lambda_handler olarak adlandırdım (lambda.py dosya adıdır).

Lütfen anlık görüntünün altında bulun. görüntü açıklamasını buraya girin


1
Kodum sadece kod olarak lambda'da - dosya olarak değil.
Ben Wheeler

4
@BenWheeler: Satır içi kod olsa bile, aslında yazdığınız bir dosyadır. Dosya adını ve tüm dizin yapısını pencerenin solunda görebilirsiniz.
Vineeth

Bu yüzden koduma "lambda_function.py" adını vermiştim, işleyiciyi Python_lambda_function.lambda_handler olarak adlandırmalı mıyım?
RB17

@RahulBanerjee Hayır, buna lambda_function.lambda_handler diyorsunuz
Dinesh

91

Bir zip dosyası yüklüyorsanız. Dizinin kendisini değil, dizinin içeriğini sıkıştırdığınızdan emin olun.


3
Sıkıştırırken, -r bayrağını da kullandığınızdan emin olun!
Grant Robert Smith

@ 2ank3th sen en iyisisin
Sethuraman Srinivasan

Bunun için teşekkürler.
JamesG

24

Bu sorunun bir başka kaynağı da sıkıştırılan dosya üzerindeki izinlerdir. O MUTLAKA en az dünya çapında okunabilir. (dk chmod 444)

Sıkıştırmadan önce python dosyasında aşağıdakileri çalıştırdım ve iyi çalıştı.

chmod u=rwx,go=r

4
Bu. Python'un ZipFile'ını lambda işlevlerini programlı olarak ZIP'e paketlemek için kullanıyordum, varsayılan 0600olarak bahsettiğiniz gibi hangisinin yeterli olmadığıdır. Ayrıca, entegre Lambda kaynak kodu düzenleyicisi (Amazon web sayfasında), izin sorunları konusunda uyarı vermeden dosyayı mutlu bir şekilde okuyacaktır.
cjhanks

2
İkinci. Burada gösterilen yöntemi kullanarak dosya izinlerini ayarlayarak çalıştırdım: stackoverflow.com/a/434689/931277
dokkaebi

16

Nithin'in cevabını çok yararlı buldum. İşte belirli bir gözden geçirme:

Şu değerleri arayın:

  1. Python betiğinizdeki lambda_handler işlevinin adı. AWS örneklerinde kullanılan ad "lambda_handler" olup "def lambda_handler (olay, bağlam)" gibi görünür. Bu durumda değer "lambda_handler" dır.
  2. Lambda kontrol panelinde, işleve ilişkin lambda panosundaki "Yapılandırma" bölümündeki "İşleyici" metin kutusunda İşleyicinin adını bulun (Nithin'in ekran görüntüsünde gösterilmiştir). Varsayılan adım "lambda_function.lambda_handler" idi.
  3. Python betiğinizin adı. Diyelim ki "cool.py"

Bu değerlerle, işleyiciyi (ekran görüntüsünde gösterilen) "cool.lambda_handler" olarak yeniden adlandırmanız gerekir. Bu, "'lambda_function' modülü içe aktarılamıyor" errorMessage'dan kurtulmanın bir yoludur. Python betiğinizdeki işleyiciyi "sup" olarak yeniden adlandıracak olsaydınız, lambda panosundaki işleyiciyi "cool.sup" olarak yeniden adlandırmanız gerekir.


11

Sadece çok var FRİKİKLERİNDEN (Python için) AWS Lambda'ya için dağıtım paketleri oluştururken. Nadiren başarısız olan bir formül bulana kadar hata ayıklama oturumlarına saatler harcadım.

Tüm süreci otomatikleştiren ve bu nedenle daha az hataya açık hale getiren bir komut dosyası oluşturdum. Ayrıca her şeyin nasıl çalıştığını açıklayan bir eğitim yazdım. Kontrol etmek isteyebilirsiniz:

Sorunsuz Python Lambda Dağıtımı [Eğitim + Komut Dosyası]


2
Harika bir gönderi, ancak en zor kısımda, yani yerel kitapların nasıl paketleneceğiyle ilgili ayrıntıları özlüyorum. Bunun ne kadar karmaşık olduğu gerçekten normal değil
JohnAndrews

10

İşte hızlı bir adım.

deployLambda dosyanız çağrı içinde olan bir klasörünüz olduğunu varsayın lambda_function.py. Bu dosyanın böyle bir şeye benzediğini varsayalım. ( p1ve p2üçüncü taraf paketlerini temsil eder.)

import p1
import p2

def lambda_handler(event, context):
    # more code here

    return {
        "status": 200,
        "body" : "Hello from Lambda!",
    }

Her üçüncü taraf bağımlılığı pip install <third-party-package> --target .için deployklasörün içinden yapmanız gerekir .

pip install p1 --target .
pip install p2 --target .

Bunu yaptıktan sonra, yapınızın nasıl görünmesi gerektiği burada.

deploy/
├── lambda_function.py
├── p1/
│   ├── __init__.py
│   ├── a.py
│   ├── b.py
│   └── c.py
└── p2/
    ├── __init__.py
    ├── x.py
    ├── y.py
    └── z.py

Son olarak, klasör zipiçindeki tüm içeriği deploysıkıştırılmış bir dosyaya almanız gerekir . Bir Mac veya Linux'ta, komut klasörün zip -r ../deploy.zip *içinden görünecektir deploy. -rBayrağın özyinelemeli alt klasörler için olduğunu unutmayın .

Dosya zip dosyasının yapısı orijinal klasörü yansıtmalıdır.

deploy.zip/
├── lambda_function.py
├── p1/
│   ├── __init__.py
│   ├── a.py
│   ├── b.py
│   └── c.py
└── p2/
    ├── __init__.py
    ├── x.py
    ├── y.py
    └── z.py

Zip dosyasını yükleyin ve yukarıdaki örnekte <file_name>.<function_name>olduğu gibi, Lambda'nın sürecinize girmesi için belirtin lambda_function.lambda_handler.


1
Ek olarak, tüm klasörü zip -r deploy.zip deploy. Bu, zip dosyası içinde bir dağıtım klasörü oluşturacaktır.
openwonk

9

Yukarıdaki tüm çözümleri denedikten sonra bunu zor buldum. Zip dosyasında alt dizinler kullanıyorsanız, __init__.pydosyayı her bir alt dizine eklediğinizden ve benim için çalıştığından emin olun .


7

Ben de hata yaptım. Zip dosyamın kod üst klasörünü içerdiğini belirle. Ne zaman unzipve zip dosyasını incelemek, lambda_functiondosya üst klasörün altında ./lambda.

zipKomutu kullanın, hatayı düzeltin:

zip -r ../lambda.zip ./*

1
zip dosyasını kod klasörünüzün içinde çalıştırın. benim durumum burada, cd lambda && zip -r ../lambda.zip ./*
Joe

4

Gelen lambda_handlerformatında olmalıdır lambda_filename.lambda_functionName. lambda_handlerFonksiyonu çalıştırmak istediğinizi varsayarsak lambda_fuction.py, işleyici formatınızdır lambda_function.lambda_handler.

Bu hatayı almanın bir başka nedeni de modül bağımlılıklarıdır.

Sizin lambda_fuction.pyzip dosyasının kök dizininde olmalıdır.



2

2019'dan bir bakış:

AWS Lambda artık birçok kişinin (ben de dahil) satır içi lambdalar için çalışma zamanı olarak kullanmayı seçtiği Python 3.7'yi destekliyor.

Daha sonra harici bir bağımlılığı içe aktarmak zorunda kaldım ve OP'nin atıfta bulunduğu AWS Belgelerini takip ettim. (yerel kurulum -> zip -> yükle).

İçe aktarma modülü hatası aldım ve yerel bilgisayarımda varsayılan Python olarak Python 2.7 olduğunu fark ettim. Pip'i çağırdığımda, Python 2.7 için bağımlılığımı kurdu.

Bu yüzden yerel olarak lambda konsolunda seçilen çalışma zamanı sürümüyle eşleşen Python sürümüne geçtim ve ardından harici bağımlılıkları yeniden yükledim. Bu benim için sorunu çözdü. Örneğin:

$ python3 -m pip install --target path/to/lambda_file <external_dependency_name>

1

Aynı sorunla karşılaştım, bu, yanılmıyorsam lynda.com'daki bir eğitimin parçası olarak bir alıştırmaydı. Yaptığım hata, çalışma zamanını lamda işlev konsolunda bir seçenek olan Python 3.6 olarak seçmemek oldu.


1

Buradaki sorun, Lambda işlev bağımlılıklarınızı (kendi makinenizde) oluşturmak için kullanılan Python sürümünün, Lambda işleviniz için seçilen Python sürümünden farklı olmasıdır. Bu durum, özellikle bağımlılıklarınızın Numpy kitaplığı parçasıysa yaygındır.

Örnek: Makinenizin python sürümü: 3.6 -> Lambda python sürümü 3.6


0

Tüm gereksinimleri sıkıştırmanız gerekiyor, bu komut dosyasını kullanın

#!/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

La kullan:

package.sh <python_file>

0

Aynı sorun için çözümümü paylaşıyorum, sadece birine yardımcı olması durumunda.

Sorun: Hata: "[ERROR] Runtime.ImportModuleError: 'lambda_function' modülü içe aktarılamıyor: AWS makalesinde [2] sağlanan aws-big-data-blog [1] yürütülürken 'StringIO' adlı modül yok.

Çözüm: Çalışma Zamanı Python 3.7'den Python 2.7'ye değiştirildi

[1] - https://github.com/bsnively/aws-big-data-blog/blob/master/aws-blog-vpcflowlogs-athena-quicksight/CloudwatchLogsToFirehose/lambdacode.py [2] - https: // aws .amazon.com / bloglar / big-data / amazon-kinesis-firehose-amazon-athena-and-amazon-quicksight ile-vpc-akış-günlükleri-analizi /


Benim için tam
tersi oldu

0

Lambda işlevinizi, katmanlar biçiminde ek kod ve içerik alacak şekilde yapılandırabilirsiniz. Katman, kitaplıklar, özel bir çalışma zamanı veya diğer bağımlılıkları içeren bir ZIP arşividir. Katmanlarla, kitaplıkları dağıtım paketinize eklemenize gerek kalmadan işlevinizde kullanabilirsiniz. Katmanlar, dağıtım paketinizi küçük tutmanıza olanak tanır ve bu da geliştirmeyi kolaylaştırır.

Referanslar:-

  1. https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html
  2. https://towardsdatascience.com/introduction-to-amazon-lambda-layers-and-boto3-using-python3-39bd390add17


0

Benim sorunum, .py dosyası ve bağımlılıklarının zip'in "kök" dizininde olmamasıydı. örneğin, kitaplıkların yolu ve lambda işlevi .py şöyle olmalıdır:

<lambda_function_name>.py
<name of library>/foo/bar/

değil

/foo/bar/<name of library>/foo2/bar2

Örneğin:

drwxr-xr-x  3.0 unx        0 bx stor 20-Apr-17 19:43 boto3/ec2/__pycache__/
-rw-r--r--  3.0 unx      192 bx defX 20-Apr-17 19:43 boto3/ec2/__pycache__/__init__.cpython-37.pyc
-rw-r--r--  3.0 unx      758 bx defX 20-Apr-17 19:43 boto3/ec2/__pycache__/deletetags.cpython-37.pyc
-rw-r--r--  3.0 unx      965 bx defX 20-Apr-17 19:43 boto3/ec2/__pycache__/createtags.cpython-37.pyc
-rw-r--r--  3.0 unx     7781 tx defN 20-Apr-17 20:33 download-cs-sensors-to-s3.py

0

Aslında sıkıştırmak istediğiniz ana klasöre (dağıtım paketi) gidin,

Bu klasörün içinde tüm dosyaları seçin ve ardından zip dosyasını oluşturun ve bu zip dosyasını yükleyin


0

Lütfen aşağıdakilerden sonra ekleyin Import requests

import boto3

Gördüğüm şey kodunuzda eksik.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.