Mein Ziel ist es, Python 3-Code auf dem AWS Lambda-Dienst auszuführen, der derzeit nur Python 2.7 unterstützt. Dies sind die Schritte, die ich gemacht habe.Ausführen von Python3 ohne Aktivierung der virtuellen Umgebung
Da ich auf einem Mac arbeiten, Setup ein Docker Bild similar auf die AWS Lambda Linux-Instanz.
Build Python3 von der Quelle auf dem Docker-Image.
Erstellen Sie im Docker-Image eine virtuelle Umgebung und kopieren Sie sie in mein Projekt.
AWS Lambda erfordert, dass Sie eine Postleitzahl des Codes erstellen und diese in den Dienst hochladen. Aus diesem Prototyp habe ich einen Reißverschluss mit drei Artefakte an der Wurzel
handler.py
: Dies ist ein Python 2.7-Datei. Diehandler
-Funktion in dieser Datei wird vom AWS Lambda-Service ausgeführt, wenn ein Ereignis auftritt (z. B. wenn eine neue Datei in einem S3-Bucket erstellt wird).def handler(event, context): execution_uuid = uuid.uuid4() commands = ''' source venv/bin/activate && venv/bin/python3.6 ./handler_python3.py --execution_uuid {ex_uuid} '''.format(ex_uuid=str(execution_uuid)) p = Popen('/bin/bash', shell=True, stdin=PIPE, stdout=PIPE, stderr=PIPE, close_fds=True) stdout, stderr = p.communicate(commands) pprint(stdout) pprint(stderr)
handler_python3.py
. Dies ist die Python3-Datei, die von der früherenhandler.py
-Datei aufgerufen wird. Beachten Sie, dassexecution_uuid
gelesen wird. Ich habe den Code, der es für die Kürze verwendet, herausgenommen, aber ich brauche es und ich verwendeargparse
, um es zu extrahieren.def read_execution_uuid(): import argparse parser = argparse.ArgumentParser() parser.add_argument("--execution_uuid", required=True) args = parser.parse_args() return args.execution_uuid def handler(event, context): import sys print(sys.path) if __name__ == '__main__': execution_uuid = read_execution_uuid() handler(event, context)
venv
Ordner. Dies ist der Ordner für die virtuelle Umgebung, den ich vom Docker-Image kopiert habe.
Wenn ich die AWS Lambda-Service laufen lasse, erhalte ich folgende Fehlermeldung
Traceback (most recent call last):
File "./handler_python3.py", line 38, in <module>
execution_uuid = read_execution_uuid()
File "./handler_python3.py", line 7, in read_execution_uuid
import argparse
ModuleNotFoundError: No module named \'argparse\'
Hinweise:
Wenn ich entfernen Sie den
argparse
Code und diehandler
Funktion inhandler_python3.py
ausgeführt wird, zeigt es die folgenden ng-Werte fürsys.path
['/var/task', '/var/runtime', '/var/task/venv/lib/python36.zip', '/var/task/venv/lib/python3.6', '/var/task/venv/lib/python3.6/lib-dynload', '/usr/local/lib/python3.6', '/var/task/venv/lib/python3.6/site-packages']
Hinweise:
- ich argparse explizit installieren können. Aber ich möchte nicht.
- Beachten Sie den Befehl
source venv/bin/activate
in der Python 2.7-Dateihandler.py
. Das funktioniert nicht auf der Lambda-Instanz, obwohl es lokal arbeitet.