Heim  >  Artikel  >  Backend-Entwicklung  >  Installieren von Python-Abhängigkeiten auf AWS Lambda mithilfe von EFS

Installieren von Python-Abhängigkeiten auf AWS Lambda mithilfe von EFS

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-24 21:21:12822Durchsuche

Installing Python Dependencies on AWS Lambda Using EFS

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.


Voraussetzungen

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:

  1. AWS Lambda-Funktion: Eine bereitgestellte Lambda-Funktion, die Sie mit EFS konfigurieren.
  2. EFS-Dateisystem: Ein elastisches Dateisystem, das in derselben AWS-Region erstellt wurde.
  3. EFS-Zugriffspunkt: Ein EFS-Zugriffspunkt, der in derselben AWS-Region erstellt wurde, mit dem Stammverzeichnispfad zu /data. Stellen Sie sicher, dass Sie die POSIX-Berechtigungen und Verzeichniserstellungsberechtigungen entsprechend festlegen, wie folgt: 1101 und 1001, Sekundäre Gruppe ID 1002 und Berechtigungen 0755.
  4. VPC und Netzwerk: Stellen Sie sicher, dass sich die Lambda-Funktion in derselben VPC wie das EFS befindet und dass Subnetze und Sicherheitsgruppen ordnungsgemäß konfiguriert sind.
  5. IAM-Berechtigungen: Ihre Lambda-Funktion benötigt Berechtigungen für den Zugriff auf das EFS. Hängen Sie die entsprechende Richtlinie an (z. B. elastisches Dateisystem:ClientMount, elastisches Dateisystem:ClientWrite).

Handlercode für die Installation von Paketen

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}"}

Schritte zum Testen

Übergeben Sie beim Aufrufen Ihrer Lambda-Funktion die folgende JSON-Nutzlast:

{
    "packages": ["requests", "pandas"]
}

Paketinstallation überprüfen

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}"}

Endlich die installierten Abhängigkeiten in Lambda nutzen

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:

Wichtiger Hinweis

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"]
}

Hauptvorteile

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.

Vorteile der Verwendung von EFS für Abhängigkeiten:

  • Lambda-Layer-Größenbeschränkungen umgehen: Installieren und verwenden Sie Bibliotheken, ohne sich Gedanken über Verpackungsbeschränkungen machen zu müssen.
  • Ermöglichen Sie die Geodatenverarbeitung in großem Maßstab: Führen Sie komplexe räumliche Berechnungen in einer serverlosen Umgebung durch.
  • Optimieren Sie das Abhängigkeitsmanagement: Fügen Sie Bibliotheken dynamisch hinzu oder aktualisieren Sie sie, ohne Ihre Lambda-Funktion erneut bereitzustellen.

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn