Arbeiten mit Lambda-Container-Images - 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.

Arbeiten mit Lambda-Container-Images

Der Code Ihrer AWS Lambda-Funktion besteht aus Skripts oder kompilierten Programmen und deren Abhängigkeiten. Sie verwenden ein Bereitstellungspaket, um Ihren Funktionscode in Lambda bereitzustellen. Lambda unterstützt zwei Arten von Bereitstellungspaketen: Container-Images und ZIP-Dateiarchiven.

Es gibt drei Möglichkeiten, ein Container-Image für eine Lambda-Funktion zu erstellen:

Tipp

Um die Zeit zu reduzieren, die benötigt wird, bis Lambda-Container-Funktionen aktiv werden, siehe die Docker-Dokumentation unter Verwenden mehrstufiger Builds. Um effiziente Container-Images zu erstellen, folgen Sie den Bewährte Methoden für das Schreiben von Dockerfiles.

Um eine Lambda-Funktion aus einem Container-Image zu erstellen, erstellen Sie Ihr Image lokal und laden es in ein Amazon Elastic Container Registry (Amazon ECR)-Repository hoch. Geben Sie dann den Repository-URI an, wenn Sie die Funktion erstellen. Das Amazon ECR-Repository muss sich im selben AWS-Region wie die Lambda-Funktion befinden. Sie können eine Funktion mit einem Bild in einem anderen AWS-Konto erstellen, sofern sich das Bild in derselben Region wie die Lambda-Funktion befindet. Weitere Informationen finden Sie unter Kontoübergreifende Berechtigungen von Amazon ECR.

Auf dieser Seite werden die Basis-Image-Typen und Anforderungen für die Erstellung von Lambda-kompatiblen Container-Images erläutert.

Anmerkung

Sie können den Bereitstellungspakettyp (ZIP- oder Container-Image) für eine vorhandene Funktion nicht ändern. Sie können beispielsweise eine Container-Image-Funktion nicht konvertieren, um ein ZIP-Dateiarchiv zu verwenden. Sie müssen eine neue Funktion erstellen.

Voraussetzungen

Installieren Sie die AWS Command Line Interface(AWS CLI) Version 2 und die Docker-CLI. Beachten Sie außerdem die folgenden Anforderungen:

  • Das Container-Image muss die Lambda-Laufzeiten-API implementieren. Die AWS Open-Source-Laufzeitschnittstellen-Clients implementieren die API. Sie können Ihrem bevorzugten Basis-Image einen Laufzeitschnittstellen-Client hinzufügen, damit es mit Lambda kompatibel ist.

  • Das Container-Image muss auf einem schreibgeschützten Dateisystem laufen können. Ihr Funktionscode kann auf ein beschreibbares /tmp-Verzeichnis mit einem Speicherplatz zwischen 512 MB bis 10 240 MB, in 1-MB-Schritten, zugreifen.

  • Der Lambda-Standardbenutzer muss in der Lage sein, alle Dateien zu lesen, die zum Ausführen Ihres Funktionscodes erforderlich sind. Lambda folgt den bewährten Methoden für die Sicherheit, indem es einen Standard-Linux-Benutzer mit den geringsten Berechtigungen definiert. Stellen Sie sicher, dass Ihr Anwendungscode nicht auf Dateien angewiesen ist, von denen andere Linux-Benutzer nicht ausgeführt werden können.

  • Lambda unterstützt nur Linux-basierte Container-Images.

  • Lambda bietet Multi-Architektur-Basis-Images. Das Image, das Sie für Ihre Funktion erstellen, muss jedoch nur auf eine der Architekturen abzielen. Lambda unterstützt keine Funktionen, die Container-Images mit mehreren Architekturen verwenden.

Ein AWS-Basis-Image für Lambda verwenden

Sie können eines der AWS-Basis-Images für Lambda verwenden, um das Container-Image für Ihren Funktionscode zu erstellen. Die Basis-Images sind mit einer Sprachlaufzeit und anderen Komponenten vorgeladen, die zum Ausführen eines Container-Images in Lambda erforderlich sind. Sie fügen Ihren Funktionscode und Ihre Abhängigkeiten dem Basis-Image hinzu und verpacken es dann als Container-Image.

