View a markdown version of this page

Lazy-load immagini dei contenitori con Seekable OCI (SOCI) - AWS Lambda

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Lazy-load immagini dei contenitori con Seekable OCI (SOCI)

Per Lambda Event Functions distribuite come immagini contenitore su Lambda Managed Instances, Lambda scarica e decomprime l'immagine su ciascuna istanza prima di avviare un ambiente di esecuzione. Per le immagini di grandi dimensioni, questo intervallo di tempo rappresenta la maggior parte del tempo che intercorre tra la pubblicazione della versione o dello scaling out di una funzione e l'ambiente di esecuzione che ne gestisce la prima chiamata. Con Seekable OCI (SOCI), Lambda può avviare l'ambiente di esecuzione prima che l'intera immagine sia stata scaricata.

SOCI è un tecnologia open source sviluppato da AWS. Utilizza un indice che associa ogni file dell'immagine alla sua posizione nei livelli dell'immagine. Lambda utilizza l'indice per recuperare solo i file su richiesta mentre la funzione li legge, invece di scaricare e decomprimere l'immagine completa prima di avviare il contenitore. Le immagini dei contenitori in genere raggruppano ampi set di librerie e dipendenze, non tutte lette durante l'avvio o una singola chiamata. Il caricamento lento ne trae vantaggio recuperando solo ciò che la funzione legge effettivamente, riducendo il tempo necessario alla prima chiamata e rendendo il tempo di avvio molto meno sensibile alla dimensione totale dell'immagine. Il vantaggio è maggiore per le immagini di diversi gigabyte in cui la funzione legge solo un sottoinsieme del contenuto per chiamata, ad esempio le immagini che compongono i framework di machine learning.

Come funziona SOCI sulle istanze gestite Lambda

  1. Crei un indice SOCI per la tua immagine e lo invii ad Amazon ECR insieme all'immagine. Il risultato è un indice di immagini Open Container Initiative (OCI) che fa riferimento a due elementi: il manifesto dell'immagine originale e l'indice SOCI.

  2. Create o aggiornate la funzione con un URI di immagine che punta all'indice dell'immagine. Lambda rileva l'indice SOCI e abilita il lazy loading per gli ambienti di esecuzione di quella funzione. Non è necessario modificare nessun'altra configurazione della funzione.

  3. Lambda recupera i contenuti delle immagini su richiesta. I file letti dal codice di inizializzazione vengono recuperati durante l'inizializzazione. I file che il gestore legge per la prima volta vengono recuperati durante tale chiamata. Lambda non scarica il resto dell'immagine in background.

Nota

Se la funzione legge un file per la prima volta durante un'invocazione anziché durante l'inizializzazione, Lambda recupera quel file alla prima chiamata, il che aumenta la durata dell'invocazione. Per mantenere costanti le durate delle chiamate, importa tutte le librerie e leggi tutti i file necessari alla funzione nel codice di inizializzazione, non nel gestore. Consigliamo di testare la funzione con e senza SOCI per confrontare l'ora di avvio e la durata dell'invocazione per il carico di lavoro.

Crea un indice SOCI per la tua immagine

L'esempio seguente viene eseguito su Amazon Linux 2023. Installa lo snapshotter SOCI, containerd e nerdctl, quindi crea un indice SOCI per un'immagine esistente in Amazon ECR e invia il risultato. Sostituisci i valori segnaposto con i tuoi. Per altri modi per creare e inviare un indice SOCI, vedi Guida introduttiva allo snapshotter SOCI sul 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
Nota

Questo esempio crea un arm64 (AWS immagine Graviton). Lambda supporta solo immagini di contenitori ad architettura singola, quindi l'immagine deve essere indirizzata a un'unica architettura di set di istruzioni e --platform il valore deve corrispondere all'architettura della funzione. Per ulteriori informazioni, consulta Selezione e configurazione di un'architettura di set di istruzioni per la funzione Lambda.

Usa $REGISTRY/$REPOSITORY_NAME:$SOCI_IMAGE_TAG come URI dell'immagine quando crei o aggiorni la tua funzione. Quindi pubblica una versione della funzione. Lambda risolve la versione della funzione nell'indice dell'immagine e abilita il lazy loading.

Requisiti e limitazioni

Versione dell'indice SOCI

Lambda supporta solo SOCI Index Manifest v2 (tipo di supporto) application/vnd.amazon.soci.index.v2+json). Lambda non supporta gli indici SOCI Index Manifest v1. Il nerdctl image convert --soci il comando nella sezione precedente produce un indice v2.

Formato dell'indice delle immagini

L'indice delle immagini deve contenere esattamente due voci: l'indice SOCI e un manifesto di immagini OCI.

URI immagine

Punta l'URI dell'immagine della tua funzione verso SOCI-indexed tag (ad esempio, my-function:v1-soci), non sul tag originale dell'immagine. Lambda risolve la versione della funzione nell'indice dell'immagine. Per modificare l'immagine o l'indice, inserisci un nuovo SOCI-indexed tagga e aggiorna l'URI dell'immagine della funzione.

Disponibilità

SOCI è disponibile solo per le funzioni di immagine del contenitore in esecuzione su Lambda Managed Instances.