Ich erstelle ein AWS Lambda Python-Bereitstellungspaket. Ich verwende eine externe Abhängigkeitsanforderung. Ich habe die externe Abhängigkeit mithilfe der AWS-Dokumentation http://docs.aws.amazon.com/lambda/latest/dg/lambda-python-how-to-create-deployment-package.html installiert . Unten ist mein Python-Code.
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
Erstellt die Zip den Inhalt des Projektverzeichnisverzeichnisses und lädt es in das Lambda hoch (Zip den Verzeichnisinhalt, nicht das Verzeichnis). Wenn ich die Funktion ausführe, erhalte ich den unten genannten Fehler.
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
Bitte helfen Sie mir, den Fehler zu debuggen.
python
amazon-web-services
aws-lambda
Nithin K Anil
quelle
quelle
import lambda_function
das nicht gefunden wird. Vielleicht willst dufrom future import lambda_function
? Oder installieren Sie einfach lambda_function in der cmd-Zeile.Antworten:
Der Fehler war auf den Dateinamen der Lambda-Funktion zurückzuführen. Beim Erstellen der Lambda-Funktion wird nach dem Lambda-Funktionshandler gefragt. Sie müssen es als Python_File_Name.Method_Name benennen . In diesem Szenario habe ich es als lambda.lambda_handler bezeichnet (lambda.py ist der Dateiname).
Nachfolgend finden Sie den Schnappschuss.
quelle
Wenn Sie eine Zip-Datei hochladen. Stellen Sie sicher, dass Sie den Inhalt des Verzeichnisses und nicht das Verzeichnis selbst komprimieren.
quelle
Eine weitere Ursache für dieses Problem sind die Berechtigungen für die komprimierte Datei. Es muss mindestens weltweit lesbar sein. (min
chmod 444
)Ich habe Folgendes für die Python-Datei ausgeführt, bevor ich sie komprimiert habe, und sie hat einwandfrei funktioniert.
quelle
0600
was, wie Sie bereits erwähnt haben, nicht ausreicht. Darüber hinaus liest der integrierte Lambda-Quellcode-Editor (auf der Amazon-Webseite) die Datei ohne Warnung vor Berechtigungsproblemen.Ich fand Nithins Antwort sehr hilfreich. Hier ist eine spezielle Anleitung:
Schlagen Sie diese Werte nach:
Mit diesen Werten müssten Sie den Handler (siehe Screenshot) in "cool.lambda_handler" umbenennen. Dies ist eine Möglichkeit, die Fehlermeldung "Modul 'lambda_function' kann nicht importiert werden" zu entfernen. Wenn Sie den Handler in Ihrem Python-Skript in "sup" umbenennen möchten, müssen Sie den Handler im Lambda-Dashboard in "cool.sup" umbenennen.
quelle
Beim Erstellen von Bereitstellungspaketen für AWS Lambda (für Python) gibt es nur so viele Fallstricke . Ich habe Stunden und Stunden mit Debugging-Sitzungen verbracht, bis ich eine Formel gefunden habe, die selten fehlschlägt.
Ich habe ein Skript erstellt, das den gesamten Prozess automatisiert und ihn daher weniger fehleranfällig macht. Ich habe auch ein Tutorial geschrieben, das erklärt, wie alles funktioniert. Vielleicht möchten Sie es ausprobieren:
Problemlose Python Lambda-Bereitstellung [Tutorial + Skript]
quelle
Hier ist ein kurzer Schritt durch.
Angenommen, Sie haben einen Ordner
deploy
mit Ihrer Lambda-Datei im Aufruflambda_function.py
. Nehmen wir an, diese Datei sieht ungefähr so aus. (p1
undp2
stellen Pakete von Drittanbietern dar.)Für jede Abhängigkeit von Drittanbietern müssen Sie
pip install <third-party-package> --target .
aus demdeploy
Ordner heraus.Sobald Sie dies getan haben, sehen Sie hier, wie Ihre Struktur aussehen sollte.
Schließlich müssen Sie den
zip
gesamten Inhalt desdeploy
Ordners in eine komprimierte Datei umwandeln. Auf einem Mac oder Linux würde der Befehlzip -r ../deploy.zip *
aus demdeploy
Ordner heraus aussehen . Beachten Sie, dass das-r
Flag für rekursive Unterordner gilt.Die Struktur der Datei-Zip-Datei sollte den ursprünglichen Ordner widerspiegeln.
Laden Sie die Zip-Datei hoch und geben Sie
<file_name>.<function_name>
an, welche Lambda in Ihren Prozess eingehen soll, wie imlambda_function.lambda_handler
obigen Beispiel.quelle
zip -r deploy.zip deploy
. Dadurch wird ein Bereitstellungsordner in der Zip-Datei erstellt.Ich fand diesen schwierigen Weg, nachdem ich alle oben genannten Lösungen ausprobiert hatte. Wenn Sie Unterverzeichnisse in der Zip-Datei verwenden, stellen Sie sicher, dass Sie die
__init__.py
Datei in jedes der Unterverzeichnisse aufnehmen, und das hat bei mir funktioniert.quelle
Ich hatte auch den Fehler. Es stellt sich heraus, dass meine Zip-Datei den übergeordneten Code-Ordner enthält. Wenn ich
unzip
und die Zip-Datei inspiziere, befindet sich dielambda_function
Datei im übergeordneten Ordner./lambda
.Verwenden Sie den
zip
Befehl, um den Fehler zu beheben:quelle
Im
lambda_handler
Format muss seinlambda_filename.lambda_functionName
. Angenommen, Sie möchten dielambda_handler
Funktion ausführen und sie ist inlambda_fuction.py
, dann lautet Ihr Handlerformatlambda_function.lambda_handler
.Ein weiterer Grund für diesen Fehler sind Modulabhängigkeiten.
Sie
lambda_fuction.py
müssen sich im Stammverzeichnis der Zip-Datei befinden.quelle
@nithin, AWS hat das
layers
Konzept fürLambda
Funktionen veröffentlicht. Sie können Ihre Ebene erstellen und dort so viele Bibliotheken hochladen, wie Sie die Ebene mit den Lambda-Funktionen verbinden können. Für weitere Informationen: https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.htmlquelle
Ich bin auf dasselbe Problem gestoßen. Dies war eine Übung im Rahmen eines Tutorials auf lynda.com, wenn ich mich nicht irre. Der Fehler, den ich gemacht habe, war, dass ich die Laufzeit nicht als Python 3.6 ausgewählt habe, was eine Option in der Lamda-Funktionskonsole ist.
quelle
Eine Perspektive von 2019:
AWS Lambda unterstützt jetzt Python 3.7, das von vielen Personen (einschließlich mir) als Laufzeit für Inline-Lambdas verwendet wird.
Dann musste ich eine externe Abhängigkeit importieren und folgte AWS Docs als OP. (lokale Installation -> Zip -> Upload).
Ich hatte den Fehler im Importmodul und stellte fest, dass mein lokaler PC Python 2.7 als Standard-Python hatte. Als ich pip aufrief, wurde meine Abhängigkeit für Python 2.7 installiert.
Also habe ich lokal auf die Python-Version umgestellt, die der ausgewählten Laufzeitversion in der Lambda-Konsole entspricht, und dann die externen Abhängigkeiten neu installiert. Dies löste das Problem für mich. Z.B:
quelle
Sie müssen alle Anforderungen komprimieren, verwenden Sie dieses Skript
benutzen mit:
quelle
Teilen Sie meine Lösung für das gleiche Problem, nur für den Fall, dass es jemandem hilft.
Problem: Ich habe die Fehlermeldung "[ERROR] Runtime.ImportModuleError: Modul 'lambda_function' kann nicht importiert werden: Kein Modul mit dem Namen 'StringIO'" beim Ausführen des in AWS-Artikel [2] bereitgestellten aws-big-data-blog-Codes [1].
Lösung: Die Laufzeit wurde von Python 3.7 auf Python 2.7 geändert
[1] - https://github.com/bsnively/aws-big-data-blog/blob/master/aws-blog-vpcflowlogs-athena-quicksight/CloudwatchLogsToFirehose/lambdacode.py [2] - https: // aws .amazon.com / blogs / big-data / analyse-vpc-flussprotokolle-mit-amazon-kinesis-firehose-amazon-athena-und-amazon-quicksight /
quelle
Sie können Ihre Lambda-Funktion so konfigurieren, dass zusätzlicher Code und Inhalt in Form von Ebenen abgerufen werden. Eine Ebene ist ein ZIP-Archiv, das Bibliotheken, eine benutzerdefinierte Laufzeit oder andere Abhängigkeiten enthält. Mit Layern können Sie Bibliotheken in Ihrer Funktion verwenden, ohne sie in Ihr Bereitstellungspaket aufnehmen zu müssen. Mit Ebenen können Sie Ihr Bereitstellungspaket klein halten, was die Entwicklung erleichtert.
Verweise:-
quelle
Stellen Sie sicher, dass Sie alle Abhängigkeiten in einer Ordnerstruktur als Python / [Ihre alle Abhängigkeiten] komprimieren , damit sie gemäß dieser Dokumentation funktionieren.
https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html#configuration-layers-path
quelle
Mein Problem war, dass sich die .py-Datei und die Abhängigkeiten nicht im "root" -Verzeichnis der Zip-Datei befanden. zB muss der Pfad der Bibliotheken und der Lambda-Funktion .py sein:
nicht
/foo/bar/<name of library>/foo2/bar2
Beispielsweise:
quelle
Gehen Sie tatsächlich zu dem Hauptordner (Bereitstellungspaket), den Sie komprimieren möchten.
Wählen Sie in diesem Ordner alle Dateien aus, erstellen Sie die Zip-Datei und laden Sie diese Zip-Datei hoch
quelle
Keine Notwendigkeit, dieses Chaos zu tun.
Verwenden Sie Python-Lambda
https://github.com/nficano/python-lambda
Mit einem einzigen Befehl
pylambda deploy
wird Ihre Funktion automatisch bereitgestelltquelle