AWS stellt regelmäßig Aktualisierungen der AWS-Basis-Images für Lambda bereit. Wenn Ihr Dockerfile den Image-Namen in der FROM-Eigenschaft enthält, ruft Ihr Docker-Client die aktuelle Version des Images aus dem Amazon-ECR-Repository ab.. Um das aktualisierte Basis-Image verwenden zu können, müssen Sie Ihr Container-Image neu erstellen und den Funktionscode aktualisieren.

Die Basis-Images Node.js 20, Python 3.12, Java 21, AL2023 und höher basieren auf dem minimalen Container-Image von Amazon Linux 2023. Frühere Basis-Images verwenden Amazon Linux 2. AL2023 bietet mehrere Vorteile gegenüber Amazon Linux 2, darunter einen geringeren Bereitstellungsaufwand und aktualisierte Versionen von Bibliotheken wie glibc.

AL2023-based Images verwenden microdnf (symmetrisch verknüpft als dnf) als Paketmanager anstelle von yum, was der Standardpaketmanager in Amazon Linux 2 ist. microdnf ist eine eigenständige Implementierung von dnf. Eine Liste der Pakete, die in AL2023-based Images enthalten sind, finden Sie in den Spalten Minimal Container unter Vergleich von Paketen, die auf Amazon Linux 2023 Container Images installiert sind. Weitere Informationen zu den Unterschieden zwischen AL2023 und Amazon Linux 2 finden Sie unter Introducing the Amazon Linux 2023 runtime for AWS Lambda im AWS Compute Blog.

Anmerkung

Um AL2023-based Images lokal auszuführen, einschließlich mit AWS Serverless Application Model (AWS SAM), müssen Sie Docker Version 20.10.10 oder höher verwenden.

Um ein Container-Image mithilfe eines AWS-Basis-Images zu erstellen, wählen Sie die Anweisungen für Ihre bevorzugte Sprache aus:

Verwenden eines reinen AWS-OS-Basis-Image

AWS-OS-Basis-Images enthalten eine Amazon-Linux-Distribution und den Laufzeitschnittstellen-Emulator. Diese Images werden häufig verwendet, um Container-Images für kompilierte Sprachen wie Go und Rust sowie für eine Sprache oder Sprachversion zu erstellen, für die Lambda kein Basis-Image bereitstellt, wie Node.js 19. Sie können reine OS-Basis-Images auch verwenden, um eine benutzerdefinierte Laufzeit zu implementieren. Um das Image mit Lambda kompatibel zu machen, müssen Sie den Laufzeitschnittstellen-Client für Ihre Sprache in das Image aufnehmen.

Tags Laufzeit Betriebssystem Dockerfile Ablehnung

al2023

Reine OS-Laufzeit Amazon Linux 2023 Dockerfile für reine OS-Laufzeit auf GitHub

al2

Reine OS-Laufzeit Amazon Linux 2 Dockerfile für reine OS-Laufzeit auf GitHub

Öffentliche Galerie der Registry von Amazon Elastic Container: gallery.ecr.aws/lambda/provided

Verwenden eines Nicht-AWS-Basis-Images

Lambda unterstützt jedes Image, das einem der folgenden Image-Manifestformate entspricht:

  • Docker Image Manifest V2 Schema 2 (mit Docker-Version 1.10 und neuer)

  • Open Container Initiative (OCI)-Spezifikationen (v1.0.0 und höher)

Lambda unterstützt eine maximale unkomprimierte Image-Größe von 10 GB, einschließlich aller Ebenen.

Anmerkung

Um das Image mit Lambda kompatibel zu machen, müssen Sie den Laufzeitschnittstellen-Client für Ihre Sprache in das Image aufnehmen.

Laufzeitschnittstellen-Clients

