Eine der häufigsten Herausforderungen für Entwickler bei der Arbeit mit AWS Lambda ist die Verwaltung großer Python-Abhängigkeiten. Bibliotheken wie Pandas, Shapely und GeoPandas, die für Aufgaben wie Geodatenanalysen unerlässlich sind, überschreiten häufig Lambdas 250 MB-Limit für entpackte Ebenen. Eine praktische Lösung? Speichern Sie Ihre Abhängigkeiten auf einem EFS (Elastic File System) und mounten Sie es in Ihre Lambda-Funktion.
In diesem Beitrag gehen wir durch den Einrichtungsprozess, einschließlich der Voraussetzungen, der wichtigsten Vorteile und der schrittweisen Implementierung.
Dieser Beitrag richtet sich an Benutzer mit fortgeschrittener AWS-Erfahrung. Es setzt ein solides Verständnis von AWS-Services wie Lambda, EFS, VPC und Sicherheitsgruppen sowie Vertrautheit mit der Verwaltung der Infrastruktur und der Bereitstellung skalierbarer Lösungen in der Cloud voraus.
Bevor wir uns mit der Einrichtung befassen, stellen Sie sicher, dass Sie Folgendes haben:
Der Handler installiert Python-Abhängigkeiten direkt auf einem Amazon EFS-Speicher, der an eine AWS Lambda-Funktion gemountet ist. Dieser Ansatz umgeht die Größenbeschränkungen von Lambda-Ebenen und eignet sich daher für starke Abhängigkeiten wie Pandas, Geopandas und Shapely, die häufig für die Verarbeitung von Geodaten erforderlich sind. Dadurch wird sichergestellt, dass die erforderlichen Bibliotheken im Verzeichnis /mnt/data verfügbar sind, damit Lambda sie während der Ausführung verwenden kann:
import os import subprocess PACKAGE_DIR = "/mnt/data/lib/{}/site-packages/" def get_python_version_tag(): """Generates a Python version tag like 'python3.11'.""" return f"python{os.sys.version_info.major}.{os.sys.version_info.minor}" def install_package(package): """Installs a Python package into the EFS-mounted directory.""" target_dir = PACKAGE_DIR.format(get_python_version_tag()) os.makedirs(target_dir, exist_ok=True) try: subprocess.run( [ "pip", "install", package, "--target", target_dir, "--upgrade", "--no-cache-dir", ], check=True, ) print(f"Package {package} installed successfully!") except subprocess.CalledProcessError as e: print(f"Failed to install package {package}: {e}") def handler(event, context): """AWS Lambda Handler for installing packages.""" try: # List of packages to install from the event input packages = event.get("packages", []) for package in packages: install_package(package) #optional for see packages installed #os.system(f"ls -la {PACKAGE_DIR.format(get_python_version_tag())}") return {"statusCode": 200, "body": "Packages installed successfully!"} except Exception as e: print(f"Error: {e}") return {"statusCode": 500, "body": f"An error occurred: {e}"}
Übergeben Sie beim Aufrufen Ihrer Lambda-Funktion die folgende JSON-Nutzlast:
{ "packages": ["requests", "pandas"] }
Navigieren Sie mithilfe einer SSH-Sitzung oder AWS CLI zu Ihrem EFS-Bereitstellungspunkt (z. B. /mnt/data/lib/).
Überprüfen Sie die installierten Pakete im Verzeichnis site-packages/.
oder verwenden Sie einfach a, um die installierten Pakete anzuzeigen
import os import subprocess PACKAGE_DIR = "/mnt/data/lib/{}/site-packages/" def get_python_version_tag(): """Generates a Python version tag like 'python3.11'.""" return f"python{os.sys.version_info.major}.{os.sys.version_info.minor}" def install_package(package): """Installs a Python package into the EFS-mounted directory.""" target_dir = PACKAGE_DIR.format(get_python_version_tag()) os.makedirs(target_dir, exist_ok=True) try: subprocess.run( [ "pip", "install", package, "--target", target_dir, "--upgrade", "--no-cache-dir", ], check=True, ) print(f"Package {package} installed successfully!") except subprocess.CalledProcessError as e: print(f"Failed to install package {package}: {e}") def handler(event, context): """AWS Lambda Handler for installing packages.""" try: # List of packages to install from the event input packages = event.get("packages", []) for package in packages: install_package(package) #optional for see packages installed #os.system(f"ls -la {PACKAGE_DIR.format(get_python_version_tag())}") return {"statusCode": 200, "body": "Packages installed successfully!"} except Exception as e: print(f"Error: {e}") return {"statusCode": 500, "body": f"An error occurred: {e}"}
Aktualisieren Sie den Handler Ihrer Lambda-Funktion, um die auf EFS installierten Abhängigkeiten einzuschließen. Der Schlüssel hier besteht darin, den Pfad der Abhängigkeiten in efs in einen PYTHONPATH des Lambda-Handlers einzubinden:
Alle Lambda-Funktionen, die die installierten Abhängigkeiten verwenden möchten, müssen das EFS an das Lambda anhängen. Ohne diesen Anhang kann Lambda nicht auf die erforderlichen Abhängigkeiten zugreifen, die auf EFS gespeichert sind.
{ "packages": ["requests", "pandas"] }
Während die Installation von Python-Abhängigkeiten direkt in EFS keine gängige Praxis ist, bietet sie bestimmte Vorteile in Szenarien, in denen die Standardeinschränkungen von Lambda, wie z. B. die Größe der entpackten Ebene von 250 MB, restriktiv werden. Dieser Ansatz ist besonders vorteilhaft für Anwendungen, die Geodatenberechnungen mit umfangreichen Bibliotheken wie Pandas, Shapely und GeoPandas erfordern, die häufig die Ebenengrößenbeschränkung überschreiten.
Diese Lösung ist ideal für fortgeschrittene Datenverarbeitungsaufgaben, wie z. B. Geoanalyse, und ermöglicht außerdem die einfache Skalierung des Speichers nach Bedarf, während die Flexibilität einer serverlosen Architektur erhalten bleibt.
Das obige ist der detaillierte Inhalt vonInstallieren von Python-Abhängigkeiten auf AWS Lambda mithilfe von EFS. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!