Technologien zur Lambda-Isolierung
Lambda verwendet eine Vielzahl von Open-Source- und proprietären Isolationstechnologien zum Schutz von Workern und Ausführungsumgebungen. Jede Ausführungsumgebung enthält eine dedizierte Kopie der folgenden Elemente:
-
Den Code der jeweiligen Funktionsversion.
-
Alle AWS-Lambda-Ebenen, die für Ihre Funktionsversion ausgewählt wurden.
-
Die gewählte Funktionslaufzeit (z. B. Java 11, NodeJS 12, Python 3.8 usw.) oder die benutzerdefinierte Laufzeit der Funktion.
-
Ein beschreibbares /tmp-Verzeichnis.
-
Einen minimalen Linux-Benutzerraum
basierend auf Amazon Linux 2 .
Ausführungsumgebungen werden durch mehrere Container-ähnliche Technologien, die in den Linux-Kernel integriert sind, zusammen mit proprietären AWS-Isolationstechnologien voneinander isoliert. Zu diesen Technologien gehören:
-
cgroups
– Wird verwendet, um den Zugriff der Funktion auf CPU und Speicher zu beschränken. -
Namespaces
– Jede Ausführungsumgebung wird in einem dedizierten Namespace ausgeführt. Dazu haben wir eindeutige Gruppen-Prozess-IDs, Benutzer-IDs, Netzwerkschnittstellen und andere Ressourcen, die vom Linux-Kernel verwaltet werden. -
seccomp-bpf
– Beschränkt die Systemaufrufe (Syscalls), die innerhalb der Ausführungsumgebung verwendet werden können. -
iptables
und Routingtabellen – Zum Verhindern von eingehenden Netzwerkkommunikation und dem Isolieren von Netzwerkverbindungen zwischen MVMs. -
chroot
– Bietet Bereichszugriff auf das zugrunde liegende Dateisystem. -
Firecracker-Konfiguration – Wird verwendet, um den Durchsatz von Blockgeräten und Netzwerkgeräten zu begrenzen.
-
Firecracker-Sicherheitsfunktionen – Weitere Informationen zum aktuellen Sicherheitsdesign von Firecracker finden Sie im neuesten Designdokument von Firecracker
.
Zusammen mit den proprietären AWS-Isolationstechnologien bieten diese Mechanismen eine starke Isolierung zwischen Ausführungsumgebungen.
Speicherung und Status
Ausführungsumgebungen werden niemals über verschiedene Funktionsversionen oder Kunden hinweg wiederverwendet, aber eine einzelne Umgebung kann von Aufrufen derselben Funktionsversion wiederverwendet werden. Das bedeutet, dass Daten und Status zwischen Aufrufen bestehen bleiben können. Daten und/oder Status können stundenlang bestehen bleiben, bevor sie im Rahmen des normalen Lebenszyklusmanagements der Ausführungsumgebung zerstört werden. Aus Leistungsgründen können Funktionen dieses Verhalten nutzen, um die Effizienz zu verbessern, indem sie lokale Caches oder langlebige Verbindungen zwischen Aufrufen behalten und wiederverwenden. In einer Ausführungsumgebung werden diese Mehrfachaufrufe von einem einzigen Prozess verarbeitet, sodass jeder prozessweite Status (z. B. ein statischer Zustand in Java) für zukünftige Aufrufe zur Wiederverwendung verfügbar sein kann, wenn der Aufruf in einer wiederverwendeten Ausführungsumgebung erfolgt.
Jede Lambda-Ausführungsumgebung enthält auch ein beschreibbares Dateisystem, verfügbar unter /tmp
. Dieser Speicher ist nicht über Ausführungsumgebungen hinweg zugänglich oder wird nicht gemeinsam genutzt. Wie beim Prozessstatus bleiben die Daten, die in /tmp
geschrieben werden, für die gesamte Lebensdauer der Ausführungsumgebung erhalten. Auf diese Weise können teure Übertragungsvorgänge, wie das Herunterladen von Modellen für Machine Learning (ML), über mehrere Aufrufe hinweg amortisiert werden. Funktionen, die keine Daten zwischen Aufrufen beibehalten wollen, sollten entweder nicht in /tmp schreiben oder ihre Dateien zwischen Aufrufen aus /tmp löschen. Das /tmp
-Verzeichnis wird von einem Amazon-EC2-Instance-Speicher unterstützt und im Speicher verschlüsselt.
Kunden, die Daten außerhalb der Ausführungsumgebung im Dateisystem speichern möchten, sollten die Lambda-Integration mit dem Amazon Elastic File System
Wenn Kunden Daten oder Status nicht über Aufrufe hinweg behalten möchten, empfiehlt Lambda, den Ausführungskontext oder die Ausführungsumgebung nicht zum Speichern von Daten oder Status zu verwenden. Wenn Kunden aktiv verhindern möchten, dass Daten oder Status über Aufrufe hinweg verloren gehen, empfiehlt Lambda, für jeden Status eigene Funktionen zu erstellen. Lambda empfiehlt Kunden nicht, den sicherheitsempfindlichen Status in der Ausführungsumgebung zu verwenden oder zu speichern, da er zwischen Aufrufen mutieren kann. Wir empfehlen stattdessen, den Status bei jedem Aufruf neu zu berechnen.