Wenn Sie ein reines OS-Basis-Image oder ein alternatives Basis-Image verwenden, müssen Sie den Laufzeitschnittstellen-Client in das Image einbinden. Der Laufzeitschnittstellen-Client muss die Lambda-Laufzeiten-API erweitern, die die Interaktion zwischen Lambda und Ihrem Funktionscode verwaltet. AWS stellt Open-Source-basierte Laufzeitschnittstellen-Clients für die folgenden Sprachen zur Verfügung:

Wenn Sie eine Sprache verwenden, die keinen von AWS bereitgestellten Laufzeitschnittstellen-Client hat, müssen Sie Ihren eigenen erstellen.

Amazon-ECR-Berechtigungen

Bevor Sie eine Lambda-Funktion aus einem Container-Image erstellen, müssen Sie das Image lokal erstellen und es in ein Amazon-ECR-Repository hochladen. Geben Sie beim Erstellen der Funktion den URI des Amazon-ECR-Repositorys an.

Stellen Sie sicher, dass die Berechtigungen für den Benutzer oder die Rolle, der bzw. die die Funktion erstellt, die von AWS verwalteten Richtlinien GetRepositoryPolicy und SetRepositoryPolicy enthalten.

Verwenden Sie beispielsweise die IAM-Konsole, um eine Rolle mit der folgenden Richtlinie zu erstellen:

{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "ecr:SetRepositoryPolicy", "ecr:GetRepositoryPolicy" ], "Resource": "arn:aws:ecr:us-east-1:111122223333:repository/hello-world" } ] }

Richtlinien für das Amazon-ECR-Repository

Für eine Funktion im selben Konto wie das Container-Image in Amazon ECR können Sie Ihrem Amazon-ECR-Repository die Berechtigungen ecr:BatchGetImage und ecr:GetDownloadUrlForLayer hinzufügen. Das folgende Beispiel zeigt die Mindestrichtlinie:

{ "Sid": "LambdaECRImageRetrievalPolicy", "Effect": "Allow", "Principal": { "Service": "lambda.amazonaws.com" }, "Action": [ "ecr:BatchGetImage", "ecr:GetDownloadUrlForLayer" ] }

Weitere Informationen zu Amazon-ECR-Repository-Berechtigungen finden Sie unter Private Repository-Richtlinien im Benutzerhandbuch zu Amazon Elastic Container Registry.

Wenn das Amazon ECR-Repository diese Berechtigungen nicht enthält, fügt Lambda ecr:BatchGetImage und ecr:GetDownloadUrlForLayer zu den Berechtigungen des Container-Image-Repositorys hinzu. Lambda kann diese Berechtigungen nur hinzufügen, wenn der Lambda aufrufende Prinzipal über ecr:getRepositoryPolicy- und ecr:setRepositoryPolicy-Berechtigungen verfügt.

Um Ihre Repository-Berechtigungen für Amazon ECR anzuzeigen oder zu bearbeiten, befolgen Sie die Anweisungen unter Festlegung einer privaten Repository-Richtlinienanweisung im Benutzerhandbuch zu Amazon Elastic Container Registry.

Kontoübergreifende Berechtigungen von Amazon ECR

Ein anderes Konto in derselben Region kann eine Funktion erstellen, die ein Container-Image verwendet, das Ihrem Konto gehört. Im folgenden Beispiel benötigt die Berechtigungsrichtlinie Ihres Amazon-ECR-Repository die folgenden Anweisungen, um den Zugriff auf Kontonummer 123456789012 zu gewähren.

  • CrossAccountPermission – Ermöglicht Konto 123456789012 das Erstellen und Aktualisieren von Lambda-Funktionen, die Images aus diesem ECR-Repository verwenden.

  • LambdaECRImageCrossAccountRetrievalPolicy – Lambda setzt den Status einer Funktion schließlich auf inaktiv, wenn sie über einen längeren Zeitraum nicht aufgerufen wird. Diese Anweisung ist erforderlich, damit Lambda das Container-Image zur Optimierung und Zwischenspeicherung im Namen der Funktion abrufen kann, die 123456789012 besitzt.

