Tecnologie di isolamento Lambda
Lambda utilizza una varietà di tecnologie di isolamento open source e proprietarie per proteggere i Worker e gli ambienti di esecuzione. Ogni ambiente di esecuzione contiene una copia dedicata dei seguenti elementi:
-
Il codice della specifica versione della funzione
-
Qualsiasi livello AWS Lambda selezionato per la versione della tua funzione
-
Il runtime della funzione scelta (ad esempio, Java 11, NodeJS 12, Python 3.8 e così via) o il runtime personalizzato della funzione
-
Una directory /tmp scrivibile
-
Uno spazio utente
Linux minimo basato su Amazon Linux 2
Gli ambienti di esecuzione sono isolati l'uno dall'altro utilizzando diverse tecnologie simili a container integrate nel kernel Linux, insieme alle tecnologie di isolamento proprietarie di AWS. Queste tecnologie includono:
-
cgroups
: usati per limitare l'accesso della funzione alla CPU e alla memoria. -
namespaces
: ogni ambiente di esecuzione viene eseguito in uno spazio dei nomi dedicato. Tale obiettivo è raggiunto utilizzando ID di processo di gruppo, ID utente, interfacce di rete e altre risorse univoci gestiti dal kernel Linux. -
seccomp-bpf
: per limitare le chiamate di sistema (syscalls) che possono essere utilizzate dall'ambiente di esecuzione. -
iptables
e tabelle di routing : per impedire le comunicazioni di rete in ingresso e isolare le connessioni di rete tra MVM. -
chroot
: fornisce accesso con un ambito limitato al filesystem sottostante. -
Configurazione di Firecracker: utilizzata per limitare il throughput del dispositivo a blocchi e dei dispositivi di rete.
-
Funzionalità di sicurezza di Firecracker: per ulteriori informazioni sull'attuale progetto di sicurezza di Firecracker, consultare il documento di progettazione di Firecracker più recente
.
Insieme alle tecnologie di isolamento proprietarie di AWS, questi meccanismi forniscono un forte isolamento tra gli ambienti di esecuzione.
Archiviazione e stato
Gli ambienti di esecuzione non vengono mai riutilizzati tra diverse versioni di funzioni o clienti, ma un singolo ambiente può essere riutilizzato tra invocazioni della stessa versione di funzione. Ciò significa che i dati e lo stato possono persistere tra le invocazioni. I dati e/o lo stato possono continuare a persistere per ore prima di essere distrutti come parte della normale gestione del ciclo di vita dell'ambiente di esecuzione. Per motivi prestazionali, le funzioni possono trarre vantaggio da questo comportamento per migliorare l'efficienza mantenendo e riutilizzando cache locali o connessioni di lunga durata tra le chiamate. All'interno di un ambiente di esecuzione, queste invocazioni multiple sono gestite da un singolo processo quindi, se la chiamata si verifica in un ambiente di esecuzione riutilizzato, qualsiasi stato a livello di processo (come uno stato statico in Java) può essere disponibile per il riutilizzo nelle successive invocazioni.
Ogni ambiente di esecuzione Lambda include anche un filesystem scrivibile, disponibile a /tmp
. Questo spazio di archiviazione non è accessibile o condiviso tra gli ambienti di esecuzione. Come per lo stato del processo, i file scritti su /tmp
rimangono persistenti per tutta la vita dell'ambiente di esecuzione. Ciò consente di ammortizzare su più invocazioni costose operazioni di trasferimento, come il download di modelli di machine learning (ML). Le funzioni che non intendono mantenere i dati tra le invocazioni non devono scrivere su /tmp o devono cancellare i loro file da /tmp tra le invocazioni. La directory /tmp
è supportata da un archivio istanza Amazon EC2 ed è soggetto a crittografia dei dati a riposo.
Gli utenti che desiderano mantenere i dati nel file system al di fuori dell'ambiente di esecuzione dovrebbero prendere in considerazione l'utilizzo dell'integrazione di Lambda con Amazon Elastic File System
Se gli utenti non desiderano mantenere i dati o lo stato tra le chiamate, Lambda consiglia di non utilizzare il contesto di esecuzione o l'ambiente di esecuzione per archiviare dati o stato. Se gli utenti desiderano prevenire attivamente la fuga di dati o stato tra le chiamate, Lambda consiglia di creare funzioni distinte per ogni stato. Lambda non consiglia ai clienti di utilizzare o archiviare uno stato sensibile dal punto di vista della sicurezza nell'ambiente di esecuzione, in quanto potrebbe subire variazioni tra le invocazioni. Consigliamo invece di ricalcolare lo stato a ogni invocazione.