View a markdown version of this page

Lazy-load Container-Images mit Seekable OCI (SOCI) - AWS Lambda

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Lazy-load Container-Images mit Seekable OCI (SOCI)

Bei Lambda Event Functions, die als Container-Images auf Lambda Managed Instances bereitgestellt werden, lädt Lambda das Image auf jeder Instance herunter und entpackt es, bevor eine Ausführungsumgebung gestartet wird. Bei großen Images ist dieser Abruf der größte Teil der Zeit zwischen der Veröffentlichung einer Funktionsversion oder der Skalierung und der Verarbeitung des ersten Aufrufs durch die Ausführungsumgebung. Mit Seekable OCI (SOCI) kann Lambda die Ausführungsumgebung starten, bevor das gesamte Image heruntergeladen wurde.

SOCI ist ein Open-Source-Technologie entwickelt von AWS. Es verwendet einen Index, der jede Datei im Bild ihrer Position in den Bildebenen zuordnet. Lambda verwendet den Index, um bei Bedarf nur die Dateien abzurufen, während Ihre Funktion sie liest, anstatt das gesamte Bild herunterzuladen und zu entpacken, bevor der Container gestartet wird. Container-Images bündeln in der Regel eine Vielzahl von Bibliotheken und Abhängigkeiten, von denen nicht alle beim Start oder bei einem einzelnen Aufruf gelesen werden. Lazy Loading macht sich dies zunutze, indem es nur das abruft, was Ihre Funktion tatsächlich liest, wodurch die Zeit bis zum ersten Aufruf reduziert wird und die Startzeit viel weniger empfindlich auf die Gesamtgröße des Bilds reagiert. Der Vorteil ist am größten bei Bildern mit mehreren Gigabyte, bei denen Ihre Funktion pro Aufruf nur eine Teilmenge des Inhalts liest, z. B. bei Bildern, die Frameworks für maschinelles Lernen enthalten.

So funktioniert SOCI auf Lambda Managed Instances

  1. Sie erstellen einen SOCI-Index für Ihr Image und übertragen ihn zusammen mit dem Image an Amazon ECR. Das Ergebnis ist ein OCI-Image-Index (Open Container Initiative), der auf zwei Artefakte verweist: Ihr ursprüngliches Image-Manifest und den SOCI-Index.

  2. Sie erstellen oder aktualisieren Ihre Funktion mit einer Bild-URI, die auf den Bildindex verweist. Lambda erkennt den SOCI-Index und aktiviert verzögertes Laden für die Ausführungsumgebungen dieser Funktion. Sie müssen keine andere Funktionskonfiguration ändern.

  3. Lambda ruft Bildinhalte bei Bedarf ab. Dateien, die Ihr Initialisierungscode liest, werden während der Initialisierung abgerufen. Dateien, die Ihr Handler zum ersten Mal liest, werden während dieses Aufrufs abgerufen. Lambda lädt den Rest des Bilds im Hintergrund nicht herunter.

Anmerkung

Wenn Ihre Funktion eine Datei zum ersten Mal während eines Aufrufs und nicht während der Initialisierung liest, ruft Lambda diese Datei beim ersten Aufruf ab, wodurch die Dauer dieses Aufrufs verlängert wird. Um die Aufrufdauer konsistent zu halten, importieren Sie alle Bibliotheken und lesen Sie alle Dateien, die Ihre Funktion benötigt, in Ihrem Initialisierungscode, nicht im Handler. Wir empfehlen, Ihre Funktion mit und ohne SOCI zu testen, um die Startzeit und die Aufrufdauer für Ihren Workload zu vergleichen.

Erstellen Sie einen SOCI-Index für Ihr Bild

Das folgende Beispiel läuft auf Amazon Linux 2023. Es installiert den SOCI-Snapshotter, containerd und nerdctl, erstellt dann einen SOCI-Index für ein vorhandenes Bild in Amazon ECR und überträgt das Ergebnis. Ersetzen Sie die Platzhalter-Werte durch Ihre eigenen. Weitere Möglichkeiten, einen SOCI-Index zu erstellen und zu übertragen, finden Sie unter Erste Schritte mit dem SOCI-Snapshotter auf GitHub.

sudo yum install -y soci-snapshotter containerd nerdctl sudo systemctl start soci-snapshotter sudo systemctl restart containerd ACCOUNT_ID="111122223333" REGION="us-east-2" REPOSITORY_NAME="my-function" ORIGINAL_IMAGE_TAG="v1" SOCI_IMAGE_TAG="v1-soci" REGISTRY="$ACCOUNT_ID.dkr.ecr.$REGION.amazonaws.com" aws ecr get-login-password --region $REGION | sudo nerdctl login -u AWS --password-stdin $REGISTRY sudo nerdctl pull $REGISTRY/$REPOSITORY_NAME:$ORIGINAL_IMAGE_TAG sudo nerdctl image convert --soci $REGISTRY/$REPOSITORY_NAME:$ORIGINAL_IMAGE_TAG $REGISTRY/$REPOSITORY_NAME:$SOCI_IMAGE_TAG sudo nerdctl push --platform linux/arm64 $REGISTRY/$REPOSITORY_NAME:$SOCI_IMAGE_TAG
Anmerkung

Dieses Beispiel erstellt eine arm64 (AWS Graviton) -Bild. Lambda unterstützt nur Container-Images mit einer einzigen Architektur, daher muss Ihr Image auf eine Architektur mit einem einzigen Befehlssatz abzielen, und --platform Der Wert muss mit der Architektur Ihrer Funktion übereinstimmen. Weitere Informationen finden Sie unter Auswahl und Konfiguration einer Befehlssatzarchitektur für Ihre Lambda-Funktion.

Benutzen $REGISTRY/$REPOSITORY_NAME:$SOCI_IMAGE_TAG als Bild-URI, wenn Sie Ihre Funktion erstellen oder aktualisieren. Veröffentlichen Sie dann eine Funktionsversion. Lambda löst die Funktionsversion in den Bildindex auf und ermöglicht verzögertes Laden.

Anforderungen und Einschränkungen

Version des SOCI-Indexes

Lambda unterstützt nur SOCI Index Manifest v2 (Medientyp) application/vnd.amazon.soci.index.v2+json). Lambda unterstützt keine SOCI Index Manifest v1-Indizes. Das nerdctl image convert --soci Der Befehl im vorherigen Abschnitt erzeugt einen v2-Index.

Format des Bildindex

Der Bildindex muss genau zwei Einträge enthalten: den SOCI-Index und ein OCI-Image-Manifest.

Image-URI

Zeigen Sie mit der Bild-URI Ihrer Funktion auf den SOCI-indexed Tag (zum Beispiel my-function:v1-soci), nicht am ursprünglichen Bild-Tag. Lambda löst die Funktionsversion in den Bildindex auf. Um das Bild oder den Index zu ändern, drücken Sie einen neuen SOCI-indexed taggen und aktualisieren Sie die Bild-URI der Funktion darauf.

Verfügbarkeit

SOCI ist nur für Container-Image-Funktionen verfügbar, die auf Lambda Managed Instances ausgeführt werden.