Beispiel – Ihrem Repository kontoübergreifende Berechtigungen hinzufügen
{ "Version": "2012-10-17", "Statement": [ { "Sid": "CrossAccountPermission", "Effect": "Allow", "Action": [ "ecr:BatchGetImage", "ecr:GetDownloadUrlForLayer" ], "Principal": { "AWS": "arn:aws:iam::123456789012:root" } }, { "Sid": "LambdaECRImageCrossAccountRetrievalPolicy", "Effect": "Allow", "Action": [ "ecr:BatchGetImage", "ecr:GetDownloadUrlForLayer" ], "Principal": { "Service": "lambda.amazonaws.com" }, "Condition": { "StringLike": { "aws:sourceARN": "arn:aws:lambda:us-east-1:123456789012:function:*" } } } ] }

Um den Zugriff auf mehrere Konten zu gewähren, fügen Sie die Konto-IDs der Liste der Prinzipalen in der CrossAccountPermission-Richtlinie hinzu sowie zur Bedingungs-Auswertungsliste der Bedingung in LambdaECRImageCrossAccountRetrievalPolicy.

Wenn Sie mit mehreren Konten in einer AWS-Organisation arbeiten, empfehlen wir Ihnen, jede Konto-ID in der ECR-Berechtigungsrichtlinie aufzuzählen. Dieser Ansatz steht im Einklang mit der bewährten Sicherheitsmethode von AWS zum Festlegen enger Berechtigungen in IAM-Richtlinien.

Container-Image-Einstellungen

Im Folgenden finden Sie allgemeine Container-Image-Einstellungen. Wenn Sie diese Einstellungen in Ihrem Dockerfile verwenden, beachten Sie, wie Lambda diese Einstellungen interpretiert und verarbeitet:

  • ENTRYPOINT – Gibt den absoluten Pfad zum Eintrittspunkt der Anwendung an.

  • CMD – Gibt zusätzliche Parameter an, die Sie mit ENTRYPOINT übergeben sollten.

  • WORKDIR – Gibt den absoluten Pfad zum Arbeitsverzeichnis an.

  • ENV – Gibt eine Umgebungsvariable für die Lambda-Funktion an.

Weitere Informationen darüber, wie Docker die Container-Image-Einstellungen verwendet, finden Sie unter ENTRYPOINT in der Dockerfile-Referenz auf der Docker Docs-Website. Weitere Informationen zur Verwendung von ENTRYPOINT und CMD finden Sie unter Entmystifizierung von ENTRYPOINT und CMD in Docker im AWS Open Source Blog.

Sie können die Einstellungen für Container-Images im Dockerfile angeben, wenn Sie Ihr Image erstellen. Sie können diese Konfigurationen auch mit der Lambda-Konsole oder Lambda-API überschreiben. Auf diese Weise können Sie mehrere Funktionen bereitstellen, die dasselbe Container-Image bereitstellen, jedoch mit unterschiedlichen Laufzeitkonfigurationen.

Warnung

Wenn Sie ENTRYPOINT oder CMD im Dockerfile oder als Überschreibung angeben, stellen Sie sicher, dass Sie den absoluten Pfad eingeben. Verwenden Sie auch keine Symlinks als Eintrittspunkt für den Container.

So überschreiben Sie die Konfigurationswerte im Container-Image
  1. Öffnen Sie die Seite Funktionen der Lambda-Konsole.

  2. Wählen Sie die zu aktualisierende Funktion aus.

  3. Wählen Sie unter Image configuration (Image-Konfiguration) die Option Edit (Bearbeiten) aus.

  4. Geben Sie neue Werte für eine der Überschreibungseinstellungen ein und wählen Sie dann Speichern aus.

  5. (Optional) Um Umgebungsvariablen hinzuzufügen oder zu überschreiben, wählen Sie unter Umgebungsvariablen die Option Bearbeiten aus.

Weitere Informationen finden Sie unter Verwenden von Lambda-Umgebungsvariablen.